Sql 2008 查询问题 - 哪个 LatLong 存在于地理多边形中?

Posted

技术标签:

【中文标题】Sql 2008 查询问题 - 哪个 LatLong 存在于地理多边形中?【英文标题】:Sql 2008 query problem - which LatLong's exists in a geography polygon? 【发布时间】:2008-11-20 00:11:08 【问题描述】:

我有以下两个表:-

地理形状

GeoShapeId INT IDENTITY 名称 VARCHAR(100) ShapeFile GEOGRAPHY [这是纬度/经度的封闭多边形]

犯罪地点

CrimeLocationId INT IDENTITY LatLong GEOGRAPHY [这是一个纬度/经度点]

现在,我有大约 10K GeoShape 结果和大约 500CrimeLocations。

我正在尝试找出所有 500 个犯罪纬度/经度点都存在于哪些 GeoShapes 中。

:(我只是不明白!我试图在子查询上执行STIntersects,但没有成功。有什么建议吗?

干杯!

编辑 1:我不能使用任何 GEOMETRY 函数......因为(如上所述)这些都是地理类型。

编辑 2:我知道如何使用 STContainsSTIntersects。请不要提供这方面的基本示例。我更想对上面的表结构进行复杂的查询。

【问题讨论】:

您应该粘贴您尝试过的内容以及为什么它不起作用。这可能会给你更好的建议。 【参考方案1】:

关于您的“修改”,您通常不会看到包含“请不要提供...”的问题。当然,每一点都有帮助吗?特别是因为您实际上并没有向我们展示您对STContainsSTIntersects(或Filter() 就此事)的了解...

无论如何,我有一个方便的邮政编码和存储位置数据库,所以我重命名了表/列以匹配您的(然后我有 6,535 个 CrimeLocatoins 和 3,285 个 GeoShapes)。我想你现在已经明白了 - 但其他人可能会觉得这很有用......

以下查询返回每个 GeoShapes.ShapeFile

CrimeLocations 的数量
SELECT G.Name, COUNT(CL.Id)
FROM   GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
ORDER BY 2 DESC

这需要 ages(比如 20 分钟),因为我没有设置任何地理空间索引,而且我的 ShapeFile 点数很高,但它确实运行成功。如果我想按照您的建议限制结果:

SELECT G.Name, COUNT(CL.Id)
FROM   GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
HAVING COUNT(CL.Id) = 500

当然,您不想硬编码数字 500 - 因此您可以在其中添加一个 COUNT(*) FROM CrimeLocations 子查询,或者一个带有来自单独查询的总数的变量。

够复杂吗?

【讨论】:

那很好 :) 我最终弄清楚了一段时间,这基本上就是我所做的。干杯队友! 很高兴你知道了。我注意到这个问题有多老了,但认为对于有同样问题的其他人来说值得回答......空间函数的伟大之处在于,一旦你了解它们,它们就可以很容易地做一些非常复杂的事情东西。

以上是关于Sql 2008 查询问题 - 哪个 LatLong 存在于地理多边形中?的主要内容,如果未能解决你的问题,请参考以下文章

sql查询大于字段的所有数据,或小于字段的所有数据

微软的SQL Server 2005与SQL Server 2008有啥区别?学习选哪个好?

我的sqlserver 2008总是经常性的SQL server身份连不上数据库的问题 你是打sql哪个补丁的

sql 2008和sql 2012的区别

请教到底哪个版本的SQLServer数据库才兼容Vista?内详

sqlserver2008r2 死锁