Làm thế nào để chuyển đổi vĩ độ hoặc kinh độ sang mét?


127

Nếu tôi đọc được kinh độ hoặc vĩ độ ở định dạng NMEA tiêu chuẩn thì có cách / công thức dễ dàng nào để chuyển đổi số đọc đó thành mét, sau đó tôi có thể triển khai trong Java (J9) không?

Chỉnh sửa: Ok có vẻ như những gì tôi muốn làm là không thể dễ dàng , nhưng những gì tôi thực sự muốn làm là:

Giả sử tôi có vĩ độ và độ dài của một điểm và vĩ độ và độ dài của một người dùng, có cách nào dễ dàng để so sánh chúng để quyết định khi nào thì thông báo cho người dùng biết rằng họ đang ở trong một khoảng cách hợp lý gần với điểm truyền đi không? Tôi nhận ra hợp lý là chủ đề nhưng điều này có dễ dàng làm được hay vẫn là toán học quá-y?


2
Ý bạn là với UTM? vi.wikipedia.org/wiki/…
Adrian Archer

1
Ý bạn là gì khi chuyển đổi vĩ độ / dài sang mét? mét từ đâu? Bạn đang tìm cách tính khoảng cách dọc theo bề mặt trái đất từ ​​tọa độ này đến tọa độ khác?
Baltimark

2
Xác định "điểm tham chiếu". Xác định "hợp lý". Đây có thực sự là điều bạn muốn biết: "làm cách nào để tính khoảng cách giữa hai điểm với vĩ độ và kinh độ của chúng?"
Baltimark

2
Tôi tình cờ gặp câu hỏi này muốn thực hiện các truy vấn SQL về vĩ độ và kinh độ và tìm thấy bài viết tuyệt vời này với một số mã Java ở dưới cùng. Nó cũng có thể khiến bạn quan tâm.
Kristof Van Landschoot

Câu trả lời:


173

Đây là một hàm javascript:

function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
    var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}

Giải thích: https://en.wikipedia.org/wiki/Haversine_formula

Công thức hasrsine xác định khoảng cách đường tròn lớn giữa hai điểm trên một hình cầu cho trước các kinh độ và vĩ độ của chúng.


2
Đối với những người đang tìm kiếm một thư viện để chuyển đổi giữa wgs và utm: github.com/urbanetic/utm-converter
Aram Kocharyan

3
Sẽ thực sự biết ơn nếu ai đó có thể thêm một số nhận xét giải thích về đoạn mã trên. Cảm ơn trước!
Ravindranath Akila

Tìm thấy điều này mà bình luận này dường như là một sự chấp nhận. Liên kết cũng cho biết nó dựa trên bài báo này về tính toán khoảng cách. Vì vậy, bất kỳ câu hỏi nào chưa được trả lời nên được tìm thấy trong liên kết ban đầu. :)
Joachim

Làm cách nào để thêm độ cao vào phép tính này?
dangalg

62

Vì bạn đang tìm kiếm một công thức đơn giản, đây có lẽ là cách đơn giản nhất để làm điều đó, giả sử rằng Trái đất là một hình cầu có chu vi 40075 km.

Chiều dài tính bằng mét của 1 ° vĩ độ = luôn luôn là 111,32 km

Chiều dài tính bằng mét của 1 ° kinh độ = 40075 km * cos (vĩ độ) / 360


2
Phương trình kinh độ hoạt động như thế nào? với vĩ độ 90 độ, bạn mong đợi nó hiển thị gần 111km; nhưng thay vào đó nó hiển thị 0; Tương tự, giá trị gần với nó cũng gần 0.
Reece

9
Vĩ độ là 0 ° ở xích đạo và 90 ° ở cực (và không ngược lại). Đối với đường xích đạo, công thức cho 40075 km * cos (0 °) / 360 = 111 km. Đối với cực, công thức cho 40075 * cos (90 °) / 360 = 0 km.
Ben

Tôi nghĩ rằng cách tiếp cận này đơn giản, đặc biệt là vì câu hỏi không yêu cầu khoảng cách chính xác giữa hai điểm, mà là nếu chúng "đủ gần một cách hợp lý". Với những công thức này, chúng tôi dễ dàng kiểm tra xem người dùng có nằm trong một hình vuông ở giữa điểm tham chiếu . Kiểm tra hình vuông đơn giản hơn nhiều so với hình tròn.
Ben

29

Để ước tính khoảng cách ngắn giữa hai tọa độ, tôi đã sử dụng công thức từ http://en.wikipedia.org/wiki/Lat-lon :

