地图中的坐标系(转)

add by zhj:

对于国内的地图,使用的是GCJ-02坐标系或者在GCJ-02基础上再加密(比如百度坐标和搜狗坐标),出于安全的考虑,国家不允许直接使用GPS坐标。GCJ-02坐标系又

称为火星坐标系。

地图公司测绘得到原始的GPS地图后,要上交给国家熊测绘局,测绘局给GPS坐标加上偏移(不是线性偏移),得到GCJ-02坐标,测绘局要收钱的,然后再交给地图公司。

地图公司可以直接发行或者再做一次偏移后发行。一般的偏移是在几百米,对于精度要求不高的定位,这个误差无所谓。

国内销售的GPS设备输出的也都是经过GCJ-02偏移过的坐标(这个地方有待确认),这样使用国内的地图时,才可以查询出正确的位置。

其实,对于GCJ-02没法欺骗军方的,军用GPS的定位精度可达厘米级,GCJ-02应该对其无计可施。

原本GPS使用的坐标系是WGS-84坐标系,这是美国人定义的坐标系,Google Earch使用的是卫星地图,卫星地图就是GPS输出的WGX-84坐标系。中国的GPS设备的输出

都经过了加密,即GCJ-02坐标系。

腾讯地图,高德地图使用的是GCJ-02坐标系

百度地图使用的是在GCJ-02基础上再加密得到的百度坐标

原文:https://segmentfault.com/a/1190000000498434

一、坐标体系
首先我们要明白,开发者能接触到哪些坐标体系呢?
第一种分类:
1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:

2、 GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。
3、 其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。

第二种分类:
首先明白,所有坐标体系的原点,都是非洲。

1、 经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。
如果是度分秒坐标,需要进行转换,才能得到这样的经纬度坐标。详见坐标转换。
2、 墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192)
墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。
搜狗地图API就是直接使用的墨卡托坐标。

二、坐标转换
在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。
比如,你在谷歌地图API,高德地图API,腾讯地图API上取到的,都是GCJ-02坐标,他们三家都是通用的,也适用于大部分地图API产品,以及他们的地图产品。
例外,百度API上取到的,是BD-09坐标,只适用于百度地图相关产品。
例外,搜狗API上取到的,是搜狗坐标,只适用于搜狗地图相关产品。
例外,谷歌地球,google earth上取到的,是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不允许使用。必须转换为GCJ-02坐标。

1、度分秒坐标转换为经纬度
比如,在GPS记录仪,或者google earth上采集到的是39°31‘20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。

2、 GPS转换为GCJ-02坐标
谷歌,高德,腾讯的地图API官网上,都不直接提供这样的坐标转换。如果要得到GCJ-02坐标,最好在他们的地图上直接取点,或者通过地址解析得到。(这个工具我后续会贴出来的。我就爱干这样的事情,哈哈。)

不过,在网上搜到了这样的接口,该接口的type=1就是GPS转到GCJ-02的墨卡托坐标。请大家对接口保密,哈哈。详见:
http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro

3、GCJ-02与BD-09之间互转
国测局GCJ-02坐标体系(谷歌、高德、腾讯),与百度坐标BD-09体系的转换,在CSDN上有很详细的讲解:
http://blog.csdn.net/coolypf/article/details/8569813

不过也有更简单的算法,线性算法(lat和lng是经纬度,球面坐标):
To_B是转到百度,To_G是转到GCJ-02。
var TO_BLNG = function(lng){return lng+0.0065;};
var TO_BLAT = function(lat){return lat+0.0060;};
var TO_GLNG = function(lng){return lng-0.0065;};
var TO_GLAT = function(lat){return lat-0.0060;};

4、经纬纬度转成墨卡托
网上也有详细讲解:
http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245

5、各家API公司坐标转换接口的申请
一般需要将您的公司名称、项目名称、项目简介、联系人和联系方式,发邮件至地图API公司的商务部,经过申请,才能使用。
下面是他们的联系方式:
高德地图
[email protected]
百度地图
[email protected]
腾讯地图
[email protected]
谷歌地图
这个,国内没有公交接口,大家应该不会再使用了吧。  

(大家发现没,高德是api,腾讯和百度是mapapi,说明什么?)

