在哪里可以找到城市/城镇位置数据以进行基于位置的搜索?

问题描述 投票:4回答:3

我需要用x英里的城镇功能来实现查找条目,因此我有一个附有自动建议功能的城镇箱。目前,我正在使用Google的Geocoding API来获取自动建议结果的数据,但显然我们无法调整或更改此数据,并且它并不总是能提供明智的建议(甚至带有国家/地区提示)。城镇/城市位置数据还有其他来源吗?我试图查看OpenStreetMap是否可以导出内容,但我只能找到地图图块或矢量地图数据,而找不到城镇/城市名称和位置的POI数据。

任何建议表示赞赏。谢谢。

google-maps geolocation geocoding
3个回答
5
投票

Geonames.org拥有可下载的城市列表,甚至包括世界上许多国家的邮政编码,以及它们相应的经/纬度。它受知识共享署名3.0许可的约束,这意味着您可以将其商业使用,但除其他事项外,您还必须提供署名。

尽管拥有可下载的列表可能意味着在实现搜索算法的所有方面方面需要做更多的工作,但有一线希望是,您不会将自己与第三方Web服务的正常运行时间/可用性联系在一起。 。

唯一缺少的其他部分是距离计算公式。您可以使用greater-circle distance formula计算距离。

我已经多次这样做了。第一次编写代码时,需要花一点时间将所有内容包裹起来,但是一旦完成,这只是小菜一碟。

我可能应该提到我是SmartyStreets的创始人。我们进行街道地址验证,不仅可以告诉您地址是否好(这在很多方面都有帮助),而且还可以为您提供给定街道地址的经纬度坐标,然后插入上述解决方案,以确定与附近地点的距离。


2
投票

我会说您还有两个其他选择来获得所需的功能。

首先,您可以使用kudge来将结果集中在更有意义的结果上(尽管我不会强烈建议这种方法满足您的需求。)

在对Google的Geocoding API进行初始查询以获取自动建议结果的数据之前,首先要确定城镇所在的国家。然后,您可以使用country字符串作为Geocoding查询的后缀。

类似:

  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

看看附近的地点功能,这正是您想要的。

http://www.geoplugin.com/webservices/extras


0
投票

签出http://geohash.org/,此站点使用许多您可能想使用的api。另请参见article有关此站点的历史记录

© www.soinside.com 2019 - 2024. All rights reserved.