最佳化空間查詢:高效率找出5英哩範圍內所有建築物
本文探討一個常見空間問題:從給定座標點檢索指定半徑範圍內的所有建築物。 直接使用ST_CONTAINS
函數可能效率不高,因此本文將探索更優的解決方案。
資料表示的重要性
在深入技術細節之前,必須強調正確資料表示的重要性。將地理空間資料儲存為單獨的經度和緯度列,會在查詢操作中導致效率低。為此,強烈建議使用geometry
或geography
資料類型,它們將兩個座標封裝在一個欄位中。
利用ST_DWithin高效進行鄰近查詢
ST_DWithin
是一個強大的函數,可以直接檢查兩個幾何圖形是否在指定的距離內。 透過將搜尋半徑轉換為米,並將其與使用ST_DWithin
計算的距離進行比較,我們可以有效地識別所需範圍內的建築物。
<code class="language-sql">SELECT name, long, lat FROM building WHERE ST_DWithin( ST_GEOMETRY_FROM_TEXT('POINT(-84.38653999999998,33.72024)'), ST_POINT(long, lat), 8046.72 ); -- 8046.72 米 = 5 英里</code>
使用ST_Distance處理轉換後的英哩距離
或者,可以使用ST_Distance
計算幾何圖形之間的距離。輸出結果最初以米為單位,但我們可以使用簡單的乘法因子將其轉換為英里:
<code class="language-sql">SELECT name, long, lat, ST_Distance( ST_GEOMETRY_FROM_TEXT('POINT(-84.38653999999998,33.72024)'), ST_POINT(long, lat) ) * 0.000621371 AS distance FROM building WHERE distance < 5;</code>
注意: 使用ST_Distance
時,必須透過使用索引來有效率地處理空間查詢。雖然ST_Distance
本身不支援索引,但在ST_GEOMETRY
上建立空間索引可以優化整體查詢效能。
總結
透過探索替代方法並強調資料表示最佳化,我們展示了高效檢索指定範圍內的建築物的方法。本文提出的技術為實際應用中的空間查詢提供了可擴展性和效能改進。
以上是如何有效率地找到給定點 5 英里範圍內的所有建築物?的詳細內容。更多資訊請關注PHP中文網其他相關文章!