google - maps sdk for android




두 개의 지리적 포인트 간 거리 가져 오기 (5)

사용자가있는 곳에서 가장 가까운 곳을 확인하는 앱을 만들고 싶습니다. 사용자의 위치를 ​​쉽게 얻을 수 있고 위도와 경도가있는 장소 목록을 얻을 수 있습니다.

현재 위치와 가장 가까운 목록의 위치를 ​​아는 가장 좋은 방법은 무엇입니까?

Google API에서 아무 것도 찾을 수 없습니다.

나는 계산에 의지 할 필요가 있고 그것을 계산하기 위해 수학을해야한다고 걱정한다.

너희들은 어떻게 생각하니?

읽거나 답장 해 주셔서 감사드립니다.


LatLng간에 거리를 가져 오는 방법에는 두 가지가 있습니다.

public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)

이것 좀 봐

두 번째

public float distanceTo (Location dest) praveen 님의 답변입니다.


근사화 된 솔루션 (투영법 투영을 기반으로 함)이 훨씬 빠릅니다 (1 trig 및 1 제곱근 만 필요함).

이 근사값은 점수가 너무 멀리 떨어져 있지 않은 경우 적합합니다. 진짜 haversine 거리에 비해 항상 과대 평가 됩니다. 예를 들어 두 지점 간 델타 위도 또는 경도 가 4 자리 수를 초과하지 않으면 실제 거리에 0.05382 % 하지 않습니다 .

표준 수식 (Haversine)은 정확한 것입니다 (즉, 지구상의 경도 / 위도에 상관없이 작동합니다). 그러나 7 개의 삼각 함수와 2 개의 제곱근이 필요하므로 훨씬 느립니다 . 두 점의 거리가 너무 멀지 않고 절대 정밀도가 중요하지 않은 경우이 대략적인 버전 (Equirectangular)을 사용할 수 있습니다. 삼각 함수 및 삼각형 루트를 하나만 사용하므로 훨씬 빠릅니다.

// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;

다음 중 하나를 사용하여 이를 더 최적화 할 수 있습니다.

  1. 단순히 거리를 다른 것으로 비교하면 제곱근을 제거합니다 (이 경우 두 제곱 거리를 비교).
  2. 한 마스터 점에서 다른 점까지의 거리를 계산 하면 코사인 을 계산할 수 있습니다 (이 경우 마스터 점을 중심으로 한 등변 투영을 수행하므로 모든 비교에 대해 한 번 코사인을 계산할 수 있습니다).

자세한 내용은 http://www.movable-type.co.uk/scripts/latlong.html 참조하십시오.

몇 가지 언어로 된 Haversine 수식의 훌륭한 참조 구현이 있습니다 : http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe


사용할 수있는 몇 가지 방법이 있지만 사용자의 고도와 다른 지점의 고도를 알고 있다면 가장 먼저 알아야 할 것이 무엇인지 결정하는 것이 가장 좋습니다.

정확도에 따라 Haversine 또는 Vincenty 공식을 조사 할 수 있습니다.

이 페이지는 수식을 자세히 설명하고 수학적으로 덜 기울기 때문에 스크립트로 구현하는 방법을 설명합니다.

Haversine 공식 : http://www.movable-type.co.uk/scripts/latlong.html

Vincenty 공식 : http://www.movable-type.co.uk/scripts/latlong-vincenty.html

수식의 의미에 문제가있는 경우 댓글을 달아 주시면 답변을 드리겠습니다. :)



private float getDistance(double lat1, double lon1, double lat2, double lon2) {
        float[] distance = new float[2];
        Location.distanceBetween(lat1, lon1, lat2, lon2, distance);
        return distance[0];
    }




maps