Khoảng cách giữa hai tọa độ utm python

Trang này trình bày nhiều phép tính cho các điểm kinh độ/vĩ độ, với các công thức và đoạn mã để triển khai chúng

Tất cả các công thức này là để tính toán trên cơ sở trái đất hình cầu (bỏ qua các hiệu ứng hình elip) – đủ chính xác cho hầu hết các mục đích… [Thực tế, trái đất hơi hình elip; . 3% – xem ghi chú để biết thêm chi tiết]

Khoảng cách đường tròn lớn giữa hai điểm

Nhập tọa độ vào hộp văn bản để thử tính toán. Một loạt các định dạng được chấp nhận, chủ yếu là

  • deg-min-sec có hậu tố là N/S/E/W (e. g. 40°44′55″B, 73 59 11W), hoặc
  • độ thập phân có dấu không có hướng la bàn, trong đó âm chỉ hướng tây/nam (e. g. 40. 7486, -73. 9864)
Khoảng cách. km (đến 4 SF*)Vòng bi ban đầu. mang cuối cùng. trung điểm

Và bạn có thể nhìn thấy nó trên bản đồ

ẩn bản đồ

Khoảng cách

Điều này sử dụng công thức 'haversine' để tính khoảng cách vòng tròn lớn giữa hai điểm - tức là khoảng cách ngắn nhất trên bề mặt trái đất - đưa ra khoảng cách 'như ruồi bay' giữa các điểm (bỏ qua mọi ngọn đồi mà chúng bay . )

Haversine
công thức. a = sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2)c = 2 ⋅ atan2( √a, √(1−a) )d = R ⋅ ctrong đóφ là vĩ độ, λ là kinh độ, R
lưu ý rằng các góc cần phải tính bằng radian để chuyển sang các hàm lượng giác. JavaScript.
const R = 6371e3; // metres
const φ1 = lat1 * Math.PI/180; // φ, λ in radians
const φ2 = lat2 * Math.PI/180;
const Δφ = (lat2-lat1) * Math.PI/180;
const Δλ = (lon2-lon1) * Math.PI/180;

