私は住所を持つ顧客の 100 レコードを持っている単純なアプリに取り組んでいます。要件は、半径と住所のフィールドを持つことです。2 つのフィールドは、顧客を検索するためのパラメーターになります。
例: 半径 = 500 マイル、住所 = ニューヨーク
結果は、ニューヨーク近郊の 500 マイルの顧客である必要があります。
私は住所を持つ顧客の 100 レコードを持っている単純なアプリに取り組んでいます。要件は、半径と住所のフィールドを持つことです。2 つのフィールドは、顧客を検索するためのパラメーターになります。
例: 半径 = 500 マイル、住所 = ニューヨーク
結果は、ニューヨーク近郊の 500 マイルの顧客である必要があります。
ニューヨークの位置をマークすることから始める必要があります。おそらく、テキスト入力での検索またはジオコーディングによって指定されたデフォルトの位置であり、文字列に方向を渡します。そのポイントをマークしたら、必要な半径で円を描きますこの円を描くと、顧客住所の各レコード間の距離を中心から計算し、結果が 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);
数学では、バウンディング ボックスを見つけてもよい場合は、harvesine 式または空間インデックスが必要です。インターネットとスタックオーバーフローには、harvesine 式の例がたくさんあります。空間インデックスは通常、境界ボックス、長方形、または正方形であり、空間充填曲線を使用して次元を削減し、クエリ速度を向上させることができます。空間インデックスについて読む: http://www.blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves。
別のオプションは、データベースで距離計算を行うことです。リレーショナル データベースがあり、各顧客住所レコードに緯度/経度があると仮定すると、緯度/経度の入力住所をジオコーディングし、SQL クエリを使用して入力場所と顧客の間の距離を計算できます。次に、指定された半径でクエリ結果をフィルター処理します。クエリ結果から、フィルタリングされた顧客をマップ上にプロットするだけです。
SQL を使用して緯度/経度から距離を計算するS O に関する投稿がいくつかあります。
を使用しgoogle.maps.Geocoder
て、指定された住所の緯度/経度をジオコーディングできます。