2

许多基于位置的服务都提供了用于查找给定纬度经度对周围的地点/地点/地点的 API。我正在研究如何在整个城市中搜索这些地方。

我可以通过从谷歌地图地理编码器获取城市的边界,然后增加纬度/经度以放置点以形成网格来为城市构建网格。我已经制作了这个网格的原型(单击“填充网格”按钮查看所有点)以可视化这个想法。

// gather a collection of lat/long pairs that represents a grid of the city
    var latIncrement = .04;
    var lngIncrement = .04;
    var newLat = nw.lat();
    while(newLat >= sw.lat()) {
      var newLng = nw.lng();
      while(newLng <= ne.lng()) {
        // western and northern border as well as grid infill
        addMarker(new google.maps.LatLng(newLat, newLng));
        newLng += lngIncrement;
      }

      // eastern border
      addMarker(new google.maps.LatLng(newLat, ne.lng()));
      newLat -= latIncrement;
    }

    // southern border
    var newLng = sw.lng();
    while(newLng <= se.lng()) {
      addMarker(new google.maps.LatLng(sw.lat(), newLng));
      newLng += lngIncrement;
    }
    addMarker(se);

然后,我可以获取所有这些点并针对 LBS API 运行搜索。

我的问题是,有没有更科学的方法/算法来建立这个网格?我想了解更多关于他们的信息。我只是任意增加纬度/经度,直到到达网格的边界。地方的密度会因城市和城市面积而有很大差异,因此增量有时会太小,有时会太大。我正在寻找有关如何更好地调整它的想法?

4

2 回答 2

2

一种可能更有效/更干净的方法是找到城市的边界矩形,即每个边缘都是城市边界点之间的极端基点的矩形,如果你能找到它们,然后迭代地填充它们。但这基本上是你已经在做的,无论如何。

至于位置密度,您是否有一个特定的 API 可以使用它?如果您在检测位置时知道 API 点的“范围”,那么您只需将网格点设置为与其半径一样近。

话虽如此,您是否考虑过 API 是否直接支持搜索边界内的地点?这可能是您最好和最干净的选择。


阅读您的评论后,这可能是一种效率低下的方式,我将在未来思考和完善,但它可能会帮助您入门。

在您的城市中心放置一个点,并观察检测到的所有位置。找到您的位置的凸包,并在凸包上的每个位置放置一个新点。然后,将这些新添加点范围内的所有位置添加到您的位置列表中。

然后,找到它们的凸包,并重复相同的过程。

对于人口稀少的城市,这实际上可能会减少您的积分数量。对于密集的,它可能不是最佳的,但它可能会让你开始工作。

于 2010-07-01T07:11:23.927 回答
0

当我面临同样的问题时。我想出了一个解决方案,您将以自上而下的递归方式进行网格搜索。如果该 API 支持边界框搜索,这将起作用。最初假设你的城市是一个正方形。现在在该正方形中使用 API 获取数据/位置(边界框查询)。现在,如果返回的地方的数量超过某个阈值,则将城市广场分成 4 个相等的正方形,并对每个正方形重复该过程。如果返回的位置数量较少,请不要拆分。这将防止网格搜索到非商业区域(广场),如森林、河流等。这是 Python 原型代码:

这里的 fetch 是基于边界框从 API 中获取结果的函数,其中 sw 为西南纬度,logitude 元组和 ne 为东北纬度,logitude 元组

allresults = []

def grid_search(sw,ne):
    global results
    results = fetch(sw,ne)
    if len(results) <= 10:
        return
    allresults.append(results)
    swlat,swlon = sw
    nelat,nelon = ne
    grid_search( (swlat + delta, swlon), (nelat, sw + delta) )
    grid_search( (swlat + delta, swlon + delta), ne )
    grid_search( sw, (swlat + delta, swlon + delta) )
    grid_search( (swlat,swlon + delta), (swlat + delta, nelon) )
于 2016-10-27T14:33:01.890 回答