国外地理编码网站——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>
很尴尬这里只有js版本的函数。注意第二个参数,是指编码时的经度,错了的话函数返回结果也会错误。该函数来自此网址Compressed Lat/Lng Encoding/Decoding,对于此种编码经纬度的方法解释来自Google Polyline Encoding Format。这可是谷歌地图都在用的编码方式。
Nominatim
这是从graphhopper的geocoding文档里发现的额外供应商。
开发者文档:Nominatim-wiki。这个文档居然只是写在了wiki,看来是一个具有公益性质的api,看了文档发现要求也只是api调用最快不能超过1秒一次。
使用网址:Nominatim。api只有两种,正向地理编码,和反向地理编码。在这个网址搜索经纬度后,返回的结果很精确。
点击details后,能出现更具体的地理信息。
评价:Nominatim简单,好用。
OpenCageData
使用网站:opencagedata
开发者文档:opencagedata-api
使用网站截图如下,但本人并未使用过。
Gisgraphy
使用网站:Gisgraphy
使用网站截图如下,但本人并未使用过。