使用緯度和經度優化用於地理位置搜尋的MySQL 查詢
在MySQL 中,基於地理鄰近度檢索資料是一項常見任務。使用經度和緯度值時,必須使用高效率的查詢來避免意外結果。
考慮以下查詢,該查詢嘗試查找中心緯度和經度25 英里半徑內的行:
<code class="sql">SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) * cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC</code>
雖然此查詢通常有效,但它可能會為某些行生成不準確的結果,顯示它們距離指定半徑更遠。
為了提高準確性,請考慮以下最佳化查詢:
<code class="sql">SELECT `id`, ( 6371 * acos( cos( radians( :lat ) ) * cos( radians( `lat` ) ) * cos( radians( `long` ) - radians( :long ) ) + sin(radians(:lat)) * sin(radians(`lat`)) ) ) `distance` FROM `location` HAVING `distance` < :distance ORDER BY `distance` LIMIT 25</code>
在此查詢中,:lat 和:long 參數表示中心點的緯度和經度,:distance 表示以英里為單位的半徑。
兩個查詢之間的主要區別是使用 6371 作為轉換係數將弧度轉換為英里。該係數比原始查詢中使用的 3959 更準確。此外,優化後的查詢使用更嚴格的公式來計算基於緯度和經度的距離。
透過實作這些最佳化,您可以在使用緯度和經度值執行地理位置搜尋時顯著提高 MySQL 查詢的準確性,確保結果始終在指定的半徑距離內。
以上是## 如何最佳化 MySQL 查詢以使用緯度和經度進行準確的地理位置搜尋?的詳細內容。更多資訊請關注PHP中文網其他相關文章!