2

ロケーションベースのサービスの多くは、特定の緯度経度ペアの周りの場所/会場/スポットを見つけるためのAPIを提供します。街全体でこれらの場所を検索する方法を調べています。

Google Maps Geocoderから境界を取得し、緯度/経度をインクリメントしてポイントを配置してグリッドを形成することで、都市のグリッドを構築できます。このアイデアを視覚化するために、このグリッドのプロトタイプを作成しました([グリッドの塗りつぶし]ボタンをクリックしてすべてのポイントを表示します)。

// 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);

次に、これらすべてのポイントを取得して、LBSAPIに対して検索を実行できます。

私の質問は、このグリッドを確立するためのより科学的な方法/アルゴリズムはありますか?それらについてもっと知りたいのですが。グリッドの境界に到達するまで、lat/lngsを任意にインクリメントしています。場所の密度は都市や都市の面積によって大きく異なるため、増分が小さすぎる場合と大きすぎる場合があります。これをもう少しうまく調整する方法についてのアイデアを探していますか?

4

2 に答える 2

2

おそらくより効率的でクリーンな方法は、都市の境界長方形を見つけることです。これは、各エッジが都市の境界点の間の極端な基点である長方形であり、それらを見つけることができれば、それらを繰り返し入力します。しかし、とにかく、それは基本的にあなたがすでに行っていることです。

場所の密度に関して、これを使用する特定のAPIはありますか?場所を検出するときにAPIのポイントの「到達範囲」がわかっている場合は、グリッドポイントを半径に近づけるだけで済みます。

そうは言っても、APIが境界内の場所の検索を直接サポートしているかどうかを調べたことがありますか?それはあなたの最善で最もクリーンな賭けかもしれません。


あなたのコメントを読んだ後、これは私が将来考えて洗練するつもりであるおそらく非効率的な方法ですが、それはあなたが始めるのに役立つかもしれません。

あなたの街の中心にポイントを置き、検出されたすべての場所を観察します。あなたの場所の凸包を見つけて、凸包の各場所に新しい点を置きます。次に、これらの新しく追加されたポイントの到達範囲内にあるすべての場所を場所のリストに追加します。

次に、それらの凸包を見つけて、同じプロセスを繰り返します。

これにより、人口がまばらな都市のポイント数が実際に減少する可能性があります。密集したものの場合、それは最適ではないかもしれませんが、それはあなたが作業トラックを始めるのに役立つかもしれません。

于 2010-07-01T07:11:23.927 に答える
0

私が同じ問題に直面している間。トップダウンの再帰的な方法でグリッド検索を実行するソリューションを思いつきました。これは、そのAPIがバウンディングボックス検索をサポートしている場合に機能します。最初はあなたの街を正方形と仮定します。次に、その正方形のAPIを使用してデータ/場所をフェッチします(バウンディングボックスクエリ)。ここで、返される場所の数がしきい値を超えている場合は、都市の正方形を4つの等しい正方形に分割し、正方形ごとにこのプロセスを繰り返します。返される場所の数が少ない場合は分割しないでください。これにより、森林や川などの非ビジネスエリア(正方形)へのグリッド検索が防止されます。そのためのプロトタイプのPythonコードは次のとおりです。

ここで、fetchは、南西緯度、logitude tupleとしてsw、北東緯度、logitude tupleとしてneを使用して、バウンディングボックスに基づいてAPIから結果をフェッチする関数です。

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 に答える