中国坐标系简明指南。GCJ-02(gcj 02)解释。

English Deutsch 日本語

作者:Dmitry

更新于

这个帖子是在Deepl的帮助下翻译的。如果你想改进这个翻译,请联系我:[email protected]
maps python javascript mapbox china google map WGS-84 GCJ-02 BD-09 baidu openstreetmap
感谢 Chris Wu,来自Mapbox China,感谢他对本文的反馈以及关于地图在中国如何运作的见解。没有他,这篇文章就不会完整。

你是否曾在谷歌地图上搜索过中国抵偿?大多数在中国的人都有过。下面是我在这个问题背后的故事。

我记得我在2010年第一次访问中国。我们在广州预定了一家位置不错的酒店,并将坐标和路线保存在谷歌地图上。但当我们到达一个目的地时,很明显,没有酒店。我在我的酒店应该在的地方,但我周围只有一个巨大的广场(花城广场又名花城广场)。长话短说。在某些时候,有些人用他的Meizu手机救了我们,显示我们的酒店其实离这个广场有几英里远。

这些天来,我 与中国 合作,作为一个开发者,面临着同样的挑战。我决定写一篇文章来总结我的经验,希望这能帮助别人。

百度地图截图和旧中国地图

How to Upload Files To Bunny.net Storage

python bunny_net storage snippet

Bunny.net is a well-known CDN and storage among developers. Here is my python snippet on how to upload a file to the storage.

中国坐标系

首先让我们来谈谈今天使用的主要坐标系。国际标准是WGS-84(地球坐标)或世界大地测量系统,其中84是1984年适用的该标准的最新修订版。 这个标准是由GPS使用的。每次你使用谷歌地图(或几乎任何地图)时,你都可以感谢WGS-84。现在我们来谈谈中国。

世界坐标系。WGS-84, GCJ-02, BD-09

WGS-84 ⇛ GCJ-02 ⇛ BD-09

中国监管机构要求经批准的地图服务使用GCJ-02标准(中文:国测局;拼音:guó-cè-jú)。它是由中国国家测绘局在2002年制定的。 有时GCJ-02被称为火星坐标。GCJ-02以WGS-84为基础,使用混淆算法,在纬度和经度上都加入随机偏移,以提高国家安全。如果把WGS-84的点放在GCJ-02地图上,平均来说,会有一个大约300-500米的位置偏移。很少有进入 "英里 "的距离,通常只是几个街区的距离。这就是为什么我在第一次访问中国时迷路了。

抓紧了。还有更多。百度更进一步,实现了另一个抽象,为GCJ-02增加了进一步的混淆。这就是所谓的BD-09(百度,2009年制定)。主要目的是为了保护百度的数据,使竞争对手不能轻易复制。百度有内部工具可以在三个坐标系之间转换,但只将GCJ-02到BD-09公开,以鼓励使用他们的标准来制作瓷砖、搜索坐标等。

按照中国法律的要求,没有官方API可以转换为WGS-84

许可证

根据维基百科,"OpenStreetMap,众包项目,以组装世界地图,建议 "私人测绘活动在中国是非法的"。尽管如果你看一下百度或Mapbox的地图,你经常会在地图许可证旁边发现OSM的归属。这意味着OSM的使用在中国并不违法,你可以从卫星图像中向OSM添加数据。但是要做地面数据采集,你必须获得调查许可证(有能力采集数据并创造商业产品)。而这是一个完全不同的故事。

正如克里斯向我提到的,调查许可证是非常难以获得的。因此,只有不到20家公司拥有这种许可证。像阿里巴巴这样的巨型科技公司需要收购高德,就是为了这个许可证,腾讯不得不购买NavInfo。例如,Mapbox与导航级地图数据的领导者EMG合作。滴滴是过去十年中第一个直接获得其许可的公司(相当具有里程碑意义)。另一方面,地图许可证更容易获得--如果你看一下中国的授权基础地图(Mapbox、百度、高德等)的右下方,你会看到类似 "GS(2020)123号 "的字样。

百度地图截图显示地图许可证

百度地图授权

gcj-02 to wgs84. wgs84 to gcj02

你可以想象,转换过程是这样的。WGS-84 ⇛ GCJ-02 ⇛ BD-09,再往后。 发布正式的转换指南是非法的--每次使用坐标转换都需要得到SBSM的批准。

然而,你可以在不同的编程语言中找到这种算法的开源实现。(e.g., eviltransform). 在这篇文章中,我将使用JavaScript实现,但你也很容易找到Python、R、Go等。请看我文章的注释部分。

我们的中文办公室使用百度取点服务来获取所需物体的BD-09坐标。下面是一个屏幕截图。然后我把这个坐标存储在数据库中,并根据用户的地理位置,向WGS-84或GCJ-02转换。对于中国的用户,你必须使用GCJ-02,记得吗?

百度地图截图显示BD-09坐标

BD-09 从 api.map.baidu.com

我用coordtransform库和Mapbox做了一个例子,供你玩耍。 从这个服务中复制BD-09坐标并粘贴到这里,以查看转换的结果。

你可以在这里找到这个例子的源代码

How to Import CSV Files to PostgreSQL with Pgfutter

csv postgresql

Sometimes I need to upload large CSV files to PostgreSQL. CSV file might have hundreds of columns, that's why i want a tool that can do some magic for me.

在中国,你的用户应该使用哪个地图供应商?

如果你想为来自中国大陆的用户提供流畅的地图体验,你没有太多的选择。 没有VPN,谷歌地图就无法工作。 我喜欢中国的百度地图。 他们提供了优秀的用户界面和大量方便的GEO数据。 我的意思是,看一下细节

但是,当涉及到应该在网页上嵌入地图时,留给我的唯一选择就是Mapbox。Mapbox is an excellent alternative map service. 它是合法的,在中国不使用VPN也能完全正常工作。 由于中国的规定,他们通过mapbox.cn提供3种授权基础地图。中国境内的所有数据都是移位的(来自他们的地图合作伙伴),中国境外的所有数据都是不移位的(来自他们自己的数据集,包括OSM)。

带有WGS-84的地图盒 113.31924878632225, 23.12426152397713 坐标 (花城广场 in Guangzhou)

我测试了使用全球访问令牌的api.mapbox.com端点,它在广州运行得非常好。但在中国的情况下,这是一场赌博,所以我建议从mapbox.cn获得访问令牌。

这里有一个算法给你。你的访客GeoIP在中国吗?

  • : 显示嵌入了GCJ-02的坐标
  • 没有: 显示嵌入的WGS-84坐标

我希望这个帖子能够为某人节省时间。我可能会在以后添加更多的信息,因为这是一个复杂的、不被人理解的话题。如果你有任何问题或建议,请给我留言。

The Latest

recv() failed (104: Connection reset by peer) while reading response header from upstream

python uwsgi error snippet

Geolocate the Location of an IP Address With Cloudflare Workers and JavaScript

javascript cloudflare geolocation workers

Detect a visitor's country and city by IP address with Cloudflare Workers and JavaScript.

JavaScript Document Onload + TypeScript version

javascript DOM snippet basics typescript
🗃 JavaScript Basics

Universal code-snippet to know when HTML is ready for modern browsers.

How to Create Jinja2 Filters in Flask

python flask jinja2 snippet

In this post, I'll talk about filters. Jinja2 has a list of built-in filters, and Flask leverages them.

How to Upload Files To Bunny.net Storage

python bunny_net storage snippet

Bunny.net is a well-known CDN and storage among developers. Here is my python snippet on how to upload a file to the storage.

How to Copy Text to Clipboard With Javascript

javascript DOM browser

Here is a short snippet on how to copy text to the clipboard with Javascript. Your visitors will thank you. Most likely not, but here we are.

Flask Boilerplate and Your Guide to Flask in 2023. With SQLAlchemy.

boilerplate open source flask

Flask-Backbone is my take to create an initial structure and a set of rules, so most of my flask projects are easy to support.

How to Import CSV Files to PostgreSQL with Pgfutter

csv postgresql

Sometimes I need to upload large CSV files to PostgreSQL. CSV file might have hundreds of columns, that's why i want a tool that can do some magic for me.

How to Upload Files to DigitalOcean Spaces with Python

digitalocean python

Snippet on how to upload files to DigitalOcean Spaces with boto3 and python.

The Definitive Guide To Sitemaps With Python

open source python

Sitemaps are important. Especially for big websites. It is always a good idea to develop your website with SEO in mind. Unfortunately, most developers ignore this part.