摘要:各种坐标体系之间如何转换?到底有哪些坐标体系?什么是火星坐标?为什么我的坐标,在地图上显示会有偏移?本文详细解答以上问题。最后给出坐标拾取工具。

---------------------------------------------------------------------------------------------------------------------------

一、坐标体系

首先我们要明白,开发者能接触到哪些坐标体系呢?

第一种分类:

1、  GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:

2、  GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系

3、  其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。

第二种分类:

首先明白,所有坐标体系的原点,都是非洲。

1、  经纬度。这个是球面坐标,对于北京来说,就是(116.388171,39.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公司的商务部,经过申请,才能使用。

下面是他们的联系方式:

高德地图

api@autonavi.com

百度地图

mapapi@baidu.com

腾讯地图

mapapi@vip.qq.com

谷歌地图

这个,国内没有公交接口,大家应该不会再使用了吧。  

(大家发现没,高德是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编码来保存。然后双击这个文件,就能打开网页了。

注册你自己的key,填在源代码里哦:http://api.amap.com/key/index

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>火星坐标拾取</title>
<script language="javascript" src="http://webapi.amap.com/maps?v=1.2&key=您的key"></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()"><div id="iMap"></div><div class="info"><p><label>火星坐标:</label><span id="lnglat">&nbsp;</span></p><p><label>地址:</label><span id="iAddress">&nbsp;</span></p></br><p>说明:</p><p>1、鼠标滚轮可以缩放地图,拖动地图。</p><p>2、点击地图,即可获得GCJ-02的经纬度坐标,地址。</p></div>
</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(58,30),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(x,y);geocoder();
}
</script>
</html>

打开之后,是这样的:

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

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

2014-5-21 更新

高德官方坐标拾取工具:http://api.amap.com/LngLatPicker

【地图API】为何您的坐标不准?如何纠偏?相关推荐

  1. PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例

    PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例 原文:PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例 <!--小幅的坐标转换点位程 ...

  2. 百度地图显示坐标读取服务器数据,借助百度地图api解决获取经纬坐标问题

    今天做一个附近医院查询的小应用,要求根据经纬坐标计算距离,按距离由近到远排列起来,在web前端获取经纬坐标的时候发现新版本ios10和chrome浏览器在获取经纬坐标时要求服务器是https协议,否则 ...

  3. php批量获得经纬度,批量调用百度地图API获取地址经纬度坐标

    1 申请密匙 点击左侧 "获取密匙" ,经过填写个人信息.邮箱注册等,成功之后在开放平台上点击"创建应用",填写相关信息,在这里特别说明的是,在IP白名单框里, ...

  4. 百度地图批量精度和维度Java,关于百度地图API批量转换成坐标的方法

    下面的代码思路是:从页面获取馆Id数组,将其数组通过ajax提交到服务器,服务器返回馆的ID,馆名,和馆地址: 再循环地址,获取每个地址的坐标,并将馆ID和其坐标对应起来,提交到服务器更新,转换失败的 ...

  5. 高德地图API JS实现获取坐标和回显点标记

    1.搜索+选择+获取经纬度和详细地址 2.回显数据并点标记 3.实现 第一步:引入资源文件 <!--引入高德地图JSAPI --> <script src="//webap ...

  6. 百度地图API批量地址转坐标(支持Excel上传,附案例)

    最近接到个小任务,需要把Excel 一批地址数据转换成坐标,又不想依赖项目,干脆直接写个HTML算了,内含坐标系转换(百度坐标BD09系转换GPS84坐标系). 目前国内主要有以下三种坐标系: WGS ...

  7. php百度地图接口两点测距,百度地图Api 根据两个坐标点计算距离

    百度地图Android Sdk的Api里面,没有现成的直接获取两个坐标点之间距离的方法,但是,在jsapi里面,有直接计算距离的方法. class Point: pass def max(a,b): ...

  8. 定位当前位置(坐标点)到 附近多个位置(坐标点)最短路径动态规划(汉密尔顿回路算法整合百度地图API)

    最近项目中需要实现这样一个功能:从当前位置,规划一条最优线路到附近多个工厂的最优线路.必须要有详细的路径坐标点信息. 思路:1.首先 使用汉密尔顿回路算法,求解出当前位置坐标点到附近工厂最短线路的路径 ...

  9. c语言api获取百度地图,H5调用百度地图API获取地理位置

    //获取当前位置 var geolocation = new BMap.Geolocation(); geolocation.getCurrentPosition(function(r){ alert ...

  10. 如何将百度地图API获取经纬度写成公有方法?

    原问题来自于CSDN问答社区:http://ask.csdn.net/questions/636 问题描述: 我使用的是百度地图API来获取经纬度坐标.但是我的程序里面有多个地方用到了经纬度. 所以我 ...

最新文章

  1. 【青少年编程】【四级】用逗号分隔列表
  2. flash 绘图API:绘制基础的图形
  3. golang实现dns域名解析(一)
  4. P1459 三值的排序 Sorting a Three-Valued
  5. android 6.0获取蓝牙权限
  6. weka的java环境配置_Linux(ubuntu)环境下配置weka
  7. Python爬虫入门并不难,甚至入门也很简单
  8. 开奖啦!CSDN 程序员节 1024 中奖名单揭晓!
  9. flex接收java返回集合,前台的的flex对Java返回list类型的处理
  10. MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总
  11. 建站基础知识之HTML 是何方神圣?
  12. 2021/9/7 ad9361 SPI 通信与数据接口
  13. c语言数学追赶法编程,计算方法——C语言实现——追赶法求解非线性方程
  14. 如何linux删除文件夹,Linux系统下如何删除文件夹
  15. SpringMVC配置中遇到的惊(keng)喜
  16. 关于更佳学术搜索及Android SDK更新问题
  17. 强烈推荐这款刷题小程序
  18. 互联网寒冬!docker安装nacos集群
  19. win7连win10失败解决方法
  20. 关于加装新的SSD后,机械盘不识别(不显示)的问题解决

热门文章

  1. golang的定时任务
  2. 01.mac下安装配置maven
  3. Spark源码阅读——任务提交过程
  4. ORB-SLAM2学习2 KeyFrame.h
  5. 从maya中 导入物体 到Uniyt3D 规范 整理
  6. SQL to ElasticSearch DSL
  7. 剑指offer——面试题44:扑克牌顺子
  8. 关于外部测试字段解释冲突
  9. 爬取小说《重生之狂暴火法》 1~140章
  10. Python学习之路9☞面向对象的程序设计