首頁 >資料庫 >mysql教程 >如何有效地檢索給定座標 5 英里範圍內的建築物?

如何有效地檢索給定座標 5 英里範圍內的建築物?

Barbara Streisand
Barbara Streisand原創
2025-01-09 11:47:42156瀏覽

How to Efficiently Retrieve Buildings within 5 Miles of Given Coordinates?

定位 5 英里半徑內的建築物:地理空間解決方案

本文解決了識別給定座標 5 英里半徑內的所有建築物的常見挑戰。 我們將為這個空間查詢提供一個高效能的解決方案。

場景:

想像一個「建築物」資料庫表,其中包含以下列:「名稱」、「緯度」(「lat」)和「經度」(「lng」)。 每棟建築物的位置均由其緯度和經度定義。

問題:

目標是檢索特定座標對 5 英里範圍內的所有建築物,例如:-84.38653999999998, 33.72024。

低效率方法:

使用像 ST_CONTAINS 這樣的函數來單獨儲存緯度和經度值是低效率的。 這種方法會顯著增加查詢處理的開銷。

最佳解:利用空間資料型別

為了獲得最佳效能,請將座標儲存為幾何或地理資料類型。這極大地簡化了距離計算。 我們將示範如何使用 PostGIS 函數。

高效率方法:ST_DWithinST_Distance

PostGIS 提供強大的空間功能,可實現高效率的距離運算。 以下是如何使用 ST_DWithinST_Distance

使用 ST_DWithin(布林結果):

ST_DWithin 傳回一個布林值,指示幾何圖形是否在指定距離內。

<code class="language-sql">SELECT name, lng, lat,
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(lng,lat)::geography) * 0.000621371 AS distance
FROM building
WHERE
  ST_DWithin('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(lng,lat)::geography, 8046.72); -- 8046.72 meters = 5 miles</code>

使用ST_Distance(距離以英里為單位):

ST_Distance 傳回以公尺為單位的距離。我們使用轉換係數轉換為英里。

<code class="language-sql">SELECT name, lng, lat,
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(lng,lat)::geography) * 0.000621371 AS distance
FROM building
WHERE 
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(lng,lat)::geography) * 0.000621371 <= 5;</code>

透過使用這些空間函數並適當地儲存座標,您可以準確且有效率地檢索 5 英里半徑內的建築物,這對於有效的地理空間應用至關重要。 請記得將 (-4.6314, 54.0887) 替換為您的實際座標。

以上是如何有效地檢索給定座標 5 英里範圍內的建築物?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn