中国の座標系へのショートガイド。 GCJ-02(gcj 02)を説明します。

简体中文 English Deutsch

Dmitry さんによる

で更新されました。

maps python javascript mapbox china google map WGS-84 GCJ-02 BD-09 baidu openstreetmap
この投稿はDeeplの協力により翻訳されました。この翻訳を改善したい場合は、私に連絡してください:[email protected]
Mapbox ChinaのChris Wuから、この記事へのフィードバックと中国での地図の仕組みについての洞察をいただき、ありがとうございました。彼なしでは、この記事は完成しなかったでしょう。

google map china offsetで検索したことがありますか?中国にいるほとんどの人がそうです。ここで、この質問にまつわる私の話をします。

2010年に初めて中国を訪れた時のことを思い出す。広州の好立地にあるホテルを予約し、Googleマップに座標とルートを保存していたのです。しかし、目的地に着くと、明らかにホテルがない。ホテルがあるべき地点にいたのに、周りにあるのは巨大な広場(花城广场別名:花城広場)だけなんです。長い話だ。ある時、ある人がMeizuの携帯で、ホテルがこの広場から数キロ離れたところにあることを教えてくれて助かった。

最近、私は中国と仕事をしていますが、開発者として同じような課題に直面しています。誰かの役に立てればと思い、自分の経験をまとめた記事を書くことにしました。

百度地図のスクリーンショットと旧中国語地図

A Short Guide To The Chinese Coordinate System

Have your ever searched google maps china offset? Most people who was in China yes. Here is my story behind this question.

チャイナコーディネイトシステム

まず、現在使われている主な座標系について説明します。国際標準はWGS-84(地球座標)またはWorld Geodetic Systemで、84は1984年に適用されたこの標準の最新の改訂版です。GPSはこの規格を採用しています。Google Mapsを使うたびに、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-500mの位置のずれが生じます。マイル単位になることはほとんどなく、通常は2~3ブロックの差になります。だから私は初めて中国に行ったとき、道に迷ったのだ。

しっかりつかまる。まだあるんです。Baiduはさらに踏み込んで、GCJ-02にさらなる難読化を追加する別の抽象化を実装しました。それはBD-09(Baidu、2009年策定)と呼ばれるものです。主な目的は、競合他社が簡単に複製できないように、バイドゥのデータを保護することだった。Baiduは、3つの座標系を移行するための内部ツールを持っていますが、タイルや検索座標などに彼らの標準を使うことを奨励するために、GCJ-02からBD-09までを公開するにとどめています。

中国の法律で定められているため、WGS-84に変換するための公式APIは存在しない。

ライセンス

Wikipediaによると、「クラウドソースで世界地図を組み立てるプロジェクトであるOpenStreetMapは、「中国では民間の測量や地図作成活動は違法である」と忠告している」とあります。しかし、BaiduやMapboxの地図を見ると、地図ライセンスの横にOSMのアトリビューションがあることが多い。つまり、中国ではOSMの利用は違法ではなく、衛星画像からOSMにデータを追加することができるのです。しかし、地上でのデータ収集を行うには、Survey License(データを収集し、商業製品を作成する能力)を取得する必要があります。と、全く別の話になってしまうのです。

クリスから聞いた話だが、サーベイのライセンスは非常に取得しにくい。その結果、このライセンスを持っている会社は20社にも満たないのです。Alibabaのような巨大テック企業は、このライセンスのためだけにAutoNaviを買収する必要があり、TencentはNavInfoを買収する必要があったのです。例えばMapboxは、ナビゲーショングレードの地図データのリーダーであるEMGと提携した。Didiは、過去10年間で直接ライセンスを取得した最初の企業です(かなりのマイルストーンです)。一方、地図ライセンスは入手しやすく、中国のライセンスベース地図(Mapbox、Baidu、AutoNaviなど)の右下を見ると、「GS(2020)123号」のような表記があります。

地図ライセンスを示すbaiduマップのスクリーンショット

Baidu地図ライセンス

gcj-02 to wgs84. wgs84 to gcj02

ご想像の通り、変換はこんな感じです。WGS-84 ⇛ GCJ-02 ⇛ BD-09 と逆順になります。 正式な変換ガイドを発行することは違法であり、座標移動の使用ごとにSBSMの承認が必要です。

しかし、このアルゴリズムのオープンソース実装を、さまざまなプログラミング言語で見つけることができます。(e.g., eviltransform). この記事では、JavaScriptの実装を使用しますが、Python、R、Goなども簡単に見つけることができます。記事の注釈をご覧ください。

中国支社では、Baidu Get Point Serviceを利用して、目的のオブジェクトのBD-09座標を取得しています。スクリーンショットは以下の通りです。私はこの座標をデータベースに保存し、ユーザーのジオロケーションに基づいて、WGS-84またはGCJ-02に向けて変換を行います。中国のユーザーは、GCJ-02を使用しなければなりません。

bd-09座標を示すバイドゥ地図のスクリーンショット

BD-09 api.map.baidu.com/lbsapi/getpoint より

coordtransformライブラリとMapboxを使ったサンプルを作ってみたので、遊んでみてください。 当サービスからBD-09座標をコピーして、ここに貼り付けると、変換結果を確認することができます。

この例のソースコードは、こちらでご覧いただけます。

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.

中国のユーザーには、どの地図プロバイダーを使うべきか?

中国本土からのユーザーにスムーズな地図体験を提供したい場合、多くの選択肢はありません。Google MapsはVPNがないと動きません。私は中国のBaidu Mapsを愛用しています。細かいところまで見てください。

しかし、いざ自分のWebページに地図を埋め込むとなると、私に残された選択肢はMapboxだけです。Mapboxは優れた代替地図サービスです。合法的で、中国ではVPNなしでも全く問題なく使えます。中国の規制により、彼らは以下のサービスを提供しています。 3つのライセンスされたベースマップをmapbox.cnを通して提供しています。中国国内のデータはすべて(地図パートナーから)シフトされ、中国国外のデータはすべて(OSMを含む独自のデータセットから)シフトされていない。

Mapbox with a WGS-84 113.31924878632225, 23.12426152397713 coordinates (花城广场 in Guangzhou)

api.mapbox.comのエンドポイントをグローバルアクセストークンでテストしてみたところ、広州からは全く問題なく動作した。しかし、中国の場合、それはギャンブルなので、私はアクセストークンを取得することをお勧めします。mapbox.cnからアクセストークンを取得することをお勧めします。

ここにあなたのためのアルゴリズムがあります。あなたの訪問者のGeoIPは中国にありますか?

  • はい: GCJ-02の座標をmapbox.cnに埋め込む。
  • いいえ: WGS-84座標を持つmapbox.comの埋め込みを表示します。

この投稿が誰かの時間の節約になれば幸いです。これは複雑でよく理解されていないトピックなので、おそらく後でもっと情報を追加するつもりです。ご質問やご提案がありましたら、ご連絡ください。

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.