首页 >数据库 >mysql教程 >如何高效检索给定坐标 5 英里范围内的建筑物?

如何高效检索给定坐标 5 英里范围内的建筑物?

Barbara Streisand
Barbara Streisand原创
2025-01-09 11:47:42115浏览

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