我精通SQL,但新的使用SQL几何特征。我有什么可能是解决一个非常基本的问题,但我还没有发现任何好的资源网上解释如何使用几何对象。 (Technet是一种学习新事物的糟糕方式......)SQL几何找到的所有点的半径
我有一个笛卡尔飞机上的2d点的集合,我试图找到半径集合内的所有点。
我创建和使用的语法像填充一个表:
更新[观光]将[位置] =几何::点(@X,@Y,0)
(@ X,@ÿ只是x和y的值,0是允许设置的过滤,如果我理解正确
这里所有对象共享一个任意数)我走到哪里出轨......难道我试图建立某种形式的多边形采集和查询使用,或者是有检查多个半径的交叉点无需建立一堆圆形多边形的一些简单的方法是什么?
附录:如果没有人有答案的多个半径的问题,什么是单个半径的解决方案?
UPDATE
下面是一些例子我曾起来,用一个虚构的星数据库,在那里星星都存储在一个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
(
@GameId,
@Name,
@StarTypeId,
GEOMETRY::Point(@LocationX, @LocationY, 0),
)
有趣的第二个解决方案,我需要玩一点,然后想一想。两个小点:我非常肯定,除非你在曲面上工作,否则你不想使用GEOGRAPHY 4326,这是一个非欧几里德曲面。这是一个平坦的空间问题,所以使用GEOMETRY可能是正确的选择。其次,在你的示例中,你建议使用一个sql临时表,当使用一个表变量会更好(更快)。临时表写入磁盘,表中的变量存储在内存中。 – MadTigger
@MadTigger我无法就使用表变量达成一致,但如果我诚实地说,我没有花时间去优化,更多的理论可以帮助你,因为你已经有4个星期了解决了它! :-)再次原谅4326的假设,如果你正在研究平坦空间问题,那么你完全可以不使用4326并使用几何。我只是习惯于人们使用几何来解决实际的“地球”问题,因为他们应该使用地理,而且你的问题在这个问题上还不清楚。假设习惯是我应该踢的一个习惯。 –