定位 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中文网其他相关文章!