三、坐标偏移
如果您的坐标在转换之后,还有偏移,那么考虑以下几个方面。
A、原始坐标系弄错,比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。
解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。
B、原始坐标准确度不够
解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。
如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。
C、度分秒的概念混淆
比如,在google earth上采集到的是39°31‘20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。
D、经纬度顺序写反了
有些公司(比如高德,百度,腾讯)是先经度,再纬度,即Point(lng lat)。但谷歌坐标的顺序恰好相反,是(lat lng)。

四、坐标拾取工具
既然在国内必须至少使用GCJ-02的坐标系,而GCJ-02,“火星坐标”是在国内最广泛使用的坐标体系。那么,我们就来看看,如何直接获取到GCJ-02坐标呗。
请大家把这段代码保存到记事本里,然后后缀名改为.html,记得用UTF-8编码来保存。然后双击这个文件,就能打开网页了。

<!DOCTYPE HTML><html><head><title>火星坐标拾取</title><script language="javascript" src="http://webapi.amap.com/maps?v=1.2&key=6260f3e133c146a76f7c210c2786aec9"></script><style>#iMap{height:500px;width:600px;float:left;}.info{float:left;margin:0 0 0 10px;}label{width:80px;float:left;}</style></head><body onLoad="mapInit()">

火星坐标:

地址:

说明:

1、鼠标滚轮可以缩放地图,拖动地图。

2、点击地图,即可获得GCJ-02的经纬度坐标,地址。

</body><script language="javascript">var mapObj;var lnglatXY;//初始化地图function mapInit(){ var opt = { level: 13 //设置地图缩放级别 center: new AMap.LngLat(116.397428 39.90923) //设置地图中心点 } mapObj = new AMap.Map("iMap" opt); AMap.event.addListener(mapObj‘click‘getLnglat); //点击事件}function geocoder() { var MGeocoder; //加载地理编码插件 mapObj.plugin(["AMap.Geocoder"] function() { MGeocoder = new AMap.Geocoder({ radius: 1000 extensions: "all" }); //返回地理编码结果 AMap.event.addListener(MGeocoder "complete" geocoder_CallBack); //逆地理编码 MGeocoder.getAddress(lnglatXY); }); //加点 var marker = new AMap.Marker({ map:mapObj icon: new AMap.Icon({ image: "http://api.amap.com/Public/images/js/mark.png" size:new AMap.Size(5830) imageOffset: new AMap.Pixel(-32 -0) }) position: lnglatXY offset: new AMap.Pixel(-5-30) }); mapObj.setFitView();}//回调函数function geocoder_CallBack(data) { var address; //返回地址描述 address = data.regeocode.formattedAddress; //返回结果拼接输出 document.getElementById("iAddress").innerHTML = address;} //鼠标点击,获取经纬度坐标 function getLnglat(e){ mapObj.clearMap(); var x = e.lnglat.getLng(); var y = e.lnglat.getLat(); document.getElementById("lnglat").innerHTML = x + "" + y; lnglatXY = new AMap.LngLat(xy); geocoder();}</script></html>

打开之后,是这样的:

点击一下地图,即可获得GCJ-02坐标,地址:

demo地址:http://zhaoziang.com/amap/picpoint.html

更多高德地图API技术贴>>>http://bbs.amap.com/forum.php?gid=1

时间: 2024-10-12 12:56:16

地图中的坐标系(转)的相关文章

ArcGIS中的坐标系:基本概念和常用操作(一)

本文呢是主要是借鉴李郎平李大大的博士论文和百度百科,里面还有一点点我自己的理解,希望能帮助自己加深对于坐标系的认识. 李大大的博客:http://blog.sciencenet.cn/u/Brume 一.两种坐标系 坐标系其实很多,但是大类上分为两种坐标系——“地理坐标系”和“投影坐标系” 我们一般说的“投影”其实是坐标系的一种参数,有投影变形的称为“投影坐标系”,没有“投影”的称为“地理坐标系”. 地理坐标系进行地图投影后就变成了投影坐标系.地图投影(Map Projection)是按照一定的

ArcGIS中的坐标系定义与转换 (转载)

