-2

私は住所を持つ顧客の 100 レコードを持っている単純なアプリに取り組んでいます。要件は、半径と住所のフィールドを持つことです。2 つのフィールドは、顧客を検索するためのパラメーターになります。

例: 半径 = 500 マイル、住所 = ニューヨーク

結果は、ニューヨーク近郊の 500 マイルの顧客である必要があります。

4

3 に答える 3

1

ニューヨークの位置をマークすることから始める必要があります。おそらく、テキスト入力での検索またはジオコーディングによって指定されたデフォルトの位置であり、文字列に方向を渡します。そのポイントをマークしたら、必要な半径で円を描きますこの円を描くと、顧客住所の各レコード間の距離を中心から計算し、結果が 500 マイル以下の場合は、顧客レコードにマーカーを追加します。

たとえば、ジオコーディング (オートコンプリートを想定) は次のようになります。

<input type="text" id="prueba" size="50">
<div id="map-canvas" style="width:800px;height:550px"> </div>

google.maps.event.addListener(autocomplete, 'place_changed', function() {
     var place = autocomplete.getPlace();
      if (place.geometry.viewport) {
        map.fitBounds(place.geometry.viewport);
      } else {
        map.setCenter(place.geometry.location);
        map.setZoom(17); 
      }
    marker.setPosition(place.geometry.location);
}

中心となる点を設定した後、円を描き、中心と各レコード位置の間の距離を計算します

var populationOptions = {
    strokeColor: "#FF0000",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#FF0000",
    fillOpacity: 0.35,
    map: map,
    center: marker.getPosition(),
    radius: 1000,
    editable: true
};

circle = new google.maps.Circle(populationOptions);

ここから距離を計算できます

var distance = google.maps.geometry.spherical.computeDistanceBetween(circleCenter, yourPosition);
于 2012-11-12T19:18:22.133 に答える
1

数学では、バウンディング ボックスを見つけてもよい場合は、harvesine 式または空間インデックスが必要です。インターネットとスタックオーバーフローには、harvesine 式の例がたくさんあります。空間インデックスは通常、境界ボックス、長方形、または正方形であり、空間充填曲線を使用して次元を削減し、クエリ速度を向上させることができます。空間インデックスについて読む: http://www.blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves

于 2012-11-12T19:13:19.653 に答える
1

別のオプションは、データベースで距離計算を行うことです。リレーショナル データベースがあり、各顧客住所レコードに緯度/経度があると仮定すると、緯度/経度の入力住所をジオコーディングし、SQL クエリを使用して入力場所と顧客の間の距離を計算できます。次に、指定された半径でクエ​​リ結果をフィルター処理します。クエリ結果から、フィルタリングされた顧客をマップ上にプロットするだけです。

SQL を使用して緯度/経度から距離を計算するS O に関する投稿がいくつかあります。

を使用しgoogle.maps.Geocoderて、指定された住所の緯度/経度をジオコーディングできます。

于 2012-11-12T19:57:47.857 に答える