美文网首页开源
openlayers实现画圆(坐标:EPSG:4326,单位:米

openlayers实现画圆(坐标:EPSG:4326,单位:米

作者: 5b5acd3466f3 | 来源:发表于2018-12-18 11:20 被阅读4次

        最近做电子围栏的功能,锚定范围为圆,单位为米。该功能基于openlayers v4.1.1,做的过程中,我发现里面有一些比较容易让人迷惑的地方,在这里记录下~

        首先我们得搞清楚坐标系。把一个不规则的球体变成二维的平面图可不是一件简单的事。为了在平面上描述我们的位置,前辈给出了两个定义:地理坐标系和投影坐标系。

        简单来说,地理坐标系是用一些参数来描述地球这个圆球的坐标,可以简单想象下篮球上面的线条;而投影坐标系是将这个球投射至二维平面。

        在我的项目中,我是使用的坐标系为EPSG:4326,所以先来了解一下EPSG:4326和EPSG:3857两个坐标系。

EPSG:4326(又名WGS84,未投影)是一个地理的非项目坐标系。它的单位是我们平时经常用的经纬度。EPSG:4326无法在平面地图上以有意义的方式显示。

EPSG:3857(又名Pseudo-Mercator,球形墨卡托或Web墨卡托)是投影坐标系。它的单位是米。它将WGS84球体的坐标投影至二维平面图,是Google Maps和几乎所有其他Web制图应用程序使用的坐标系。

        所以,当我们在EPSG:4326坐标系中使用new ol.geom.Circle(center, radius)来创建一个圆时,500米将被绘制为500°  (⊙o⊙)...orz…  那整个地图都被这个圆覆盖了。那这时聪明的你也知道了,只需要把坐标系转换成EPSG:3857就可以画以米为单位的圆啦~ 当然,还有另一种方法:

new ol.geom.Polygon.circular(new ol.Sphere(6378137), center, radius, 64);

        其中,new ol.Sphere(6378137)是指一个半径为6378137米的球体(好像说了句废话...),在openlayers的源码里我们可以看到它用这样一个不对外开放的常量来描述WGS84球体。

64是指绘制的这个环形需要多少边,绘制出来的结果如下,虽然看着不怎么圆~

BTW:如何在任何坐标系中,获取两个坐标距离呢(单位:米)?

let coord1 =ol.proj.transform(coordinates1, sourceProj, 'EPSG:4326');

let coord2 =ol.proj.transform(coordinates2, sourceProj, 'EPSG:4326'); //先将经纬度转换成在EPSG:4326 下的坐标

wgs84Sphere.haversineDistance(coord1, coord2);//再根据wgs84球体算出多少米

参考网站:

1、4326与3857坐标的区别:http://lyzidiamond.com/posts/4326-vs-3857

相关文章

网友评论

    本文标题:openlayers实现画圆(坐标:EPSG:4326,单位:米

    本文链接:https://www.haomeiwen.com/subject/kldkkqtx.html