この投稿はDeeplの協力により翻訳されました。この翻訳を改善したい場合は、私に連絡してください:[email protected]。
2010年に初めて中国を訪れた時のことを思い出す。広州の好立地にあるホテルを予約し、Googleマップに座標とルートを保存していたのです。しかし、目的地に着くと、明らかにホテルがない。ホテルがあるべき地点にいたのに、周りにあるのは巨大な広場(花城广场別名:花城広場)だけなんです。長い話だ。ある時、ある人がMeizuの携帯で、ホテルがこの広場から数キロ離れたところにあることを教えてくれて助かった。
最近、私は中国と仕事をしていますが、開発者として同じような課題に直面しています。誰かの役に立てればと思い、自分の経験をまとめた記事を書くことにしました。
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
中国の規制当局は、認可された地図サービスには標準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地図ライセンス
ご想像の通り、変換はこんな感じです。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 api.map.baidu.com/lbsapi/getpoint より
coordtransformライブラリとMapboxを使ったサンプルを作ってみたので、遊んでみてください。 当サービスからBD-09座標をコピーして、ここに貼り付けると、変換結果を確認することができます。
この例のソースコードは、こちらでご覧いただけます。
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は中国にありますか?
この投稿が誰かの時間の節約になれば幸いです。これは複雑でよく理解されていないトピックなので、おそらく後でもっと情報を追加するつもりです。ご質問やご提案がありましたら、ご連絡ください。