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;
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。