Android中GPS坐标转换为高德地图坐标详解
一、坐标分类
地图坐标大致分为几种:
1、GPS、WGS84,也就是原始坐标体系,这是国际公认的世界标准坐标体系;
2、GCJ-02,又称为“火星坐标”,国家测绘局在02年发布的坐标体系,在国内,至少得使用此坐标体系,比如:google、高德、腾讯地图等;
3、其他特殊坐标体系,一般都是由火星坐标通过偏移算法计算得出的,比如百度使用的是BD-09坐标,搜狗使用的是自己的搜狗坐标。
二、坐标转换
1、使用高德地图sdk转换
publicAMapLocationfromGpsToAmap(Locationlocation){ AMapLocationaMapLocation=newAMapLocation(location); CoordinateConverterconverter=newCoordinateConverter(mContext); converter.from(CoordinateConverter.CoordType.GPS); try{ converter.coord(newDPoint(location.getLatitude(),location.getLongitude())); DPointdesLatLng=converter.convert(); aMapLocation.setLatitude(desLatLng.getLatitude()); aMapLocation.setLongitude(desLatLng.getLongitude()); }catch(Exceptione){ e.printStackTrace(); } returnaMapLocation; }
但是在我的项目里面,当使用上面方法的高德地图版本的jar包后,编译的时候友盟总是提示我有包冲突,但是经历无数的寻找,都没找出冲突的地方,当我把友盟统计的包引用去掉,编译正常与行了。这里我被友盟坑了,但是必须要保留友盟统计。我只能放弃新的定位包,使用老版本的,也就不能用上面这个方式了。
2、自己转换
通过在网上的搜索,找到一篇文章http://www.eoeandroid.com/forum.php?mod=viewthread&tid=332419,能很好的解决我的问题,也就是我们自己转换坐标,方法如下。
publicAMapLocationfromGpsToAmap(Locationlocation){ LatLnglatLng=newLatLng(location.getLatitude(),location.getLongitude()); latLng=CoordinateUtil.transformFromWGSToGCJ(latLng); AMapLocationaMapLocation=newAMapLocation(location); aMapLocation.setLatitude(latLng.latitude); aMapLocation.setLongitude(latLng.longitude); returnaMapLocation; }
CoordinateUtil.java
publicclassCoordinateUtil{ privatestaticdoublea=6378245.0; privatestaticdoubleee=0.00669342162296594323; /** *手机GPS坐标转火星坐标 * *@paramwgLoc *@return */ publicstaticLatLngtransformFromWGSToGCJ(LatLngwgLoc){ //如果在国外,则默认不进行转换 if(outOfChina(wgLoc.latitude,wgLoc.longitude)){ returnnewLatLng(wgLoc.latitude,wgLoc.longitude); } doubledLat=transformLat(wgLoc.longitude-105.0, wgLoc.latitude-35.0); doubledLon=transformLon(wgLoc.longitude-105.0, wgLoc.latitude-35.0); doubleradLat=wgLoc.latitude/180.0*Math.PI; doublemagic=Math.sin(radLat); magic=1-ee*magic*magic; doublesqrtMagic=Math.sqrt(magic); dLat=(dLat*180.0)/((a*(1-ee))/(magic*sqrtMagic)*Math.PI); dLon=(dLon*180.0)/(a/sqrtMagic*Math.cos(radLat)*Math.PI); returnnewLatLng(wgLoc.latitude+dLat,wgLoc.longitude+dLon); } publicstaticdoubletransformLat(doublex,doubley){ doubleret=-100.0+2.0*x+3.0*y+0.2*y*y+0.1*x*y +0.2*Math.sqrt(x>0?x:-x); ret+=(20.0*Math.sin(6.0*x*Math.PI)+20.0*Math.sin(2.0*x *Math.PI))*2.0/3.0; ret+=(20.0*Math.sin(y*Math.PI)+40.0*Math.sin(y/3.0 *Math.PI))*2.0/3.0; ret+=(160.0*Math.sin(y/12.0*Math.PI)+320*Math.sin(y *Math.PI/30.0))*2.0/3.0; returnret; } publicstaticdoubletransformLon(doublex,doubley){ doubleret=300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1 *Math.sqrt(x>0?x:-x); ret+=(20.0*Math.sin(6.0*x*Math.PI)+20.0*Math.sin(2.0*x *Math.PI))*2.0/3.0; ret+=(20.0*Math.sin(x*Math.PI)+40.0*Math.sin(x/3.0 *Math.PI))*2.0/3.0; ret+=(150.0*Math.sin(x/12.0*Math.PI)+300.0*Math.sin(x /30.0*Math.PI))*2.0/3.0; returnret; } publicstaticbooleanoutOfChina(doublelat,doublelon){ if(lon<72.004||lon>137.8347) returntrue; if(lat<0.8293||lat>55.8271) returntrue; returnfalse; } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。