我精通 SQL,但不熟悉使用 SQL 几何功能。我有一个可能是一个非常基本的问题要解决,但我还没有在网上找到任何好的资源来解释如何使用几何对象。(Technet 是一种糟糕的学习新事物的方式......)
我在笛卡尔平面上有一个二维点的集合,我试图找到半径集合内的所有点。
我使用如下语法创建并填充了一个表:
更新 [事物] 设置 [位置] = geometry::Point(@X, @Y, 0)
(@X,@Y 只是 x 和 y 值,0 是所有对象共享的任意数字,如果我理解正确,允许设置过滤)
这是我偏离轨道的地方......我是否尝试使用它构建某种多边形集合和查询,或者是否有一些简单的方法来检查多个半径的交集而不构建一堆圆形多边形?
附录:如果没有人知道多半径问题的答案,那么单半径解决方案是什么?
更新
以下是我处理的一些示例,使用虚构的星数据库,其中星作为点存储在 xy 网格上:
选择框中的所有点:
DECLARE @polygon geometry = geometry::STGeomFromText('POLYGON(('
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + ','
+ CAST(@MaxX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + ', '
+ CAST(@MaxX AS VARCHAR(10)) + ' ' + CAST(@MaxY AS VARCHAR(10)) + ','
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MaxY AS VARCHAR(10)) + ','
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + '))', 0);
SELECT [Star].[Name] AS [StarName],
[Star].[StarTypeId] AS [StarTypeId],
FROM [Star]
WHERE @polygon.STContains([Star].[Location]) = 1
使用它作为模式,您可以做各种有趣的事情,例如定义多个多边形:
WHERE @polygon1.STContains([Star].[Location]) = 1
OR @polygon2.STContains([Star].[Location]) = 1
OR @polygon3.STContains([Star].[Location]) = 1
或检查距离:
WHERE [Star].[Location].STDistance(@polygon1) < @SomeDistance
示例插入语句
INSERT [Star]
(
[Name],
[StarTypeId],
[Location],
)
VALUES
(
@Name,
@StarTypeId,
GEOMETRY::Point(@LocationX, @LocationY, 0),
)