const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
          Math.cos(φ1) * Math.cos(φ2) *
          Math.sin(Δλ/2) * Math.sin(Δλ/2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

const d = R * c; // in metres

Lưu ý trong các tập lệnh này, tôi thường sử dụng lat/lon cho vĩ độ/kinh độ tính theo độ và φ/λ cho vĩ độ/kinh độ tính bằng radian – nhận thấy rằng việc trộn lẫn độ và radian thường là con đường dễ dàng nhất dẫn đến những lỗi khó hiểu

Công thức haversine1 'vẫn đặc biệt phù hợp với tính toán số ngay cả ở những khoảng cách nhỏ' – không giống như các phép tính dựa trên định luật hình cầu của cosin. '(tái)sin' là 1−cosθ và 'nửa sin' là (1−cosθ)/2 hoặc sin²(θ/2) như được sử dụng ở trên. Từng được các nhà hàng hải sử dụng rộng rãi, nó được Roger Sinnott mô tả trên tạp chí Sky & Telescope năm 1984 (“Những đức tính của Haversine”). Sinnott giải thích rằng sự phân chia góc giữa Mizar và Alcor ở chòm sao Đại Hùng – 0°11′49. 69″ – có thể được tính toán chính xác trong Cơ bản trên a sử dụng haversine

Đối với những người tò mò, c là khoảng cách góc tính bằng radian và a là bình phương của một nửa độ dài dây cung giữa các điểm

Nếu không có sẵn

const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
4, c có thể được tính từ 2 ⋅ asin( min(1, √a) ) (bao gồm bảo vệ khỏi lỗi làm tròn)

Sử dụng Chrome trên PC Core i5 cũ, phép tính khoảng cách mất khoảng 2 – 5 micro giây (do đó khoảng 200.000 – 500.000 mỗi giây). Ít hoặc không có lợi ích thu được bằng cách bao thanh toán các điều khoản phổ biến;

Luật hình cầu của Cosin

Trên thực tế, JavaScript (và hầu hết các máy tính & ngôn ngữ hiện đại) sử dụng các số dấu phẩy động 64 bit 'IEEE 754', cung cấp 15 con số chính xác đáng kể. Theo ước tính của tôi, với độ chính xác này, định luật hình cầu đơn giản của công thức cosin (cos c = cos a cos b + sin a sin b cos C) cho kết quả được điều chỉnh tốt ở khoảng cách nhỏ cỡ vài mét trên bề mặt trái đất. (Lưu ý rằng dạng trắc địa của định luật cosin được sắp xếp lại từ dạng chính tắc để có thể sử dụng trực tiếp vĩ độ, thay vì vĩ độ)

Điều này làm cho định luật cosin đơn giản hơn trở thành một sự thay thế 1 dòng hợp lý cho công thức haversine cho nhiều mục đích trắc địa (nếu không phải cho thiên văn học). Sự lựa chọn có thể được điều khiển bởi ngôn ngữ lập trình, bộ xử lý, ngữ cảnh mã hóa, các chức năng kích hoạt có sẵn (bằng các ngôn ngữ khác nhau), v.v. - và, đối với khoảng cách rất nhỏ, phép tính gần đúng hình chữ nhật có thể phù hợp hơn

định luật côsin. d = acos( sin φ1 ⋅ sin φ2 + cos φ1 ⋅ cos φ2 ⋅ cos Δλ ) ⋅ RJavaScript.
const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
Excel. =ACOS( SIN(lat1)*SIN(lat2) + COS(lat1)*COS(lat2)*COS(lon2-lon1) ) * 6371000(hoặc với lat/lon theo độ). =ACOS( SIN(lat1*PI()/180)*SIN(lat2*PI()/180) + COS(lat1*PI()/180)*COS(lat2*PI()/180)*COS(lon2

Trong khi đơn giản hơn, định luật cosin chậm hơn một chút so với haversine, trong các thử nghiệm của tôi

xấp xỉ hình chữ nhật

Nếu hiệu suất là một vấn đề và độ chính xác ít quan trọng hơn, đối với những khoảng cách nhỏ, định lý Pythagoras có thể được sử dụng trên phép chiếu tam giác đều. *

Công thứcx = Δλ ⋅ cos φmy = Δφd = R ⋅ √x² + y²JavaScript.
const x = (λ2-λ1) * Math.cos((φ1+φ2)/2);
const y = (φ2-φ1);
const d = Math.sqrt(x*x + y*y) * R;

Điều này chỉ sử dụng một hàm trig và một hàm sqrt – so với nửa tá hàm trig cho luật cos và 7 hàm trig + 2 sqrt cho haversine. Độ chính xác hơi phức tạp. dọc theo kinh tuyến không có sai số, mặt khác chúng phụ thuộc vào khoảng cách, phương hướng và vĩ độ, nhưng đủ nhỏ cho nhiều mục đích* (và thường không đáng kể so với chính phép tính gần đúng hình cầu)

Ngoài ra, công thức trái đất phẳng tọa độ cực có thể được sử dụng. sử dụng các đồng vĩ độ θ1 = π/2−φ1 và θ2 = π/2−φ2, khi đó d = R ⋅ √θ1² + θ2² − 2 ⋅ θ1 ⋅ θ2 ⋅ cos Δλ. Tôi chưa so sánh độ chính xác

Khoảng cách giữa hai tọa độ utm python
Baghdad đến Osaka –
không phải là một mang liên tục

Ổ đỡ trục

Nói chung, tiêu đề hiện tại của bạn sẽ thay đổi khi bạn đi theo một đường tròn lớn (chính thống); . )

Công thức này dành cho phương vị ban đầu (đôi khi được gọi là phương vị chuyển tiếp) mà nếu theo một đường thẳng dọc theo một cung tròn lớn sẽ đưa bạn từ điểm bắt đầu đến điểm kết thúc. 1

Công thức. θ = atan2( sin Δλ ⋅ cos φ2 , cos φ1 ⋅ sin φ2 − sin φ1 ⋅ cos φ2 ⋅ cos Δλ ) trong đóφ1,λ1 là điểm đầu, φ2,λ2 là điểm cuối (Δλ là chênh lệch kinh độ)JavaScript.
const y = Math.sin(λ2-λ1) * Math.cos(φ2);
const x = Math.cos(φ1)*Math.sin(φ2) -
          Math.sin(φ1)*Math.cos(φ2)*Math.cos(λ2-λ1);
const θ = Math.atan2(y, x);
const brng = (θ*180/Math.PI + 360) % 360; // in degrees
Excel. =ATAN2(COS(lat1)*SIN(lat2)-SIN(lat1)*COS(lat2)*COS(lon2-lon1),
SIN(lon2-lon1)*COS(lat2))
* lưu ý rằng Excel đảo ngược các đối số thành ATAN2 – xem ghi chú bên dưới

Vì atan2 trả về các giá trị trong phạm vi -π. +π (nghĩa là -180°. +180°), để chuẩn hóa kết quả thành phương vị la bàn (trong phạm vi 0°. 360°, với các giá trị −ve được chuyển thành phạm vi 180°. 360°), chuyển đổi thành độ rồi sử dụng (θ+360) % 360, trong đó % là (dấu phẩy động) modulo

Đối với phương vị cuối cùng, chỉ cần lấy phương vị ban đầu từ điểm cuối đến điểm đầu và đảo ngược nó (sử dụng θ = (θ+180) % 360)

trung điểm

Đây là điểm nửa đường dọc theo đường tròn lớn giữa hai điểm. 1

Công thức. Bx = cos φ2 ⋅ cos ΔλBy = cos φ2 ⋅ sin Δλφm ​​= atan2( sin φ1 + sin φ2, √(cos φ1 + Bx)² + By² )λm = λ1 + atan2(By, cos(φ1)+Bx)JavaScript.
const Bx = Math.cos(φ2) * Math.cos(λ2-λ1);
const By = Math.cos(φ2) * Math.sin(λ2-λ1);
const φ3 = Math.atan2(Math.sin(φ1) + Math.sin(φ2),
                      Math.sqrt( (Math.cos(φ1)+Bx)*(Math.cos(φ1)+Bx) + By*By ) );
const λ3 = λ1 + Math.atan2(By, Math.cos(φ1) + Bx);
Kinh độ có thể được chuẩn hóa thành −180…+180 bằng cách sử dụng
const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
5

Giống như phương vị ban đầu có thể khác với phương vị cuối cùng, điểm giữa có thể không nằm ở giữa các vĩ độ/kinh độ;

điểm trung gian

Một điểm trung gian tại bất kỳ phần nào dọc theo đường tròn lớn giữa hai điểm cũng có thể được tính

Công thức. a = sin((1−f)⋅δ) / sin δb = sin(f⋅δ) / sin δx = a ⋅ cos φ1 ⋅ cos λ1 + b ⋅ cos φ2 ⋅ cos λ2y = a ⋅ cos φ1 ⋅ sin λ1 +

Điểm đến cho trước khoảng cách và hướng từ điểm bắt đầu

Đưa ra một điểm bắt đầu, phương hướng ban đầu và khoảng cách, điều này sẽ tính toán điểm đích và phương hướng cuối cùng di chuyển dọc theo một cung tròn lớn (khoảng cách ngắn nhất)

Điểm đến dọc theo đường tròn lớn cho trước khoảng cách và phương hướng từ điểm bắt đầu Điểm bắt đầu. ,Ổ đỡ trục. Khoảng cách. kmCông thức. φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 ) trong đó φ là vĩ độ, λ là kinh độ .
const φ2 = Math.asin( Math.sin(φ1)*Math.cos(d/R) +
                      Math.cos(φ1)*Math.sin(d/R)*Math.cos(brng) );
const λ2 = λ1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(φ1),
                           Math.cos(d/R)-Math.sin(φ1)*Math.sin(φ2));
