1. 程式人生 > >國外地理編碼網站——Geocoding API

國外地理編碼網站——Geocoding API

由於需要,本人使用了國外好幾種Geocoding API(地理編碼與逆地理編碼),現進行總結。由於需求不大,所以本人在這些網站都是使用的免費套餐,一般這些網站都提供收費服務,將提供更快更強大的功能。

PickPoint

網址:pickpoint
在網站的沙盒功能中,提供了三種功能。如圖:
這裡寫圖片描述
其中POINT=>BUIDING就是逆向地理編碼。請求與返回結果如下:
這裡寫圖片描述
評價:該網站api,逆地理編碼返回的地點還是很準的,但有時候,返回的地點類別的語義不是很清晰。這裡的地點類別為"hotel": "Radisson Martinique on Broadway",類別是hotel

,語義就是旅館,但有時候會返回address29,這種語義不明的類別,網站也沒有api文件對其進行說明。

GraphHopper

先令說一下,該網站提供一個很好的graphhopper-地理地點視覺化功能。在下面的起點終點輸入緯經度,就可以得到起點到終點的行駛路徑,而且還可以設定中間經過節點。
這裡寫圖片描述
開發者網址:graphhopper。提供的api如下:
這裡寫圖片描述
這裡寫圖片描述
這裡提一下地圖匹配api(Map Matching API)。一般車輛上會裝gprs裝置,在行駛過程中會每隔一段時間就向衛星釋出經緯度地點,將這樣的地點依次連線起來就是車輛的行駛路徑。
但由於gprs裝置定位不準,導致向衛星釋出的地點總是會有偏差,這樣就導致把釋出地點連線起來的路徑,匹配到真實路網上會返回錯誤結果。
所以,這裡需要使用到隱馬爾科夫模型,來匹配到真實路網上。詳情請看這篇論文

Hidden Markov Map Matching
Through Noise and Sparseness
。該網站的地圖匹配演算法就是用的這篇論文裡面的方法。
graphhopper提供的其他api也很強大,但本人並沒使用,所以請看上圖瞭解。

FourSquare

開發者網址:foursquare。提供的api如下,api很多,只截圖了一小部分:
這裡寫圖片描述
我只使用過search這個endpoint,這個API可以以某個經緯度為中心,搜尋半徑內的出現的venue(即指場所)。並且可以通過指定categoryId(地點類別的id)來指定返回特定類別的venue。
這裡寫圖片描述
和search相似的,還有explore這個API。explore更傾向於返回一些重要場所或者“高階”場所,而search不管重要性,是將所有場所都返回。

GeoNames

網址:geonames。提供的api如下:
這裡寫圖片描述

MapQuest

網址:mapquest。提供的api如下:
這裡寫圖片描述
該網站的地理編碼api介紹如下:
這裡寫圖片描述
這裡提一下mapquest的Search API裡面的Radius Search,一般搜尋api都會有半徑搜尋功能,但mapquest的半徑搜尋的請求的引數很有意思:
這裡寫圖片描述
半徑的單位不僅有正常的公里,還有步行時間,駕駛時間,類似等時線這種功能,以到達時間為判斷條件。
這裡寫圖片描述
返回地點的地理資訊格式,不僅有raw格式(即經緯度),還有cmp(精度為5),和cmp6(精度為6)這種格式。
比如某個點經緯度的轉成cmp可能是"shapePoints": "szcxEvkfbV"
cmp6可能是"shapePoints":"ysozbA~~h_fF"。將這兩個神祕程式碼解碼之後就能得到一個或多個經緯度對。
用下面這個函式來解碼神祕程式碼:

<script>
function decompress (encoded, precision) {
   precision = Math.pow(10, -precision);
   var len = encoded.length, index=0, lat=0, lng = 0, array = [];
   while (index < len) {
      var b, shift = 0, result = 0;
      do {
         b = encoded.charCodeAt(index++) - 63;
         result |= (b & 0x1f) << shift;
         shift += 5;
      } while (b >= 0x20);
      var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
      lat += dlat;
      shift = 0;
      result = 0;
      do {
         b = encoded.charCodeAt(index++) - 63;
         result |= (b & 0x1f) << shift;
         shift += 5;
      } while (b >= 0x20);
      var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
      lng += dlng;
      array.push(lat * precision);
      array.push(lng * precision);
   }
   return array;
}
console.log(decompress('kv~neAvhkzgF',6));
</script>

Nominatim

這是從graphhopper的geocoding文件裡發現的額外供應商。
這裡寫圖片描述
開發者文件:Nominatim-wiki。這個文件居然只是寫在了wiki,看來是一個具有公益性質的api,看了文件發現要求也只是api呼叫最快不能超過1秒一次。
使用網址:Nominatim。api只有兩種,正向地理編碼,和反向地理編碼。在這個網址搜尋經緯度後,返回的結果很精確。
這裡寫圖片描述
點選details後,能出現更具體的地理資訊。
這裡寫圖片描述
評價:Nominatim簡單,好用。

OpenCageData

Gisgraphy

使用網站:Gisgraphy
使用網站截圖如下,但本人並未使用過。
這裡寫圖片描述