原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐标系,首先必须弄清地球椭球体(Ellipsoid).大地基准面(Datum)及地图投影(Projection)三者的基本概念及它们之间的关系.   基准面是利用特定椭球体对特定地区地球表面的逼近,因此每个国家或地区均有各自的基准面,我们通常称谓的北京54坐标系.西安80坐标系实际上指的是我国的两个大

Halcon中的坐标系特点及XLD的镜像转换

我们知道,Halcon中的坐标系的原点在左上角,而一般二维平面坐标系的原点在左下角.那么Halcon中坐标系和一般的二维坐标系有什么区别你?我通过下面这个例子来分析. 1 gen_image_const (Image, 'byte', 512, 512) 2 dev_set_draw ('margin') 3 4 *点1 5 gen_circle (Circle1, 10, 10, 3) 6 disp_message (3600, '(10 ,10)', 'image', 2, 18, 'whi

Cocos2d-x中的坐标系

绘图坐标系.它是最常见的坐标系,与OpenGL采用的坐标系相同,以左下角为原点,向右为x轴正方向,向上为y轴正方 向,如图 3-1 所示.在 Cocos2d-x 中,一切绘图相关的操作都使用绘图坐标系,如游戏元素中的 Position 和 AnchorPoint 等属性. 纹理坐标系.纹理坐标系以左上角为原点,向右为x轴正方向,向下为y轴正方向,如图3-2所示.在Cocos2d-x中,只 有从纹理中截取部分矩形时才使用这个坐标系,如 CCSprite 的 TextureRect 属性. 简单地接

百度地图中的标注

使用多个定义好的城市标注,需要用for来循环一下,不然出现的是一个,或者不显示任何的标注 <script type="text/javascript"> // 百度地图API功能 var map = new BMap.Map("container"); map.centerAndZoom(new BMap.Point(106.234, 38.54), 5); map.addControl(new BMap.NavigationControl()); //

echarts地图中城市与省份之间的切换

在使用echarts地图中,可能会用到显示各省份的数据和显示各城市的数据.综合了这两种的配置项,只需传四个参数即可完成对这两种模式的切换. 下面就是配置项代码: //地图配置 //mapData:图表所需数据:mapType:地图模式或散点图模式(即按省份显示数据或按城市显示数据) //minValue:视觉映射组件最小值:maxValue:视觉映射最大值 function _setMap(mapData, mapType, minValue, maxValue) { var option =

(UWP)通过编写算法实现在地图中的渐变路径

目前的一个App中需要实现这个需求,但是在UWP自带的Bing Map中,绘制的MapPolyline的StrokeColor的类型是Windows.UI.Color,也就是说一条MapPolyline只支持一种颜色,想要实现渐变是根本不可能的--但是我又不想说去拒绝视觉的需求,因为我觉得就算是系统提供的渐变画刷底层肯定也是通过相关的算法实现颜色渐变的,所以只要我们认真研究一下,最终一样可以达到我们想要的需求. 说个题外话,在这次的思路之前我还产生了其他的思路.当时是想在后台代码中实例化一个新的

百度地图中热力图使用中json数据转换与构造出现了问题——记录下JSON使用的问题

问题出现的原因,参考百度地图中提供的热力图功能,并通过自己的数据进行热力图的构建,为此,在json对象的构造时,出现了问题,导致热力图一直显示不出来.由于自己的js语法了解不是很多,在问题的定位上花了不少时间,最后定位到自己构造的json对象有些问题.就开始查看解决办法. 问题的解决参考:http://blog.csdn.net/henren555/article/details/38645125 从服务器获取数据时往往不止一个对象,这就需要用到对象数组,JS中对象数组可以用 [] 来定义,如下

c# winform 中的坐标系

从数学角度讲,Point是一个二维矢量,包含两个公共整型属性,属性用大写X和Y(c#中公共属性一般约定以大写字母开头).当坐标不是整数值是float时,用PointF代替Point使用. 常用的Size和Point结构其实相同,也有两个整型属性Width和Height,也有变体SizeF,但两者使用方式不同.Point是说明实体在什么地方,而Size用于说明实体多大,它们之间可以显示转换.一个Point和一个Size可以组成一个Rectangle.另外Point和Size可以进行加减运算:poi