m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );

.

Trong đoạn mã dưới đây, tôi đã để lại các số thô để hiển thị mối quan hệ của chúng với công thức từ wikipedia.

double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;

latMid = (Lat1+Lat2 )/2.0;  // or just use Lat1 for slightly less accurate estimate


m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );

deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);

dist_m = sqrt (  pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );

Mục nhập wikipedia nói rằng calc khoảng cách nằm trong vòng 0,6m cho 100km theo chiều dọc và 1cm cho 100km theo vĩ độ nhưng tôi chưa xác minh điều này vì bất kỳ nơi nào gần đó độ chính xác đều tốt cho việc sử dụng của tôi.


3
Lưu ý rằng vào năm 2017, trang Wikipedia có một công thức khác (có vẻ đã được cải tiến).
Gorka Llona

3
Đúng, công thức trong Wikipedia hơi khác một chút, nhưng có vẻ như công thức Wikipedia khác dựa trên kết quả tương tự từ câu trả lời SO tuyệt vời này , nơi ai đó đã thực sự tính toán.
not2qubit

10

Vĩ độ và kinh độ chỉ định điểm chứ không phải khoảng cách, vì vậy câu hỏi của bạn hơi vô nghĩa. Nếu bạn đang hỏi về khoảng cách ngắn nhất giữa hai điểm (vĩ độ, kinh độ), hãy xem bài viết này trên Wikipedia về khoảng cách đường tròn lớn.


9
Ông đang nói về chuyển đổi tham chiếu nên câu trả lời của bạn không phải là đến điểm (không có ý định chơi chữ)
Paulo Neves

1
Và để tham khảo hướng dẫn chuyển đổi để chuyển đổi dữ liệu vị trí GPS. www.microem.ru/pages/u_blox/tech/dataconvert/GPS.G1-X-00006.pdf
Paulo Neves

2
Anh ta muốn biết bao nhiêu độ trên mét để anh ta có thể tìm thấy khoảng cách giữa 2 điểm. Đọc giữa các dòng.
theAnonymous

1
và câu trả lời của bạn còn vô nghĩa hơn nhiều
jerinho.com

7

Có rất nhiều công cụ sẽ làm cho việc này trở nên dễ dàng. Xem câu trả lời của monjardin để biết thêm chi tiết về những gì liên quan.

Tuy nhiên, làm điều này không hẳn là khó. Có vẻ như bạn đang sử dụng Java, vì vậy tôi khuyên bạn nên xem xét một cái gì đó như GDAL . Nó cung cấp các trình bao bọc java cho các quy trình của họ và họ có tất cả các công cụ cần thiết để chuyển đổi từ Lat / Lon (tọa độ địa lý) sang UTM (hệ tọa độ dự kiến) hoặc một số phép chiếu bản đồ hợp lý khác.

UTM rất hay, vì nó là mét, rất dễ làm việc. Tuy nhiên, bạn sẽ cần phải có được vùng UTM thích hợp để nó hoạt động tốt. Có một số mã đơn giản có sẵn qua googling để tìm vùng thích hợp cho cặp vĩ độ / kinh độ.


7

Trái đất là một bề mặt bất thường đến khó chịu, vì vậy không có công thức đơn giản nào để làm điều này một cách chính xác. Bạn phải sống với một mô hình gần đúng của trái đất và chiếu tọa độ của bạn lên đó. Mô hình tôi thường thấy được sử dụng cho điều này là WGS 84 . Đây là những gì các thiết bị GPS thường sử dụng để giải quyết chính xác vấn đề tương tự.

NOAA có một số phần mềm bạn có thể tải xuống để trợ giúp việc này trên trang web của họ .


6

Đây là phiên bản R của hàm bh- , chỉ trong trường hợp:

measure <- function(lon1,lat1,lon2,lat2) {
    R <- 6378.137                                # radius of earth in Km
    dLat <- (lat2-lat1)*pi/180
    dLon <- (lon2-lon1)*pi/180
    a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1-a))
    d <- R * c
    return (d * 1000)                            # distance in meters
}

2

Một hải lý (1852 mét) được định nghĩa là một cung kinh độ tại đường xích đạo. Tuy nhiên, bạn cần xác định phép chiếu bản đồ (xem thêm UTM ) mà bạn đang làm việc để việc chuyển đổi thực sự có ý nghĩa.


