当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Sql2008查询问题-哪个LatLong存在于地理多边形中?》经验,为你挑选了1个好方法。

我有以下两个表: -

GeoShapes

GeoShapeId INT IDENTITY

名称VARCHAR(100)

ShapeFile GEOGRAPHY [这是一个封闭的Lat/Longs多边形]

CrimeLocations

CrimeLocationId INT IDENTITY

LatLong GEOGRAPHY [这是一个Lat/Long Point]

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

我想弄清楚哪些GeoShapes内部存在500个犯罪拉/长点.

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

干杯!

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

编辑2:我知道如何使用STContainsSTIntersects.请不要提供基本的例子.我对使用上面的表结构进行复杂查询更感兴趣.



1> Conceptdev..:

关于您的"编辑",您通常不会看到包含"请不要提供......"的问题.当然每一点点都有帮助吗?特别是因为你没有真正向我们展示你知道的STContainsSTIntersects(或者Filter()就此而言)......

无论如何,我有一个方便的zipcodes和storelocations数据库,所以我重命名了表/列以匹配你的(我有6,535个CrimeLocatoins和3,285个GeoShapes).我认为你现在已经弄明白了 - 但其他人可能会觉得这很有用......

下面的查询返回的数量CrimeLocations每个GeoShapes.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
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那里添加子查询,或者从单独的查询中添加总计的变量.

这够复杂吗?

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有