定位 5 英里半徑內的建築物:地理空間解決方案
本文解決了識別給定座標 5 英里半徑內的所有建築物的常見挑戰。 我們將為這個空間查詢提供一個高效能的解決方案。
場景:
想像一個「建築物」資料庫表,其中包含以下列:「名稱」、「緯度」(「lat」)和「經度」(「lng」)。 每棟建築物的位置均由其緯度和經度定義。
問題:
目標是檢索特定座標對 5 英里範圍內的所有建築物,例如:-84.38653999999998, 33.72024。
低效率方法:
使用像 ST_CONTAINS
這樣的函數來單獨儲存緯度和經度值是低效率的。 這種方法會顯著增加查詢處理的開銷。
最佳解:利用空間資料型別
為了獲得最佳效能,請將座標儲存為幾何或地理資料類型。這極大地簡化了距離計算。 我們將示範如何使用 PostGIS 函數。
高效率方法:ST_DWithin
和 ST_Distance
PostGIS 提供強大的空間功能,可實現高效率的距離運算。 以下是如何使用 ST_DWithin
和 ST_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中文網其他相關文章!