首頁 > 資料庫 > mysql教程 > 如何使用 MySQL 找出給定經緯度半徑內的點?

如何使用 MySQL 找出給定經緯度半徑內的點?

Susan Sarandon
發布: 2025-01-06 12:44:41
原創
436 人瀏覽過

How Can I Use MySQL to Find Points Within a Given Radius of Latitude and Longitude?

使用 MySQL 空間擴充來擷取圓內的點

要執行基於經緯度的空間查詢,需要使用地理空間函數擴充 MySQL。然而,值得注意的是,MySQL 缺乏專門為涉及這些座標的距離計算而設計的內建空間函數。

相反,地球表面上的鄰近圓需要使用大圓距離公式,可以使用半正矢或其他適當的演算法來實現。 MySQL 5.6 提供了一個未記錄的st_distance(p1, p2) 函數,用於計算平面形狀內的笛卡爾距離,但由於笛卡爾距離引入的扭曲,這不適合基於緯度和經度的計算。

對於實際應用,考慮一個查詢來查找給定緯度/經度十法定英里內的所有標誌point:

SELECT id, coordinates, name, r,
        units * DEGREES(ACOS(LEAST(1.0, COS(RADIANS(latpoint))
                  * COS(RADIANS(latitude))
                  * COS(RADIANS(longpoint) - RADIANS(longitude))
                  + SIN(RADIANS(latpoint))
                  * SIN(RADIANS(latitude))))) AS distance
   FROM flags
   JOIN (
        SELECT 42.81  AS latpoint,  -70.81 AS longpoint, 
               10.0 AS r, 69.0 AS units
        ) AS p ON (1=1)
  WHERE MbrContains(GeomFromText (
        CONCAT('LINESTRING(',
              latpoint-(r/units),' ',
              longpoint-(r /(units* COS(RADIANS(latpoint)))),
              ',', 
              latpoint+(r/units) ,' ',
              longpoint+(r /(units * COS(RADIANS(latpoint)))),
              ')')),  coordinates)
登入後複製

在此查詢中:

  • latpoint 和longpoint 表示使用者位置的緯度和經度。
  • r 是以英里為單位的搜尋半徑.
  • 單位表示地球表面每緯度的距離單位(例如,69英里為英里,111.045 公里為公里)。
  • MbrContains 排除基於邊界矩形的搜尋區域之外的點。
  • 大圓距離公式計算點之間的距離。

要將結果限制為圓內的點並按鄰近程度排序,請將查詢括在另一個查詢中查詢:

SELECT id, coordinates, name
   FROM (
         /* the above query, pasted in here */
        ) AS d
  WHERE d.distance <= d.r
  ORDER BY d.distance ASC
登入後複製

以上是如何使用 MySQL 找出給定經緯度半徑內的點?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板