Google지도 V3에서 두 마커 사이의 거리를 어떻게 계산합니까? ( distanceFrom
V2 의 기능과 유사합니다 .)
감사..
답변
직접 계산하려면 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은 문제없이 대부분의 목적을 제공합니다.