Kinh độ và vĩ độ trong php

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ông thức Haversine (Ví dụ về PHP, JavaScript, Java, Python, MySQL, MSSQL)

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

Kinh độ và vĩ độ trong php
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 Earth

Kinh độ và vĩ độ trong php

Cá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 <= ".$distance."

Bạn sẽ cần phải tùy chỉnh điều này

  • $longitude – đây là một biến PHP nơi tôi chuyển kinh độ của điểm
  • $latitude – đây là một biến PHP nơi tôi chuyển kinh độ của điểm
  • $ distance – đây là khoảng cách mà bạn muốn tìm tất cả các bản ghi nhỏ hơn hoặc bằng
  • bảng – đây là bảng… bạn sẽ muốn thay thế bằng tên bảng của mình
  • vĩ độ - đây là lĩnh vực vĩ ​​độ của bạn
  • kinh độ - đây là lĩnh vực kinh độ của bạn

mysql. Truy xuất tất cả các bản ghi trong một phạm vi bằng cách tính toán khoảng cách tính bằng kilomet sử dụng vĩ độ và kinh độ

Và đây là truy vấn SQL sử dụng kilomet trong MySQL

$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 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."

Bạn sẽ cần phải tùy chỉnh điều này

  • $longitude – đây là một biến PHP nơi tôi chuyển kinh độ của điểm
  • $latitude – đây là một biến PHP nơi tôi chuyển kinh độ của điểm
  • $ distance – đây là khoảng cách mà bạn muốn tìm tất cả các bản ghi nhỏ hơn hoặc bằng
  • bảng – đây là bảng… bạn sẽ muốn thay thế bằng tên bảng của mình
  • vĩ độ - đây là lĩnh vực vĩ ​​độ của bạn
  • kinh độ - đây là lĩnh vực kinh độ của bạn

Tôi đã sử dụng mã này trong một nền tảng lập bản đồ doanh nghiệp mà chúng tôi đã sử dụng cho một cửa hàng bán lẻ với hơn 1.000 địa điểm trên khắp Bắc Mỹ và nó hoạt động rất tốt

Khoảng cách địa lý Microsoft SQL Server. STKhoảng cách

Nếu bạn đang sử dụng Microsoft SQL Server, họ cung cấp chức năng riêng của họ, STDistance để tính khoảng cách giữa hai điểm bằng cách sử dụng kiểu dữ liệu Địa lý