1
Không, hải lý được định nghĩa theo tiêu chuẩn quốc tế ( v en.wikipedia.org/wiki/Nautical_mile ) là 1852m. Mối quan hệ của nó với phép đo cung trên bề mặt của một hình cầu chẳng hạn như Trái đất hiện nay vừa mang tính lịch sử vừa mang tính gần đúng.
hiệu suất cao

2

Có khá nhiều cách để tính toán điều này. Tất cả chúng đều sử dụng các tiệm cận của lượng giác cầu trong đó bán kính là một của trái đất.

thử http://www.movable-type.co.uk/scripts/latlong.html để biết một chút phương pháp và mã bằng các ngôn ngữ khác nhau.


1
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function

Tôi thấy liên kết đầy bị hỏng.
tshepang

1

Để chuyển đổi vĩ độ và kinh độ trong biểu diễn x và y, bạn cần quyết định sử dụng loại phép chiếu bản đồ nào. Đối với tôi, Elliptical Mercator có vẻ rất tốt. Ở đây bạn có thể tìm thấy một triển khai (trong Java cũng vậy).


0

Nếu nó đủ gần, bạn có thể coi chúng là tọa độ trên một mặt phẳng phẳng. Tính năng này hoạt động ở cấp độ đường phố hoặc thành phố nếu không cần độ chính xác hoàn hảo và tất cả những gì bạn cần là phỏng đoán sơ bộ về khoảng cách liên quan để so sánh với giới hạn tùy ý.


3
Không, điều đó không hoạt động! Khoảng cách x tính bằng m là khác nhau đối với các giá trị vĩ độ khác nhau. Tại đường xích đạo, bạn có thể đi xa với nó, nhưng càng đến gần các cực, ellipsoids của bạn sẽ nhận được càng nhiều.
RickyA

3
Mặc dù nhận xét của bạn là hợp lý, nhưng nó không trả lời câu hỏi của người dùng về việc chuyển đổi chênh lệch độ vĩ độ / lng sang mét.
JivanAmara

0

Dựa trên khoảng cách trung bình để khử khí trên Trái đất.

1 ° = 111km;

Chuyển đổi giá trị này cho radian và chia cho mét, lấy một số ma thuật cho RAD, tính bằng mét: 0,000008998719243599958;

sau đó:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;

3
cuối cùng, một câu trả lời đơn giản :)
Ben Hutchison

điều gì sẽ xảy ra nếu vĩ độ là -179 và vĩ độ khác là 179, khoảng cách x phải là 2 độ thay vì 358
OMGPOP

7
Không sử dụng câu trả lời này (vì một số lý do, nó được ủng hộ). Không có một tỷ lệ duy nhất giữa kinh độ và khoảng cách; Trái đất không phẳng.
CPBL

1
Tôi tin rằng nó là 111,1
Abel Callejo

6
Lưu ý rằng một độ kinh độ là 111 km tại đường xích đạo, nhưng ít hơn đối với các vĩ độ khác. Có một công thức gần đúng đơn giản để tìm độ dài tính bằng km của 1 ° kinh độ theo chức năng của vĩ độ: 1 ° kinh độ = 40000 km * cos (vĩ độ) / 360 (và tất nhiên nó cho 111 km đối với vĩ độ = 90 °). Cũng lưu ý rằng 1 ° kinh độ hầu như luôn luôn là một khoảng cách khác với 1 ° vĩ độ.
Ben

-1

Nếu bạn muốn một giải pháp đơn giản thì hãy sử dụng công thức Haversine như được nêu trong các nhận xét khác. Nếu bạn có một ứng dụng nhạy cảm với độ chính xác, hãy nhớ rằng công thức Haversine không đảm bảo độ chính xác tốt hơn 0,5% vì giả sử trái đất là một hình cầu. Để coi Trái đất là một hình cầu hình cầu, hãy xem xét sử dụng công thức của Vincenty . Ngoài ra, tôi không chắc chúng ta nên sử dụng bán kính nào với công thức Haversine: {Xích đạo: 6.378.137 km, Cực: 6.356,752 km, Thể tích: 6.371.0088 km}.


it is assuming the earth is a circle^^ Một số người kỳ lạ làm điều này ngày nay ... nhưng ý của bạn có lẽ đúng hơn it is assuming the earth is a sphere;)
derHugo

-2

Bạn cần chuyển đổi tọa độ sang radian để thực hiện hình học cầu. Sau khi chuyển đổi, bạn có thể tính toán khoảng cách giữa hai điểm. Khoảng cách sau đó có thể được chuyển đổi thành bất kỳ số đo nào bạn muốn.

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.