[algorithm] 위도 / 경도 및 km 거리 작업을위한 간단한 계산?

km를 lat 또는 lon float에 추가하여 검색을위한 경계 상자를 계산할 수있는 값으로 변환 할 수있는 간단한 계산이 있습니까? 완전히 정확할 필요는 없습니다.

예를 들어 영국 런던의 위도 / 경도 (51.5001524, -0.1262362)가 주어졌고 그 지점에서 동 / 서 25km의 위도를 계산하고 그 중 남 / 북 25km를 계산하고 싶었습니다. 포인트, 위의 값에 더하기 위해 25km를 소수점으로 변환하려면 어떻게해야합니까?

일반적인 경험 법칙을 찾고 있습니다. 예 : 1km == +/- 0.XXX

편집하다:

“lat lon”에 대한 원래 검색이이 결과를 반환하지 않았습니다.

주어진 위도 / 경도 위치에 대한 경계 상자를 계산하는 방법은 무엇입니까?

받아 들여진 대답은 내 요구 사항에 적합합니다.



답변

대략적인 변환은 다음과 같습니다.

  • 위도 : 1도 = 110.574km
  • 경도 : 1 deg = 111.320 * cos (latitude) km

이것은 지구의 극좌표 평탄화를 완전히 수정하지 못합니다. WGS84 참조 타원체 (GPS에 사용되는 모델)를 사용하는 더 복잡한 공식을 원할 것입니다. 그러나 오류는 귀하의 목적에 따라 무시할 수 있습니다.

출처 : http://en.wikipedia.org/wiki/Latitude

주의 : latlong 좌표는 각도로 표현되는 반면 cos대부분의 (모든?) 언어 의 함수는 일반적으로 라디안을 허용하므로 라디안 변환 도 필요합니다.


답변

Java, Javascript 또는 PHP를 사용하는 경우 재미있게 복잡하지만 여전히 빠른 삼각법을 사용하여 이러한 계산을 정확하게 수행하는 라이브러리가 있습니다.

http://www.jstott.me.uk/jcoord/


답변

http://www.jstott.me.uk/jcoord/- 이 라이브러리 사용

            LatLng lld1 = new LatLng(40.718119, -73.995667);
            LatLng lld2 = new LatLng(51.499981, -0.125313);
            Double distance = lld1.distance(lld2);
            Log.d(TAG, "Distance in kilometers " + distance);


답변

UTM 좌표에 대한 언급을 보지 못했다는 것이 흥미 롭습니다.

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system .

적어도 같은 영역에 km를 추가하려면 간단해야합니다 (Python : https://pypi.org/project/utm/ ).

utm.from_latlon 및 utm.to_latlon.


답변

그의 훌륭한 답변에 대해 Jim Lewis 에게 감사 드리며 Swift의 내 기능 으로이 솔루션을 설명하고 싶습니다.

func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
        let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
        let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
        let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax

        let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
        let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat / .pi / 180))
        return CLLocation(latitude: lat, longitude: lng)
    }

이 함수에서 거리를 변환하려면 다음 공식을 사용합니다.

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))


답변

적절하게 공식화 된 지리 공간 쿼리를 사용하지 않는 이유는 무엇입니까 ???

다음은 STContains 지리 공간 함수의 SQL 서버 참조 페이지입니다.

https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

또는 상자 및 라디안 변환을 사용하지 않으려면 항상 거리 함수를 사용하여 필요한 포인트를 찾으십시오.

DECLARE @CurrentLocation geography;
SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)

SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km

거의 모든 데이터베이스에 유사한 기능이 있어야합니다.

지리 공간 색인을 올바르게 구현했다면 검색이 사용중인 접근 방식보다 훨씬 빠릅니다.


답변