[javascript] 구글지도 V3에서 두 지점 사이의 거리를 계산

Google지도 V3에서 두 마커 사이의 거리를 어떻게 계산합니까? ( distanceFromV2 의 기능과 유사합니다 .)

감사..



답변

직접 계산하려면 Haversine 수식을 사용할 수 있습니다.

var rad = function(x) {
  return x * Math.PI / 180;
};

var getDistance = function(p1, p2) {
  var R = 6378137; // Earth’s mean radius in meter
  var dLat = rad(p2.lat() - p1.lat());
  var dLong = rad(p2.lng() - p1.lng());
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) *
    Math.sin(dLong / 2) * Math.sin(dLong / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d; // returns the distance in meter
};


답변

실제로 GMap3에는 메소드가있는 것 같습니다. 정적 방법입니다google.maps.geometry.spherical네임 스페이스 .

인수 2를 취합니다 LatLng 객체 기본 지구 반경 6378137 미터를 사용하지만 필요한 경우 기본 반지름을 사용자 정의 값으로 무시할 수 있습니다.

다음을 포함해야합니다.

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry"></script>

머리 부분에.

전화는 :

google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);


답변

GPS 위도 / 경도 2 점을 사용한 예.

var latitude1 = 39.46;
var longitude1 = -0.36;
var latitude2 = 40.40;
var longitude2 = -3.68;

var distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(latitude1, longitude1), new google.maps.LatLng(latitude2, longitude2));       


답변

JavaScript 코드의 시작 부분에 이것을 추가하십시오.

google.maps.LatLng.prototype.distanceFrom = function(latlng) {
  var lat = [this.lat(), latlng.lat()]
  var lng = [this.lng(), latlng.lng()]
  var R = 6378137;
  var dLat = (lat[1]-lat[0]) * Math.PI / 180;
  var dLng = (lng[1]-lng[0]) * Math.PI / 180;
  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  Math.cos(lat[0] * Math.PI / 180 ) * Math.cos(lat[1] * Math.PI / 180 ) *
  Math.sin(dLng/2) * Math.sin(dLng/2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var d = R * c;
  return Math.round(d);
}

그런 다음 다음과 같은 기능을 사용하십시오.

var loc1 = new GLatLng(52.5773139, 1.3712427);
var loc2 = new GLatLng(52.4788314, 1.7577444);
var dist = loc2.distanceFrom(loc1);
alert(dist/1000);


답변

//p1 and p2 are google.maps.LatLng(x,y) objects

function calcDistance(p1, p2) {
          var d = (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
          console.log(d);
}


답변

다음은이 포럼의 C # 구현입니다.

 public class DistanceAlgorithm
{
    const double PIx = 3.141592653589793;
    const double RADIO = 6378.16;

    /// <summary>
    /// This class cannot be instantiated.
    /// </summary>
    private DistanceAlgorithm() { }

    /// <summary>
    /// Convert degrees to Radians
    /// </summary>
    /// <param name="x">Degrees</param>
    /// <returns>The equivalent in radians</returns>
    public static double Radians(double x)
    {
        return x * PIx / 180;
    }

    /// <summary>
    /// Calculate the distance between two places.
    /// </summary>
    /// <param name="lon1"></param>
    /// <param name="lat1"></param>
    /// <param name="lon2"></param>
    /// <param name="lat2"></param>
    /// <returns></returns>
    public static double DistanceBetweenPlaces(
        double lon1,
        double lat1,
        double lon2,
        double lat2)
    {
        double dlon =  Radians(lon2 - lon1);
        double dlat =  Radians(lat2 - lat1);

        double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
        double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
        return (angle * RADIO) * 0.62137;//distance in miles
    }

}    


답변

구글에서는 구형 API를 사용하여 할 수 있습니다 .google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB); .

그러나 구형 투영 또는 헤르 세인 솔루션의 정밀도가 정확하지 않은 경우 (예 : 극에 가까워 지거나 먼 거리를 계산하는 경우) 다른 라이브러리를 사용해야합니다.

Wikipedia 에서 찾은 주제에 대한 대부분의 정보는 여기 에서 볼 수 있습니다 .

주어진 알고리즘의 정밀도가 적절한 지 확인하는 방법은 지구의 최대 및 최소 반경을 채우고 그 차이가 사용 사례에 문제를 일으킬 수 있는지 확인하는 것입니다. 이 기사 에서 더 많은 세부 정보를 찾을 수 있습니다

결국 Google API 또는 Haversine은 문제없이 대부분의 목적을 제공합니다.