16
2013年7月针对中国GPS偏移问题的更完整的iOS解决方案
这是一个朋友的来宾帖子,[暂时未命名]。它深入到中国’s GPS issue, which I’ve 以前在这里抱怨过。希望借助以下信息,非中国开发人员将能够更快,更有效地解决此问题。请注意,尽管以下信息适用于iOS应用开发,但并非’•严格针对iOS。
问题描述
人们在中国呆了很长时间后经常会遇到的一个问题是,他们发现自己的GPS设备没有’工作。确保您的iPhone或Android手机会很好地报告您自己的位置,但是当您尝试使用路线跟踪功能时,’重新慢跑或如果您使用向他人展示的应用’GPS的位置,例如“查找我的朋友”,您’ll likely see they’站在河边或500米外的某个地方,即使他们’站在你旁边。
这是神秘的 China GPS 关set problem。这已经在几篇文章中进行了介绍[中文] 这里, 这里和 这里。基本上,中国政府严格控制中国境内的地图数据。它’未经授权在中国境内地图或创建GPS轨迹是非法的。有一些外国人的故事,他们在敏感建筑物附近创建了远足小径,其中有GPS设备因当地有关法律而被捕。
对于流行的地图应用(例如iOS上的Google Maps或Apple Maps),用户 ’自己的位置将是正确的。这是因为将向政府注册的许可公司提供正确的算法来调整用户’的位置。 Google Maps,Bing和其他工具允许您基于GPS坐标来搜索位置,但是没有本地的中国地图提供商(例如百度地图)允许您搜索。
如果您是在紫禁城附近拍摄的照片,请将照片加载到iPhoto或Picasa中,然后查看它在地图上的位置’您会发现位置只是在300-500米之外,通常只有一两个街区之遥。距离不够远以至于极度不准确,但又不够正确以至于使您烦恼并且无法将您置于正确的位置。
两种GPS标准
国际上最常用的GPS标准基于称为WGS-84的坐标系。地球不是一个完美的球体,从3D到2D的任何映射都会带来一些折衷。真正了解它的人会注意到,当您离赤道越远时,GPS坐标的经纬度变化就越容易’即使你’重新旅行相同的距离。但这是我们的GPS’我们已经知道并在全球范围内使用。
中国使用名为GCJ-02的标准,该标准基于1940年引入的较旧的苏联坐标系’s. It’从WGS-84转换为GCJ-02’d想完成。中国程序员将此坐标系称为 火星坐标系统 or “火星坐标系” (as 在 you’重新将地球从带有WGS-84的地球映射到GCJ-02中的火星)。
初步尝试纠正问题
Static 关set
在英语世界中,第一次尝试纠正此中国抵消问题的方法是,在上海或北京等城市,这种差异是相对固定的。也就是说,如果您仅从纬度中减去几度并为经度添加几度,就可以校正位置。他们很快意识到翻译是非线性的,但是随着城市的变化而变化。
收集数据点
我自己解决这个问题,发现只要我在中国境内’的IP范围,我会看到iOS模拟器正确报告了我的模拟位置,但是如果我在相同的GPS坐标上放置图钉,它将被关闭。我创建了一个简单的应用,可让您将图钉拖回您的实际位置并在抓取后 维基百科’中国的城市清单,具有657个数据点。
使用 电子表格’s LINEST function 您可以将数据分为几组,并且实际上可以获得相当不错的校正,该校正在全国范围内都可以使用,尽管它仍然相差几米。足以让您与实际所在的街道或几家商店隔街相望。
事实证明,如果您使用中文搜索,那么会有几个人在中国境内出售数以万计的大量数据集及其相应的偏移量。显然,人们以前曾遇到过这种需求。在淘宝上,您可以找到价格从400元到900元不等的套装。
提示已解决的代码
一些英语帖子指出,中国的Android编码人员已经在开源中发布了正确的算法。在用中文多次搜索后,找到相关帖子很容易。但是解决问题的实际方法需要更多的努力,直到我发现 唐over的个人网站 和一个 在名为XCoder.cn的热门技术网站上发布.
找到并解释了解决方案
简而言之,最初发布的代码是一个C文件,其中考虑了各种高度,GPS时间和日期等,即使它们未使用。可以在网上找到几个地方。提供了重构和更干净的代码版本 在EvilTransform.cs上的C#中.
It’基本上是一个复杂的变换,使用的方程式描述了从一个坐标系到另一个坐标系的椭球体(地球是什么)。在WGS-84中放入GPS后,您将在GCJ-02中获得相同的信息。
您’请注意,该代码解释说,中国境内的任何事物都需要这种转换,而中国境外的任何事物都不需要’t。而且中国被定义为北纬0.83到56到经度72到138之间的任何值。我认为’有几个国家可能会反对该矩形。
所以现在怎么办?
因此,现在任何需要记录GPS路径,发布GPS位置或地图顶部其他内容的Web或移动应用程序开发人员现在都可以拥有正确的位置。终于找到了在中国任何地方都可以使用的解决方案,这让我感到非常欣慰,因此我们所有人都可以重新创建 有效的应用.
参考文献
- 总体情况汇总
- 百度对火星坐标系的定义
- 带链接的算法说明
- EvilTransform.cs–该代码最清晰的版本
- 执行百度和GCJ-02到WGS-84的iOS代码
- Links to Taobao 关ers for data sets: 1, 2, 3
2014年12月23日更新:
一名开发人员最近发现这篇文章对解决自己的中国位置应用程序问题很有用,但需要一些其他信息来正确实施上述建议。一世’我在下面分享了这些额外的信息,希望它’对更多开发人员有用:
苹果以WGS格式返回其坐标,并在渲染时偏移地图(我认为坐标本身是偏移的,而不是渲染的地图)。
没有提到,但从上面得出的推论是,谷歌反其道而行之…如果我没记错的话,Google会返回中国位置的GCJ坐标(即使您不在中国)…这解释了为什么在输入Google之前,Apple的坐标会关闭,直到将其转换为GCJ。
MapKit only 关sets the map from devices within China.
由于我们正在对中国境内和境外的设备进行测试,因此我们不确定根本问题在哪里;我们曾尝试进行转换,但随后在中国境外的设备上使用MapKit测试了结果。