3

重複の可能性:
「カラスが飛ぶように」距離を計算するphp

ユーザーの場所を取得し、ユーザーの周囲の計算された領域内にあるXMLファイルからカスタムマーカーポイントを表示できるGoogleMapsページを開発しようとしています。

物事をより明確にするために:

  1. WebConfigファイルから半径パラメータがあります。たとえば5000(メートル単位)
  2. 地図上でユーザーの場所を見つけました。
  3. 私が所有するxmlリストを使用して(xmlには各ストアのLat-Long値があります)、ユーザーの場所を中心として5 km^2のエリア範囲内にあるカスタムマーカーをマップに配置します。

この目標を達成する方法はありますか?

ユーザーの位置座標と距離パラメータ(私の場合は5000など)を渡すだけで、ポイントの緯度と経度の値を計算するにはどうすればよいですか?

編集 :

私のXMLドキュメントは、全国のホワイトグッズストアを含めてかなり巨大です。私の主な問題は、ユーザーの現在の場所を使用して、これらのデータ行(long、latt)をフィルタリングすることです。

I need something like:
func distanceCale(int long, int latt, int radius)
to return me some values that can help me filter my XML data.

I guess my question was not clear enough at the firs place. :)
4

1 に答える 1

3

これは、 Haversine式を使用して実現できます。この式は 、特定の半径内のマーカーを示すXMLファイルのデモで使用されています。

アプリケーションでは、JavaScriptコードを使用してXMLファイルからマーカーを生成します。

function deg2rad(degrees){
radians = degrees * (Math.PI/180);
//document.write(radians);
return radians;

}
function Haversine(lat1,lon1,lat2,lon2) {
  deltaLat = lat2 - lat1 ;
  deltaLon = lon2 - lon1 ;
  earthRadius = 3959; // in miles 6371 in meters.
  alpha    = deltaLat/2;
  beta     = deltaLon/2;
  a        = Math.sin(deg2rad(alpha)) * Math.sin(deg2rad(alpha)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(deg2rad(beta)) * Math.sin(deg2rad(beta)) ;
  c        = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  distance =  earthRadius * c;
  return distance.toFixed(2);
}

XMLを解析するときにHaversine関数が使用されます

var radius = document.getElementById('radiusSelect').value;
       for (var i = 0; i < markerNodes.length; i++) {
         var lat = parseFloat(markerNodes[i].getAttribute("lat"));
         var lng = parseFloat(markerNodes[i].getAttribute("lng"));
         var latlng = new google.maps.LatLng(
              lat,
              lng);
        var  distance = Haversine(center.lat(),center.lng(),lat,lng);
        if(distance<=radius) {    
         createOption(name, distance, i);
         createMarker(latlng, name, distance);
         bounds.extend(latlng);
         }
于 2012-12-19T09:55:38.420 に答える