我需要实现具有x英里城镇功能的查找条目,因此我有一个附带自动提示的城镇信箱。目前我正在使用Google的地理编码API来获取自动提取结果的数据,但我们显然无法调整或更改此数据,并且它并不总是提出合理的建议(即使有国家提示)。是否还有城镇/城市位置数据的其他来源?我试图看看是否可以从OpenStreetMap或其他东西获得导出,但我只能找到地图图块或矢量地图数据,而不是城镇/城市名称和位置的POI数据。
任何建议表示赞赏。 感谢。
答案 0 :(得分:5)
Geonames.org有一个可下载的城市列表,甚至包括世界上许多国家的邮政编码以及相应的纬度/经度点。它属于知识共享署名3.0许可,这意味着您可以在商业上使用它,但除其他外,您必须提供归属。
虽然拥有可下载列表可能意味着在实现搜索算法的所有方面方面需要做更多的工作,但一线希望是您不会将自己与第三方Web的正常运行时间/可用性结合起来服务。
唯一缺少的是距离计算公式。您可以使用greater-circle distance formula来计算距离。
我自己做过很多次。第一次编写代码时,需要花一些时间来处理所有内容,但是一旦你这样做,那么它就是一块蛋糕。
我应该提一下,我是SmartyStreets的创始人。我们进行基于街道的地址验证,我们不仅可以告诉您地址是否良好(这有很多方面有帮助),但我们也可以为您提供给定街道地址的纬度/经度坐标。然后插入上述解决方案以确定与附近地点的距离。
答案 1 :(得分:2)
我想说你还有另外两个选项来获得你需要的功能。
首先,您可以使用kludge将结果集中到更有意义的结果上(虽然我不强烈推荐这种方法,但它可能满足您的需求。)
在您初次查询Google的地理编码API以获取自动提示结果的数据之前,请先确定该城所在的国家/地区。然后,您可以将国家/地区字符串用作地理编码查询的后缀。
类似的东西:
var country = 'UK'; // from initial query, reverse geocode, etc.
geocoder.geocode({
'address': address + ', ' + country
},
请参阅此问题的答案以获取示例。 Google's Geocoder returns wrong country, ignoring the region hint
其次,你“显然无法调整或改变这些数据”的前提是有缺陷的。您当然可以根据国家/地区过滤结果。类似以下代码段的内容显示了如何深入查看结果。
geocoder.geocode({
'address': address
},
function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
for(var i = 0, l = results.length; i < l; i++) {
for (var j = 0, l2 = results[i].address_components.length; j < l2; j++) {
for (var k = 0, l3 = results[i].address_components[j].types.length; k < l3; k++) {
if(results[i].address_components[j].types[k]=="country") {
var country = results[i].address_components[j].long_name;
// do stuff based on the country
// add the result to your auto-suggest, etc...
}
}
}
}
});
}
最后,如果您实现了CGI包装器来执行地理编码,则可以缓存结果。这样您的应用程序就会自动为您构建数据库。这将节省实际上必须根据已知结果执行地理编码。我认为这几乎就是您在问题中所暗示的内容,如果您确实找到了可靠的数据源,则没有理由不能使用已知结果预先填充缓存。
看一下使用Maps Api概述各种地理编码策略的文档 - 它讨论了缓存等问题。 https://developers.google.com/maps/articles/geocodestrat
修改强>
您可以使用类似geoPlugin
的内容http://www.geoplugin.com/webservices/php#php_class
看看附近的地方功能,这正是你想要的。
答案 2 :(得分:0)
查看http://geohash.org/,此网站使用您可能想要使用的许多API。另请参阅有关此网站历史记录的article