4

我有以下两个表:-

地理形状

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

犯罪地点

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

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

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

:( 我就是不明白!我试图STIntersects在子查询上做一个但没有用。有什么建议吗?

干杯!

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

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

4

1 回答 1

6

关于您的“编辑”,您通常不会看到包含“请不要提供...”的问题。当然,每一点都有帮助吗?特别是因为您实际上还没有向我们展示您知道的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

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

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子查询,或者一个带有来自单独查询的总数的变量。

够复杂吗?

于 2009-10-11T11:36:49.617 回答