Kinh độ có thể được chuẩn hóa thành −180…+180 bằng cách sử dụng
const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
5Excel. lat2. =ASIN(SIN(lat1)*COS(d/R) + COS(lat1)*SIN(d/R)*COS(brng))
lon2. =lon1 + ATAN2(COS(d/R)-SIN(lat1)*SIN(lat2), SIN(brng)*SIN(d/R)*COS(lat1))
* Hãy nhớ rằng Excel đảo ngược các đối số thành ATAN2 – xem ghi chú bên dưới

Đối với vòng bi cuối cùng, chỉ cần di chuyển vòng bi ban đầu từ điểm cuối đến điểm bắt đầu và đảo ngược nó bằng

const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
7


Giao điểm của hai đường dẫn đã cho điểm bắt đầu và vòng bi

Đây là phép tính khá phức tạp hơn hầu hết các phép tính khác trên trang này, nhưng tôi đã được yêu cầu tính toán nhiều lần. Điều này đến từ Ed William. Xem bên dưới để biết JavaScript

Giao điểm của hai đường tròn lớnĐiểm 1. , Brng 1. điểm 2. , Brng 2. Công thức. δ12 = 2⋅asin( √(sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2)) )góc. p1–p2θa = acos( ( sin φ2 − sin φ1 ⋅ cos δ12 ) / ( sin δ12 ⋅ cos φ1 ) )
θb = acos( ( sin φ1 − sin φ2 ⋅ cos δ12 ) / ( sin δ12 ⋅ cos φ2 ) )vòng bi đầu/cuối
giữa các điểm 1 & 2nếu sin(λ2−λ1) > 0
θ12 = θa
θ21 = 2π − θb
khác
θ12 = 2π − θa
θ21 = θbα1 = θ13 − θ12
α2 = θ21 − θ23góc p2–p1–p3
góc p1–p2–p3α3 = acos( −cos α1 ⋅ cos α2 + sin α1 ⋅ sin α2 ⋅ cos δ12 )góc p1–p2–p3δ13 = atan2( sin δ12 ⋅ sin α1 ⋅ sin α2 , cos α2 + cos α1 ⋅ cos . p1–p3φ3 = asin( sin φ1 ⋅ cos δ13 + cos φ1 ⋅ sin δ13 ⋅ cos θ13 )p3 latΔλ13 = atan2( sin θ13 ⋅ sin δ13 ⋅ cos φ1 , cos δ13 − sin φ1 ⋅ p3 = φ3 1long)

φ1, λ1, θ13. Điểm bắt đầu thứ nhất & (ban đầu) hướng từ điểm thứ nhất về phía giao điểm
φ2, λ2, θ23. Điểm bắt đầu thứ 2 & (ban đầu) hướng từ điểm thứ 2 về phía giao điểm
φ3, λ3. giao điểm

% = (dấu phẩy động) modulo

lưu ý –nếu sin α1 = 0 và sin α2 = 0. giải pháp vô hạn
nếu sin α1 ⋅ sin α2 < 0. giải pháp mơ hồ
công thức này không phải lúc nào cũng được điều chỉnh tốt cho các đường kinh tuyến hoặc xích đạo

Điều này đơn giản hơn rất nhiều khi sử dụng vectơ thay vì lượng giác cầu. thấy


Khoảng cách đường chéo

Đây là một cái mới. Đôi khi tôi được hỏi về khoảng cách của một điểm từ một đường tròn lớn (đôi khi được gọi là lỗi đường chéo)

Công thức. dxt = asin( sin(δ13) ⋅ sin(θ13−θ12) ) ⋅ R trong đóδ13 là khoảng cách (góc) từ điểm bắt đầu đến điểm thứ ba
θ13 là (ban đầu) hướng từ điểm đầu đến điểm thứ ba
θ12 là (ban đầu) hướng từ điểm đầu đến điểm cuối
R là bán kính trái đất
JavaScript.
const δ13 = d13 / R;
const dXt = Math.asin(Math.sin(δ13)*Math.sin(θ13-θ12)) * R;

Ở đây, đường đi của vòng tròn lớn được xác định bởi điểm bắt đầu và điểm kết thúc – tùy thuộc vào dữ liệu ban đầu mà bạn đang làm việc, bạn có thể sử dụng các công thức ở trên để có được khoảng cách và phương hướng liên quan. Dấu hiệu của dxt cho bạn biết điểm thứ ba nằm ở phía nào của con đường

Khoảng cách dọc theo đường đi, từ điểm bắt đầu đến điểm gần nhất trên đường dẫn đến điểm thứ ba, là

Công thức. dat = acos( cos(δ13) / cos(δxt) ) ⋅ Rwhereδ13 là khoảng cách (góc) từ điểm bắt đầu đến điểm thứ ba
δxt là khoảng cách đường chéo (góc)
R là bán kính trái đất
JavaScript.
const δ13 = d13 / R;
const dAt = Math.acos(Math.cos(δ13)/Math.cos(dXt/R)) * R;

Điểm gần nhất với các cực

Và. 'Công thức của Claireaut' sẽ cung cấp cho bạn vĩ độ tối đa của đường tròn lớn, với phương vị θ và vĩ độ φ trên đường tròn lớn

Công thức. φmax = acos(. tội lỗi θ ⋅ cos φ. ) JavaScript.
const φMax = Math.acos(Math.abs(Math.sin(θ)*Math.cos(φ)));

dòng rhumb

'Đường hình thoi' (hoặc loxodrome) là một đường có phương chịu lực không đổi, cắt tất cả các kinh tuyến theo cùng một góc

Các thủy thủ đã từng (và đôi khi vẫn) điều hướng dọc theo các đường hình thoi vì việc đi theo một hướng la bàn không đổi sẽ dễ dàng hơn là liên tục điều chỉnh phương hướng, như cần thiết để đi theo một vòng tròn lớn. Các đường thẳng là các đường thẳng trên bản đồ Phép chiếu Mercator (cũng hữu ích cho việc điều hướng)

Các đường thẳng thường dài hơn các đường tròn lớn (chính thống). Chẳng hạn, từ London đến New York dọc theo một đường hình thoi dài hơn 4% so với dọc theo một vòng tròn lớn – quan trọng đối với nhiên liệu hàng không, nhưng không đặc biệt đối với tàu thuyền. New York đến Bắc Kinh – gần với ví dụ cực đoan nhất có thể (mặc dù không thể đi thuyền. ) – dài hơn 30% dọc theo đường hình thoi

Khoảng cách đường trục giữa hai điểm Điểm đích dọc theo đường trục cho trước khoảng cách và hướng từ điểm bắt đầu Điểm bắt đầu. ,Ổ đỡ trục. Khoảng cách. km

Chìa khóa để tính toán các đường hình thoi là hàm Gudermannian nghịch đảo¹, cho biết chiều cao trên bản đồ chiếu Mercator của một vĩ độ nhất định. ln(tanφ + secφ) hoặc ln( tan(π/4+φ/2) ). Tất nhiên, điều này có xu hướng vô cực ở các cực (phù hợp với phép chiếu Mercator). Đối với những người bị ám ảnh, thậm chí còn có một phiên bản hình elip, 'vĩ độ đẳng cự'. ψ = ln( tan(π/4+φ/2) / [ (1−e⋅sinφ) / (1+e⋅sinφ) ]e/2), hoặc giá trị tương đương có điều kiện tốt hơn của nó ψ = atanh(sinφ) −

Sau đó, các công thức để lấy tọa độ hướng đông và hướng bắc của phép chiếu Mercator từ kinh độ và vĩ độ hình cầu là¹

E = R ⋅ λN = R ⋅ ln( tan(π/4 + φ/2) )

Các công thức sau đây là từ công thức hàng không của Ed Williams

Khoảng cách

Vì đường hình thoi là một đường thẳng trên phép chiếu Mercator, nên khoảng cách giữa hai điểm dọc theo đường hình thoi là độ dài của đường thẳng đó (theo Pythagoras);

Trên một vĩ độ không đổi (đi theo hướng đông-tây), phần bù này đơn giản là cosφ;

Công thức. Δψ = ln( tan(π/4 + φ2/2) / tan(π/4 + φ1/2) )(chênh lệch vĩ độ 'dự kiến')q = Δφ/Δψ (hoặc cosφ cho đường E-W)d = √(Δφ² .
const Δψ = Math.log(Math.tan(Math.PI/4+φ2/2)/Math.tan(Math.PI/4+φ1/2));
const q = Math.abs(Δψ) > 10e-12 ? Δφ/Δψ : Math.cos(φ1); // E-W course becomes ill-conditioned with 0/0

// if dLon over 180° take shorter rhumb line across the anti-meridian:
if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ);

const dist = Math.sqrt(Δφ*Δφ + q*q*Δλ*Δλ) * R;

Ổ đỡ trục

Một đường thẳng là một đường thẳng trên phép chiếu Mercator, với một góc trên phép chiếu bằng phương vị la bàn

Công thức. Δψ = ln( tan(π/4 + φ2/2) / tan(π/4 + φ1/2) )(chênh lệch vĩ độ 'dự kiến')θ = atan2(Δλ, Δψ)trong đóφ là vĩ độ, λ là kinh độ, Δλ .
const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
0

Dự định

Cho trước một điểm bắt đầu và khoảng cách d dọc theo phương vị không đổi θ, điều này sẽ tính điểm đích. Nếu bạn duy trì một phương vị không đổi dọc theo đường hình thoi, bạn sẽ dần dần xoắn ốc về phía một trong các cực

Công thức. δ = d/R(khoảng cách góc)φ2 = φ1 + δ ⋅ cos θΔψ = ln( tan(π/4 + φ2/2) / tan(π/4 + φ1/2) )(chênh lệch vĩ độ 'dự kiến')q .
const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
1Kinh độ có thể được chuẩn hóa thành −180…+180 bằng cách sử dụng
const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
5

trung điểm

Công thức tính toán 'điểm giữa loxodromic', điểm nằm ở nửa đường dọc theo đường hình thoi giữa hai điểm, là của Robert Hill và Clive Tooth1 (thx Axel. )

Công thức. φm = (φ1+φ2) / 2f1 = tan(π/4 + φ1/2)f2 = tan(π/4 + φ2/2)fm = tan(π/4+φm/2)λm = [ (λ2− .
const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
2Kinh độ có thể được chuẩn hóa thành −180…+180 bằng cách sử dụng
const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
5

Sử dụng các tập lệnh trong các trang web

Sử dụng các tập lệnh này trong các trang web sẽ giống như sau

const φ1 = lat1 * Math.PI/180, φ2 = lat2 * Math.PI/180, Δλ = (lon2-lon1) * Math.PI/180, R = 6371e3;
const d = Math.acos( Math.sin(φ1)*Math.sin(φ2) + Math.cos(φ1)*Math.cos(φ2) * Math.cos(Δλ) ) * R;
3

Chuyển đổi giữa độ-phút-giây sang độ thập phân

Vĩ độKinh độ1° ≈ 111 km (110. 57 đương lượng — 111. 70 cực)dm1′ ≈ 1. 85 km (= 1nm)0. 01° ≈ 1. 11 kmdms1″ ≈ 30. 9 m0. 0001° ≈ 11. 1 mHiển thị kết quả tính toán dưới dạng. độ deg/min deg/min/sec

ghi chú

  • Sự chính xác. vì trái đất không hoàn toàn là một hình cầu nên có một số lỗi nhỏ trong việc sử dụng hình học hình cầu; . 6.371 km là giá trị thường được chấp nhận cho trái đất. Điều này có nghĩa là sai số từ giả thiết hình cầu có thể lên tới 0. 55% băng qua đường xích đạo, mặc dù nhìn chung dưới 0. 3%, tùy thuộc vào vĩ độ và hướng di chuyển (whuber khám phá điều này rất chi tiết trên ). Độ chính xác cao hơn 3m trong 1km hầu như đủ tốt đối với tôi, nhưng nếu bạn muốn độ chính xác cao hơn, bạn có thể sử dụng công thức Vincenty để tính khoảng cách trắc địa trên ellipsoids, cho kết quả chính xác trong vòng 1mm. (Hoàn toàn ngược lại - tôi chưa bao giờ cần độ chính xác như vậy - tôi đã tra cứu công thức này và phát hiện ra rằng việc triển khai JavaScript đơn giản hơn tôi mong đợi)
  • Các hàm Trig lấy đối số theo đơn vị radian, do đó vĩ độ, kinh độ và phương vị tính theo độ (hoặc số thập phân hoặc độ/phút/giây) cần được chuyển đổi thành đơn vị radian, rad = deg⋅π/180. Khi chuyển đổi radian về độ (độ = rad⋅180/π), Tây là âm nếu sử dụng độ thập phân có dấu. Đối với ổ trục, các giá trị trong phạm vi -π đến +π [-180° đến +180°] cần được chuyển đổi thành 0 đến +2π [0°–360°];
  • Tất cả các phương vị đều hướng về phía bắc thực, 0°=N, 90°=E, v.v.;
  • Hàm atan2() được sử dụng rộng rãi ở đây nhận hai đối số, atan2(y, x) và tính toán tang cung của tỷ số y/x. Nó linh hoạt hơn atan(y/x), vì nó xử lý x=0, và nó cũng trả về các giá trị trong cả 4 góc phần tư -π đến +π (hàm atan trả về các giá trị trong khoảng -π/2 đến +π/
  • Nếu bạn triển khai bất kỳ công thức nào liên quan đến atan2 trong bảng tính (Microsoft Excel, LibreOffice Calc, Google Sheets, Apple Numbers), bạn sẽ cần phải đảo ngược các đối số, vì Excel, v.v. có chúng theo cách ngược lại với JavaScript – thứ tự thông thường là atan2(y . Để sử dụng atan2 trong macro (VBA), bạn có thể sử dụng WorksheetFunction. Atan2()
  • Nếu bạn đang sử dụng Google Maps, một số chức năng này hiện được cung cấp trong thư viện 'hình cầu' API Google Maps V3 (computeDistanceBetween(), computeHeading(), computeOffset(), interpolate(), v.v; lưu ý rằng chúng sử dụng bán kính Trái đất mặc định
  • Nếu bạn sử dụng Tham chiếu lưới khảo sát bản đồ của Vương quốc Anh, tôi đã triển khai tập lệnh để chuyển đổi giữa Tham chiếu lưới Lat/Long & OS
  • Nếu bạn sử dụng tọa độ UTM hoặc tham chiếu lưới MGRS, tôi đã triển khai các tập lệnh để chuyển đổi giữa Lat/Long, UTM và MGRS
  • Tôi đã học được rất nhiều từ Câu hỏi thường gặp về GIS của Cục điều tra dân số Hoa Kỳ. Câu hỏi thường gặp này không còn nữa, vì vậy tôi đã tạo một bản sao
  • Cảm ơn Công thức Hàng không của Ed Williams về nhiều công thức
  • Đối với dặm, chia km cho 1. 609344
  • Đối với hải lý, chia km cho 1. 852

Xem bên dưới để biết mã nguồn JavaScript, cũng có sẵn trên GitHub. Tài liệu đầy đủ có sẵn, cũng như một bộ thử nghiệm

Lưu ý tôi sử dụng các chữ cái Hy Lạp trong các biến đại diện cho các ký hiệu toán học được trình bày theo quy ước dưới dạng các chữ cái Hy Lạp. Tôi đánh giá cao lợi ích to lớn của tính dễ đọc so với sự bất tiện nhỏ khi nhập (nếu bạn gặp phải bất kỳ sự cố nào, hãy đảm bảo bạn bao gồm

const x = (λ2-λ1) * Math.cos((φ1+φ2)/2);
const y = (φ2-φ1);
const d = Math.sqrt(x*x + y*y) * R;
0) và sử dụng mã hóa UTF-8 khi lưu tệp)

Với cú pháp kiểu C không được gõ, JavaScript đọc rất gần với mã giả. phơi bày các thuật toán với sự phân tâm cú pháp tối thiểu. Các chức năng này phải đơn giản để dịch sang các ngôn ngữ khác nếu được yêu cầu, mặc dù vậy cũng có thể được sử dụng nguyên trạng trong trình duyệt và Node. js

Để thuận tiện và rõ ràng, tôi đã mở rộng đối tượng JavaScript cơ sở

const x = (λ2-λ1) * Math.cos((φ1+φ2)/2);
const y = (φ2-φ1);
const d = Math.sqrt(x*x + y*y) * R;
1 với các phương thức
const x = (λ2-λ1) * Math.cos((φ1+φ2)/2);
const y = (φ2-φ1);
const d = Math.sqrt(x*x + y*y) * R;
2 và
const x = (λ2-λ1) * Math.cos((φ1+φ2)/2);
const y = (φ2-φ1);
const d = Math.sqrt(x*x + y*y) * R;
3. Tôi không thấy khả năng xảy ra xung đột cao vì đây là những hoạt động phổ biến

Tôi cũng có một trang minh họa việc sử dụng định luật hình cầu của cosin để chọn các điểm từ cơ sở dữ liệu trong một vòng tròn giới hạn được chỉ định – ví dụ này dựa trên MySQL+PDO, nhưng có thể mở rộng cho các nền tảng DBMS khác

Một số người đã hỏi về các bảng tính Excel mẫu, vì vậy tôi đã triển khai các công thức khoảng cách & phương hướng và điểm đích dưới dạng bảng tính, ở dạng chia nhỏ tất cả các giai đoạn liên quan để minh họa hoạt động

tháng 2 năm 2019. Tôi đã cấu trúc lại thư viện để sử dụng các mô-đun ES, cũng như mở rộng nó trong phạm vi;

Hiệu suất. như đã lưu ý ở trên, phép tính khoảng cách haversine mất khoảng 2 – 5 micro giây (do đó khoảng 200.000 – 500.000 mỗi giây). Tôi vẫn chưa hoàn thành các bài kiểm tra thời gian trên các tính toán khác

Những ngôn ngữ khác. Tôi không thể hỗ trợ bản dịch sang các ngôn ngữ khác, nhưng nếu bạn đã chuyển mã sang ngôn ngữ khác, tôi sẵn lòng cung cấp các liên kết tại đây

  • Brian Lambert đã tạo một phiên bản Objective-C
  • Jean Brouwers đã tạo một phiên bản Python
  • Vahan Aghajanyan đã tạo một phiên bản C++
  • Bahadır Arslan đã tạo một phiên bản Kotlin

Khoảng cách giữa hai tọa độ utm python
Tôi cung cấp các tập lệnh này để sử dụng miễn phí và điều chỉnh để cân bằng khoản nợ của tôi với nguồn thông tin nguồn mở. Bạn có thể sử dụng lại các tập lệnh này [theo giấy phép MIT, không có bất kỳ bảo hành rõ ràng hay ngụ ý nào] chỉ với điều kiện là bạn giữ lại thông báo bản quyền của tôi và liên kết đến trang này

Nếu bạn muốn thể hiện sự đánh giá cao của mình và hỗ trợ tiếp tục phát triển các tập lệnh này, tôi rất biết ơn sẽ nhận đóng góp