CRM và Nền tảng dữ liệuPhân tích & kiểm tra Công cụ tiếp thị Tính toán hoặc truy vấn Khoảng cách vòng tròn lớn giữa các điểm có vĩ độ và kinh độ bằng cách sử dụng Công thức Haversine [Ví dụ về PHP, JavaScript, Java, Python, MySQL, MSSQL
Douglas Karr Theo dõi trên Twitter Thứ Hai, ngày 5 tháng 12 năm 2022
78 120.101 5 phút đọc
Tháng này tôi đã lập trình khá nhiều về PHP và MySQL liên quan đến GIS. Lượn lờ trên net, thật ra mình thấy khó khăn khi tìm một số phép tính Địa lý để tìm khoảng cách giữa hai địa điểm nên muốn chia sẻ lên đây
Cách đo khoảng cách giữa các
Vui lòng bật JavaScript
Cách đo khoảng cách giữa hai địa điểm theo cách thủ công trên Google EarthCách đơn giản để tính khoảng cách giữa hai điểm là sử dụng công thức Pitago để tính cạnh huyền của một tam giác [A² + B² = C²]. Đây được gọi là khoảng cách Euclide
Đó là một khởi đầu thú vị nhưng nó không áp dụng với môn Địa lý vì khoảng cách giữa các đường vĩ độ và kinh độ cách nhau không bằng nhau. Càng đến gần xích đạo, các vĩ độ càng cách xa nhau. Nếu bạn sử dụng một số loại phương trình tam giác đơn giản, nó có thể đo khoảng cách chính xác ở một vị trí và cực kỳ sai ở vị trí khác, do độ cong của Trái đất
Khoảng cách vòng tròn lớn
Các tuyến đường được di chuyển trên quãng đường dài quanh Trái đất được gọi là Khoảng cách vòng tròn lớn. Đó là… khoảng cách ngắn nhất giữa hai điểm trên mặt cầu khác với các điểm trên bản đồ phẳng. Kết hợp điều đó với thực tế là các đường kinh tuyến và vĩ độ không cách đều nhau… và bạn sẽ có một phép tính khó
Đây là một video giải thích tuyệt vời về cách Great Circles hoạt động
Công thức Haversine
Khoảng cách sử dụng độ cong của Trái đất được kết hợp trong công thức Haversine, sử dụng lượng giác để cho phép độ cong của trái đất. Khi bạn đang tìm khoảng cách giữa 2 địa điểm trên trái đất [theo đường chim bay], một đường thẳng thực sự là một đường cung.
quảng cáoĐiều này có thể áp dụng trong chuyến bay – bạn đã bao giờ nhìn vào bản đồ thực tế của các chuyến bay và nhận thấy chúng có hình vòm chưa?
PHP. Tính khoảng cách giữa 2 điểm Vĩ độ và Kinh độ
Đây là công thức PHP để tính khoảng cách giữa hai điểm [cùng với Mile vs. đổi km] được làm tròn đến hai chữ số thập phân
function getDistanceBetweenPointsNew[$latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles'] {
$theta = $longitude1 - $longitude2;
$distance = [sin[deg2rad[$latitude1]] * sin[deg2rad[$latitude2]]] + [cos[deg2rad[$latitude1]] * cos[deg2rad[$latitude2]] * cos[deg2rad[$theta]]];
$distance = acos[$distance];
$distance = rad2deg[$distance];
$distance = $distance * 60 * 1.1515;
switch[$unit] {
case 'miles':
break;
case 'kilometers' :
$distance = $distance * 1.609344;
}
return [round[$distance,2]];
}
Các biến là
- $Latitude1 – một biến cho vĩ độ của vị trí đầu tiên của bạn
- $Longitude1 – một biến cho kinh độ của vị trí đầu tiên của bạn
- $Latitude2 – một biến cho vĩ độ của vị trí thứ hai của bạn
- $Longitude2 – một biến cho kinh độ của vị trí thứ hai của bạn
- $unit – mặc định là dặm. Điều này có thể được cập nhật hoặc thông qua dưới dạng km
Java. Tính khoảng cách giữa 2 điểm Vĩ độ và Kinh độ
public static double getDistanceBetweenPointsNew[double latitude1, double longitude1, double latitude2, double longitude2, String unit] {
double theta = longitude1 - longitude2;
double distance = 60 * 1.1515 * [180/Math.PI] * Math.acos[
Math.sin[latitude1 * [Math.PI/180]] * Math.sin[latitude2 * [Math.PI/180]] +
Math.cos[latitude1 * [Math.PI/180]] * Math.cos[latitude2 * [Math.PI/180]] * Math.cos[theta * [Math.PI/180]]
];
if [unit.equals["miles"]] {
return Math.round[distance, 2];
} else if [unit.equals["kilometers"]] {
return Math.round[distance * 1.609344, 2];
} else {
return 0;
}
}
Các biến là
- vĩ độ1 - một biến cho vĩ độ của vị trí đầu tiên của bạn
- kinh độ1 – một biến cho kinh độ của vị trí đầu tiên của bạn
- vĩ độ2 - một biến cho vĩ độ của vị trí thứ hai của bạn
- kinh độ2 – một biến cho kinh độ của vị trí thứ hai của bạn
- đơn vị - mặc định là dặm. Điều này có thể được cập nhật hoặc thông qua dưới dạng km
Javascript. Tính khoảng cách giữa 2 điểm Vĩ độ và Kinh độ
function getDistanceBetweenPoints[latitude1, longitude1, latitude2, longitude2, unit = 'miles'] {
let theta = longitude1 - longitude2;
let distance = 60 * 1.1515 * [180/Math.PI] * Math.acos[
Math.sin[latitude1 * [Math.PI/180]] * Math.sin[latitude2 * [Math.PI/180]] +
Math.cos[latitude1 * [Math.PI/180]] * Math.cos[latitude2 * [Math.PI/180]] * Math.cos[theta * [Math.PI/180]]
];
if [unit == 'miles'] {
return Math.round[distance, 2];
} else if [unit == 'kilometers'] {
return Math.round[distance * 1.609344, 2];
}
}
Các biến là
- vĩ độ1 - một biến cho vĩ độ của vị trí đầu tiên của bạn
- kinh độ1 – một biến cho kinh độ của vị trí đầu tiên của bạn
- vĩ độ2 - một biến cho vĩ độ của vị trí thứ hai của bạn
- kinh độ2 – một biến cho kinh độ của vị trí thứ hai của bạn
- đơn vị - mặc định là dặm. Điều này có thể được cập nhật hoặc thông qua dưới dạng km
con trăn. Tính khoảng cách giữa 2 điểm Vĩ độ và Kinh độ
Dù sao đi nữa, đây là công thức Python để tính khoảng cách giữa hai điểm [cùng với Mile vs. đổi km] được làm tròn đến hai chữ số thập phân. Tín dụng cho con trai tôi, Bill Karr, Nhà khoa học dữ liệu cho OpenINSIGHTS, vì mã
from numpy import sin, cos, arccos, pi, round
def rad2deg[radians]:
degrees = radians * 180 / pi
return degrees
def deg2rad[degrees]:
radians = degrees * pi / 180
return radians
def getDistanceBetweenPointsNew[latitude1, longitude1, latitude2, longitude2, unit = 'miles']:
theta = longitude1 - longitude2
distance = 60 * 1.1515 * rad2deg[
arccos[
[sin[deg2rad[latitude1]] * sin[deg2rad[latitude2]]] +
[cos[deg2rad[latitude1]] * cos[deg2rad[latitude2]] * cos[deg2rad[theta]]]
]
]
if unit == 'miles':
return round[distance, 2]
if unit == 'kilometers':
return round[distance * 1.609344, 2]
Các biến là
- vĩ độ1 - một biến cho vĩ độ của vị trí đầu tiên của bạn
- kinh độ1 – một biến cho kinh độ của vị trí đầu tiên của bạn
- vĩ độ2 - một biến cho vĩ độ của vị trí thứ hai của bạn
- kinh độ2 – một biến cho kinh độ của vị trí thứ hai của bạn
- đơn vị - mặc định là dặm. Điều này có thể được cập nhật hoặc thông qua dưới dạng km
mysql. Truy xuất tất cả các bản ghi trong một phạm vi bằng cách tính khoảng cách theo dặm bằng kinh độ và vĩ độ
Cũng có thể sử dụng SQL để thực hiện phép tính tìm tất cả các bản ghi trong một khoảng cách cụ thể. Trong ví dụ này, tôi sẽ truy vấn MyTable trong MySQL để tìm tất cả các bản ghi nhỏ hơn hoặc bằng biến $ distance [tính bằng Miles] đến vị trí của tôi ở $latitude và $longitude
Truy vấn để truy xuất tất cả các bản ghi trong một khoảng cách cụ thể bằng cách tính khoảng cách tính bằng dặm giữa hai điểm vĩ độ và kinh độ là
$query = "SELECT *, [[[acos[sin[[".$latitude."*pi[]/180]] * sin[[`latitude`*pi[]/180]] + cos[[".$latitude."*pi[]/180]] * cos[[`latitude`*pi[]/180]] * cos[[[".$longitude."- `longitude`]*pi[]/180]]]] * 180/pi[]] * 60 * 1.1515] as distance FROM `table` WHERE distance