Tính toán đơn giản để làm việc với vĩ độ / kinh độ và khoảng cách km?


119

Có phép tính đơn giản nào mà tôi có thể thực hiện sẽ chuyển km thành một giá trị mà tôi có thể thêm vào vĩ độ hoặc vĩ độ float để tính toán hộp giới hạn cho các tìm kiếm không? Nó không cần phải hoàn toàn chính xác.

Ví dụ: nếu tôi được cung cấp vĩ độ / kinh độ cho London, Anh (51.5001524, -0.1262362) và tôi muốn tính toán kinh độ sẽ là 25km về phía đông / tây từ điểm đó và kinh độ sẽ là 25km về phía bắc / nam của nó điểm, tôi cần làm gì để chuyển 25km thành số thập phân để thêm vào các giá trị trên?

Tôi đang tìm một quy tắc chung, tức là: 1km == +/- 0.XXX

Biên tập:

Tìm kiếm ban đầu của tôi cho "lat lon" không trả lại kết quả này:

Làm thế nào để tính toán hộp giới hạn cho một vị trí vĩ độ / lng nhất định?

Câu trả lời được chấp nhận có vẻ phù hợp với yêu cầu của tôi.


Câu trả lời:


220

Các chuyển đổi gần đúng là:

  • Vĩ độ: 1 độ = 110,574 km
  • Kinh độ: 1 deg = 111.320 * cos (vĩ độ) km

Điều này không hoàn toàn chính xác đối với quá trình làm phẳng cực của Trái đất - vì điều đó có thể bạn muốn một công thức phức tạp hơn bằng cách sử dụng ellipsoid tham chiếu WGS84 (mô hình được sử dụng cho GPS). Nhưng lỗi có lẽ không đáng kể cho mục đích của bạn.

Nguồn: http://en.wikipedia.org/wiki/Latitude

Thận trọng : Lưu ý rằng tọa độ độ dài được biểu thị bằng độ, trong khi coshàm trong hầu hết (tất cả?) Ngôn ngữ thường chấp nhận radian, do đó cần chuyển đổi độ sang radian .


Ý bạn là cos (kinh độ) trong công thức thứ hai?
Odys

1
Làm thế nào bạn nghĩ ra điều này? Tôi đang thiếu một cái gì đó, bạn có thể vui lòng nói rõ hơn về tính toán Kinh độ? Ty
Odys

5
@Odys: Nếu bạn đang so sánh hai điểm nằm trên cùng một đường kinh độ (bắc / nam), chúng nằm trên một vòng tròn lớn và hệ số chuyển đổi chỉ là chu vi địa cực của Trái đất chia cho 360 độ. Nhưng nó khác đối với các phép đo đông-tây, vì (ngoại trừ đường xích đạo) bạn không đo dọc theo "vòng tròn lớn", vì vậy "chu vi" ở một vĩ độ nhất định sẽ nhỏ hơn. Và hệ số hiệu chỉnh hóa ra là cosin của vĩ độ.
Jim Lewis

17
Giải thích của tôi: cos(0°) = 1=> Do đó, không có hệ số hiệu chỉnh nào được áp dụng khi tính toán tại đường xích đạo. Các kinh độ là rộng nhất ở đó. cos(90°) = 0=> Ở các cực, các kinh độ gặp nhau tại một điểm. Không có khoảng cách được tính toán.
Jenny O'Reilly,

4
@Stijn: Bạn cần chuyển đổi từ độ sang radian trước khi gọi Math.cos ().
Jim Lewis


1

http://www.jstott.me.uk/jcoord/ - sử dụng thư viện này

            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);


1

Cảm ơn Jim Lewis vì câu trả lời tuyệt vời của anh ấy và tôi muốn minh họa giải pháp này bằng hàm của tôi trong 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)
    }

Trong hàm này để chuyển đổi khoảng cách, tôi sử dụng các công thức sau:

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

Tôi nghĩ nó phải là "lat * pi / 180"
magamig

1

Tại sao không sử dụng các truy vấn không gian địa lý được xây dựng đúng cách ???

Đây là trang tham chiếu máy chủ SQL trên hàm không gian địa lý STContains:

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

hoặc nếu bạn không muốn sử dụng chuyển đổi hộp và radian, bạn có thể luôn sử dụng hàm khoảng cách để tìm các điểm bạn cần:

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

Cần có chức năng tương tự cho hầu hết mọi cơ sở dữ liệu ngoài đó.

Nếu bạn đã triển khai lập chỉ mục không gian địa lý một cách chính xác, các tìm kiếm của bạn sẽ nhanh hơn cách tiếp cận bạn đang sử dụng


1
Vui lòng dành một chút thời gian để đọc qua phần trợ giúp chỉnh sửa trong trung tâm trợ giúp . Định dạng trên Stack Overflow khác với các trang khác.
Dharman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.