Fast/Simple/Indexable 从数据库中提取半径或范围内地图上的点的方法

Fast/Simple/Indexable way to extract points on maps within a radius or range from database

抱歉标题不明确。这不是 的重复项 .这是详细的问题:

我有一个包含索引纬度和经度值的位置数据库。如果需要,我可以自由添加索引和索引计算列。

给我一个坐标点和一个距离(比如5km),我需要:

要求数据库查找操作尽可能简单。精度不是最重要的。稍后可能会在 client-side 处优化结果,因此如果需要,最好从服务器获得更多 return 个结果。

我使用的数据库是 SQL 服务器,如果重要的话。

编辑:抱歉,我在 post 第一个 post 时忘记了另一个问题。我还有一个类似的问题:

应用相同的规则,圆形或方形,现在每个目标点也有自己的半径。比方说,A 点具有 B 和 C 的 Lat、Lng 和 Radius 属性等。现在我需要提取具有其形状 collides 与源形状的点。

SQL 服务器有一个名为 spatial indexes 的功能。

Geography Methods Supported by Spatial Indexes

Under certain conditions, spatial indexes support the following set-oriented geography methods: STIntersects(),STEquals(), and STDistance(). To be supported by a spatial index, these methods must be used within the WHERE clause of a query, and they must occur within a predicate of the following general form:

geography1.method_name(geography2) comparison_operator valid_number

To return a non-null result, geography1 and geography2 must have the same Spatial Reference Identifier (SRID). Otherwise, the method returns NULL.

Spatial indexes support the following predicate forms:

geography1.STIntersects(geography2) = 1
geography1.STEquals(geography2) = 1
geography1.STDistance(geography2) < number
geography1.STDistance(geography2) <= number

您的 geography 对象可以是简单的点,这可能就足够了,因为您说过不需要高精度,尤其是当点的半径远小于 5 公里距离时。

您也可以用几个点来近似圆,例如,八边形可能是一个足够好的近似值。

查看可用的 spatial types 和方法,尝试几种方法并测试它们的性能。

您可能还会发现 STBuffer and/or BufferWithTolerance 方法可用于围绕您的点构建圆圈。