大家好,我是讯享网,很高兴认识大家。
坐标系分类
第一分类
1、
GPS,WGS-84,原坐标系。国际标准GPS记录仪记录的坐标都是GPS坐标。可惜在中国,没有一款地图产品允许使用GPS坐标,据说是保密的。
2、
GCJ-02,中国国家测量局2002年发布的坐标系。又称“火星坐标”。在中国,至少必须使用GCJ-02坐标系。比如谷歌、腾讯、高德都在用这个坐标系。GCJ-02也是国内使用最广泛的坐标系。
3。其他坐标系。一般用GCJ-02的偏移算法得到。这个体系每个公司不一样,坐标系也不一样。例如,百度和搜狗使用自己的坐标系,这与其他坐标系不兼容。
第二分类
首先明白所有坐标系的原点都是非洲。
1.纬度和经度。这是球面坐标,对于北京是(116.8817139.935961)。例如,腾讯、高德和百度都有这样的经纬度坐标。就是Google的经纬度顺序反过来写的经纬度坐标。
如果是度、分、秒的坐标,就需要转换得到这样的经纬度坐标。详见坐标变换。
2.墨卡托坐标。平面坐标,相当于一条直线的距离,一般都是大数,像这样。(21330 . 633333333335
墨卡托坐标,主要用于程序的后台计算。直线距离,加减乘除几乎很容易计算。
搜狗的地图API是直接使用的墨卡托坐标。
经纬度转换工具类
静态双pi = 3.14159265358979324静态双a = 6378245.0静态双ee = 0.00669342162296594323public final静态double x _ pi = pi * 3000.0/180.0;/* * *高德的经纬度换算成百度的经纬度*/public static double[]GCJ2BD(double lat,double lon){ double z = math . sqrt(lon * lon+lat * lat)+0.0002 * math . sin(lat * x _ pi);double theta = Math.atan2(lat,lon)+0.000003 * math . cos(lon * x _ pi);double BD _ lon = z * math . cos(theta)+0.0065;double BD _ lat = z * math . sin(theta)+0.006;返回new double[] { bd_lat,BD _ lon };}/* * *百度经纬度转高德*/公静态double [] BD2GCJ (double lat,double lon) {double x = lon-0.0065,y = lat-0.006;double z = math . sqrt(x * x+y * y)-0.00002 * math . sin(y * x _ pi);double theta = Math.atan2(y,x)-0.000003 * math . cos(x * x _ pi);double gg _ lon = z * math . cos(theta);double gg _ lat = z * math . sin(theta);返回new double[] { gg_lat,gg _ lon };}/* * *国标经纬度将改为高德经纬度*/公静态double [] WGS2 GCJ (double lat,double lon){ double dlat = transform lat(lon-105.0,lat-35.0);double dLon = transform lon(lon-105.0,lat-35.0);double rad lat = lat/180.0 * pi;双魔= math . sin(rad lat);魔力= 1 – ee *魔力*魔力;double sqrt magic = math . sqrt(magic);dLat =(dLat * 180.0)/((a *(1-ee))/(magic * sqrtMagic)* pi);dLon =(dLon * 180.0)/(a/sqrtMagic * math . cos(rad lat)* pi);double mgLat = lat+dLat;双mgLon = lon+dLon;return new double[]{ mgLat,mgLon };}/* * *高德去GPS */public static double[]gcj 2 wgc(double lat,double lon){ double dlat = transform lat(lon-105.0,lat-35.0);double dLon = transform lon(lon-105.0,lat-35.0);double rad lat = lat/180.0 * pi;双魔= math . sin(rad lat);魔力= 1 – ee *魔力*魔力;double sqrt magic = math . sqrt(magic);dLat =(dLat * 180.0)/((a *(1-ee))/(magic * sqrtMagic)* pi);dLon =(dLon * 180.0)/(a/sqrtMagic * math . cos(rad lat)* pi);double mgLat = lat+dLat;双mgLon = lon+dLon;double lontitude = lon * 2-mgLon;双纬度= lat * 2-mg lat;return new double[]{latitude,lontitude };}/* * *国标到百度*/公静态double [] wgs2bd (double lat,double lon){ double[]WGS 2g CJ = WGS 2g CJ(lat,lon);返回gcj2bd(wgs2gcj[0],WGS 2g CJ[1]);}/* * *经纬度转换*/private static double transform lat(double lat,double lon){ double ret =-100.0+2.0 * lat+3.0 * lon+0.2 * lon * lon+0.1 * lat * lon+0.2 * math . sqrt(math ret = getRet(lat,lon,ret);ret+=(160.0 * math . sin(lon/12.0 * pi)+320 * math . sin(lon * pi/30.0))* 2.0/3.0;返回ret} private static double getRet(double lat,double lon,double ret){ ret+=(20.0 * math . sin(6.0 * lat * pi)+20.0 * math . sin(2.0 * lat * pi))* 2.0/3.0;ret+=(20.0 * math . sin(lon * pi)+40.0 * math . sin(lon/3.0 * pi))* 2.0/3.0;返回ret}私有静态double transformLon(double lat,double lon){ double ret = 300.0+lat+2.0 * lon+0.1 * lat * lat+0.1 * lat * lon+0.1 * math . sqrt(math . ABS(lat));ret = getRet(lat,lat,ret);ret+=(150.0 * math . sin(lat/12.0 * pi)+300.0 * math . sin(lat/30.0 * pi))* 2.0/3.0;返回ret}PS:因为经纬度是卫星采集的,所以经纬度是室内采集不到的。而且即使站在一个点上移动,经纬度也是飘忽不定的,允许误差在10米左右。
软硬件结合时,经纬度分类要提前沟通。比如软件使用的是高德坐标,而硬件获取的是其他坐标系或者安卓原生坐标,尤其是后者经过转换后仍然不属于任何一种坐标,所以尽量避免安卓原生坐标的硬件传输,可以通过相关地图进行转换,比如高德的sdk。
创造起来并不容易。如果这篇文章对你有用,请点赞,谢谢(ω)!
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/6792.html