如何看待「地形图非线性保密处理技术」?

《南方数码》杂志:李成名:科学就是较真 数字城市/智慧城市就是跑马圈地发布时间:2014-1-20 17:09:37 http://www.south…
关注者
1,022
被浏览
347,326
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

就新聞所提到「2000 年后」可以大概推斷,「火星座標」,也就是 GCJ-02,跟這個東西是有關係的。然而查閱測繪部門的文件可以得知,似乎「地形圖非線性保密處理」在之後還有一些新的進展。具體情況我不得而知。

不過既然問題也加了「火星座標」的標籤,我現在先就 GCJ-02 座標系來談吧。先給不知道的知友科普一下:簡而言之,在互聯網上,標識建築、道路和其它 POI 時,絕大多數時候使用的座標系都是 WGS-84 座標系,因爲其是 GPS 所使用的座標系。而在中國,出於「保密」的理由,所有地圖被強制要求使用 GCJ-02 座標系,也就是所有 POI 的座標都要被映射到一個經過「地形圖非線性保密處理」之後的座標系上。更有趣的是,這個轉換模塊還是要由測繪部門收費的。

你問我如何評價?這東西就是混蛋,跟某牆一個性質的東西。常年用百度地圖的人可能沒有什麼感想,那我來舉幾個我遇到的例子:

  • 打 Ingress 的時候,發現街道圖和 portal 的位置相互之間是偏的。因爲 portal 位置是記錄在 WGS-84 座標系,而不是 GCJ-02 座標系下的。但街道圖是記錄在 GCJ-02 座標系下的。
  • 出去騎行的時候,由於要根據翻山的情況進行規劃,我需要路線全程的 elevation profile(就是下面這種圖)。作爲一個外行,我並不會使用任何專業的工具,於是只能依賴 Google Earth 來自動生成。然而,中國境內的道路都是按照 GCJ-02 記錄的,而每個地方的海拔高度卻是衛星取得的 WGS-84 座標系下面的數據。於是,生成的 elevation profile 很可能是錯的——由於山口附近地形陡峭,座標偏移上幾百米,可能海拔也會有上百米的錯誤,給我帶來不小麻煩。

這個問題不可能去怪 Google。全世界就只有一個「其它國家」有這種奇葩的座標系映射。並且,如果要讓 Google 把海拔對應的座標、portal 對應的座標也映射到 GCJ-02,從技術上將是完全不現實的。因爲全世界只有中國內地用 GCJ-02,把其它地方的 POI 也映射到 GCJ-02 座標系顯然是不可行。

而如果單單把中國內地的 POI 映射掉的話,在邊境地帶就會出現中國內地的 POI 和其它地方的 POI 不連續,甚至重疊的情況。Google 對於街道圖就採取了這樣的措施,於是就產生了下圖這樣的慘狀(新鮮截圖,還熱乎着):

「如何看待」我就不再多自己評論了,引述下列兩段別人的觀點。我對其觀點表示完全贊同。

总之,国家测绘局的这个所谓的发明创新,最大的用处就是收钱和折腾用户,至于其实际保密效果就不敢恭维了。

via

blog.sciencenet.cn/blog

這個地圖偏移對地理信息處理和GPS技術的民用化起到了巨大的阻礙作用,近年各種與地理位置相關的應用如雨後春筍般湧現,但都為中國地圖的偏移而頭痛不已 …… 增加很多不必要的複雜性和浪費開發、數據處理的人力 …… 浪費了大量社會財富來對技術發展與應用進行封鎖。

via

aleung.github.io/blog/2

我回答這個問題,是因爲我兩年前寫過一篇相關的 blog,我現在將我當時寫的內容做少許修改複製到這裏:

我所能找到的時間上最早流出的 WGS-84 至 GCJ-02 的轉換算法出自

on4wp7.codeplex.com/Sou

。經過在不同省份取採樣點,將 google.com 上 Google Maps 之衛星圖上的建築物經緯度取出,進行 WGS-84 -> GCJ-02 的變換,與 Google 地圖的街道圖之對應建築物之經緯度進行比對,可以發現該流出之算法完全屬實。

我們看一下它的代碼中的一小部分,處理緯度加偏的前半部分:

-100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs​​(x)) + (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0 + (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0 + ( 160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0

這一部分已經體現了GCJ-02 設計精巧的幾點:

這是一個很長的多項超越式。於是它難以進行反向運算、難以根據已知數據點反推出計算公式。這也就是標題的「非線性」所指代的。且就算我們拿到了這個已知的轉換算法的公式,要想求出它的反函數是非常困難的,於是如果我們要完成 GCJ-02 到 WGS-84 的逆轉換,只能通過二分法來逼近。

這個轉換算法需要達到的要求是顯而易見的:它必須是連續的,並且是相對單調的。連續才能確保地圖不出現斷點且覆蓋所有區域;單調才能保證原先的位置相互關係轉換後依舊成立。而算法很精妙保證了這一點。同時,由於經度和緯度同時作爲轉換的參數而不是獨立地被進行轉換,對於外界來說,要想破解出加密的算法,也更加困難。

在中國國境內,GCJ-02 帶來的偏移最大有 700 米左右。我寫了個程序自動畫了一下,偏移的絕對值可以參見下圖(最紅處接近 700 m,最藍處大約 20 米):