通过地理编码API获取的坐标是火星坐标转wgs84吗

27272人阅读
地图相关(1)
& & & & &标准地球坐标即GPS设备获得的坐标,该坐标需要经过国家测绘局进行加密后形成火星坐标(WGS-84 ),我们用的google坐标和高德地图坐标也就是火星坐标
& & & & &百度地图,在火星坐标的基础上再进行一次加密,形成了百度地图上的坐标,因此,直接将标准地球坐标显示在百度地图上是会有几百米的偏差的。按照此原理,标准GPS坐标经过两步的转换可得到百度坐标。因为在处理百度地图时,例如查询其POI都需要百度地图上的坐标,而不是标准坐标,那么这样的转换就是必要的了。下面是两步转换的C++ 程序,供开发的人做一个参考。
//============================================================================
: Convert_cpp.cpp
// Version
// Copyright
: Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include &iostream&
#include &math.h&
#include &stdlib.h&
#include &iomanip&
const double pi = 3.79324;
const double a = ;
const double ee = 0.;
double x_pi = 3.79324 * 3000.0 / 180.0;
bool outOfChina(double lat, double lon)
if (lon & 72.004 || lon & 137.8347)
if (lat & 0.8293 || lat & 55.8271)
double transformLat(double x, double y)
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));
ret += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * sin(y * pi) + 40.0 * sin(y / 3.0 * pi)) * 2.0 / 3.0;
ret += (160.0 * sin(y / 12.0 * pi) + 320 * sin(y * pi / 30.0)) * 2.0 / 3.0;
double transformLon(double x, double y)
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));
ret += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * sin(x * pi) + 40.0 * sin(x / 3.0 * pi)) * 2.0 / 3.0;
ret += (150.0 * sin(x / 12.0 * pi) + 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0;
* 地球坐标转换为火星坐标
* World Geodetic System ==& Mars Geodetic System
* @param wgLat
* @param wgLon
* mglat,mglon 火星坐标
void transform2Mars(double wgLat, double wgLon,double &mgLat,double &mgLon)
if (outOfChina(wgLat, wgLon))
mgLon = wgL
double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
double radLat = wgLat / 180.0 *
double magic = sin(radLat);
magic = 1 - ee * magic *
double sqrtMagic = sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi);
mgLat = wgLat + dL
mgLon = wgLon + dL
* 火星坐标转换为百度坐标
* @param gg_lat
* @param gg_lon
void bd_encrypt(double gg_lat, double gg_lon,double &bd_lat,double & bd_lon)
double x = gg_lon, y = gg_
double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);
bd_lon = z * cos(theta) + 0.0065;
bd_lat = z * sin(theta) + 0.006;
* 百度转火星
* @param bd_lat
* @param bd_lon
void bd_decrypt(double bd_lat, double bd_lon,double &gg_lat,double &gg_lon)
double x = bd_lon - 0.0065, y = bd_lat - 0.006;
double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);
double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
gg_lon = z * cos(theta);
gg_lat = z * sin(theta);
int main() {
double lat = 30.227607;
double lon = 120.036565;
//真实的经纬度转化为百度地图上的经纬度,便于计算百度POI
double marsLat = 0;
double marsLon = 0;
double resultLat = 0;
double resultLon = 0;
transform2Mars(lat,lon,marsLat,marsLon);
bd_encrypt(marsLat,marsLon,resultLat,resultLon);
//30..0348264
cout&&setprecision(10)&&resultLat&&& &&&setprecision(10)&&resultLon&&
& & & & &在自己的项目中,将标准GPS转换为百度坐标后,再获取百度地图的POI,获得的POI位置和真实的位置基本一致,可以使用。下面还有一些网上转载的资料,比较丰富,值得一看。
-----------------------------------------------------------------------------------------------------
GCJ-02坐标系统(火星坐标)简介:(存档:)
GCJ-02到真实坐标反向变换的理论基础:
WGS84坐标与Web墨卡托坐标互转:
地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法:
C#代码:(注解:)Java代码:iOS代码:(存档:)
火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法:(解释:国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。)
一种根据纠偏数据对火星坐标进行完美拟合的方法:
国内各地图API坐标系统比较:
关于百度地图坐标转换接口的研究:
查询过资料可得,通过程序进行 标准坐标转火星坐标(google、高德),火星坐标转百度坐标,百度坐标转火星坐标,百度坐标转标准坐标都是可行的,火星直接转标准坐标转不了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:162255次
积分:1839
积分:1839
排名:第17360名
原创:37篇
转载:35篇
评论:21条
(1)(5)(1)(3)(3)(5)(1)(10)(12)(6)(4)(5)(1)(1)(2)(12)在开始这个题目之前,先给大家再次扫扫盲,扫的不是坐标系统的盲,而是我们国家所使用的坐标系统。大家都知道,美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际共识。但在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,我们在业内将前者称之为地球坐标,后者称之为火星坐标,具体的说明可以参看百度百科中关于火星坐标系统的解释。
1.国内各地图API坐标系统比较
参考/labs/map-compare/
百度地图API
腾讯搜搜地图API
搜狐搜狗地图API
阿里云地图API
图吧MapBar地图API
高德MapABC地图API
灵图51ditu地图API
2.下面是百度官方对百度坐标为何有偏移的解释
  国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。
3.火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
GCJ-02(火星坐标) 和 BD-09 (百度坐标)
算法代码如下,其中 bd_encrypt 将 GCJ-02 坐标转换成 BD-09 坐标, bd_decrypt 反之。
void bd_encrypt(double gg_lat, double gg_lon, double &bd_lat, double &bd_lon)
& & double x = gg_lon, y = gg_
& & double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
& & double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);
& & bd_lon = z * cos(theta) + 0.0065;
& & bd_lat = z * sin(theta) + 0.006;
void bd_decrypt(double bd_lat, double bd_lon, double &gg_lat, double &gg_lon)
& & double x = bd_lon - 0.0065, y = bd_lat - 0.006;
& & double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);
& & double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
& & gg_lon = z * cos(theta);
& & gg_lat = z * sin(theta);
4.地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法
WGS-84 到 GCJ-02 的转换(即 GPS 加偏)算法是一个普通青年轻易无法接触到的“公开”的秘密。这个算法的代码在互联网上是公开的,详情请使用 Google 搜索 &wgtochina_lb& 。
整理后的算法代码请参考 /SourceControl/changeset/view/ 。知道了这个算法之后,就可以离线进行 Google 地图偏移校正,不必像之前那么麻烦。
至于 GCJ-02 到 WGS-84 的转换(即 GPS 纠偏),可以使用二分法。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:493次
排名:千里之外后使用快捷导航没有帐号?
暂时没有人问过相似的问题,你可以做第一个提问题的人
查看: 6080|回复: 9
Geocoding API v2.0 7.逆地理编码
解析不到地址的概率极高
比如如下坐标,到百度地图拾取坐标系统查询, 属于市区道路,但是逆解析根本获取不到中文信息。那么我如何判断,哪些坐标是可以正常解析,哪些是不可以正常解析的呢??急问,多谢
116..897445 地址:北京市丰台区马连道北路&&
{
status: 0
-result: {
-location: {
lng: 39.
lat: 74.
}
formatted_address: &&
business: &&
-addressComponent: {
city: &&
district: &&
province: &&
street: &&
street_number: &&
}
cityCode: 0
}
}复制代码
解析不到的话,location对象是空的,可以利用这个判断。
coralreef1217
我反馈的主要是坐标逆向地址的不可靠性,因为app有场景是通过坐标获取用户所在城市、商圈这些。 如果解析接口不可靠,功能有替代的方案么?? 多谢回复
http://api./geocoder/v2/?ak=您的密钥&callback=renderReverse&location=39..322987&output=json&pois=0坐标:(116.,39.)对应的地址是: 北京市丰台区北京西站南路
你给出的例子是有结果的。能否发下反geo不出来的case,我们排查下?
coralreef1217
& &这个case 116..897445&&就查不到结果数据的。 帖子里面提到的地址。 麻烦核查一下哦
geo.jpg (38.62 KB, 下载次数: 0)
16:18 上传
& &你给的这个地址是可以解析到地址的啊。 另外,让我审核什么呢?没看明白。
本帖最后由 亲友圈 于
16:15 编辑
coralreef1217
我去。。找了这么久终于发现你们接口的bug了。
大部分接口,包括地图,输出的经纬度是:[location:113..549922]
而geocoderv2这个接口,参数恰恰是反着来的!!也就是为什么我总查不到数据 了。&&接口层面至少要统一顺序把。
22..940585&output=json&pois=0
不是吧,参数你都没有看清楚啊?
coralreef1217
这么大一个B厂,接口参数总得统一把。。 一会数组,一会经纬字符串,一会维经字符串, 客户端来回倒腾的够呛。
翻遍整个api,只有这个接口是维经字符串
我也是调用这个 逆地址解析 传入坐标基本解析不出来具体的地址
而且我的坐标还是利用百度提供的坐标拾取器生成的坐标(拾取的武汉市的坐标)。希望帮忙看看;
Powered by

我要回帖

更多关于 火星坐标转百度坐标 的文章

 

随机推荐