这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
常用坐标系
在开发中主要使用到两种坐标系,一种是4326地理坐标系,一种是3857投影坐标系。可能官方定义大家都已经看过很多遍了,但是理解起来就没那么容易,还需要结合经验被反复熏陶。
个人对他的理解最大的不同就是单位。4326的单位为度,3857单位为米。这也是开发过程中需要经常做转换的原因。
坐标定义
再来被熏陶一次
EPSG:4326
一个地理坐标系(也叫大地坐标系),用于描述WGS84坐标系,其是从1984年开始在GPS中使用的全球地理坐标系统;也就是通常说的经纬度坐标;
该坐标系是大地坐标系(Geodectic coordinate system),单位是度(角度单位),角度用来测量长度和面积是不合适的(尺子不好用啊),但可用于定位,而且它的范围又覆盖了全球,所以很适合全球定位(GPS卫星定位的坐标系用的就是它)
EPSG:3857
EPSG:3857是一个投影坐标系(Projected coordinate system),在WGS84坐标系基础上进行了伪墨卡托投影(Pseudo-Mercator)。球形墨卡托地图、谷歌地图、osm地图、bing地图、ArcGIS、ESRI会常用该坐标系。
投影坐标系(Projected coordinate system)是在大地坐标系(Geodectic coordinate system)的基础上,经过数学运算,把大地坐标系的曲面坐标映射到平面上产生的一种平面坐标系。
虽然EPSG:3857是平面坐标系,单位是长度(米),但是他用了一个长度和面积都不靠谱的投影坐标系:Pseudo-Mercator(伪墨卡托投影,该投影是正轴等角切圆柱投影,在高纬度地区形变的非常严重)。原来高德地图和谷歌地图上面画的东东都是变形的!!没错,就是变形的,你看到的这些互联网地图用的都是类似的投影,他们在高纬度地区都是拉伸严重的,远比他的实地面积要大。但是正轴墨卡托投影有个优点:投影后角度不变形,所以用来导航和定位非常合适。
坐标点距离计算
涉及坐标计算的地理问题都可以转为数学问题,计算两个点之间的距离,可以用三角函数勾股定理计算
function distance(coord1,coord2){
const dis=Math.sqrt(Math.pow(coord1._x-coord2._x,2)+Math.pow(coord1._y-coord2._y,2));
}
坐标转换
通常计算两个点之前的距离的结果单位为米时,需要先把经纬度转为投影坐标,再去计算两点之间的距离。
经纬度坐标转为投影坐标(4326——>3857)
function lonLat2Mercator(lonlat){
var mercator = { x:0, y:0 };
var earthRad = 6378137.0;
mercator.x = lonlat.lng * Math.PI / 180 * earthRad;
var a = lonlat.lat * Math.PI / 180;
mercator.y = earthRad / 2 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));
return mercator;
}
投影坐标转经纬度坐标(3857——>4326)
function mercatorTolonlat(mercator){
var lonlat={
x:0,
y:0
};
var x = mercator.x/20037508.34*180;
var y = mercator.y/20037508.34*180;
y= 180/Math.PI*(2*Math.atan(Math.exp(y*Math.PI/180))-Math.PI/2);
lonlat.x = x;
lonlat.y = y;
return lonlat;
}
总结
坐标系的转换其实有很多工具可用,引擎一般也会自带方法。这篇文章主要通过地图坐标转为数学运算来帮助大家更好的理解不同的坐标系。