使用SQL Spatial数据类型(STIntersect / STContains等)返回经纬度长的多边形

时间:2018-09-23 22:13:55

标签: sql sql-server geospatial spatial

我已经研究了两天,找不到适合我的东西,可能是我的数据库设计,但是我认为它设计得还可以。

我有一个名为“ post_codes_new”的表,它包含以下各列;

id (int)
post_code (varchar, example: "0612")
post_code_name (varchar, example: "Henderson")
latlongs (geography data type - forming a polygon)

我想做的是使用经/纬度点查询此表,以返回包含该经/纬度的任何邮政编码记录(纬度/经度落在其范围之内的任何记录)。

这就是我一直在努力的事情;

DECLARE @point geography;
SET @point = geography::STGeomFromText('POINT(174.94280000 -36.75000000)',4326)
select post_code
from dbo.post_codes_new
WHERE latlongs.MakeValid().STContains(@point) = 1;

无论我在此处输入什么纬度/经度,查询都会返回该表中1081条记录中的931条,这需要22秒。...它应该只返回一条记录。而且我当然希望有更好的性能。

我正在努力做到这一点;

['PSEUDO-CODE' QUERY OF WHAT I'D LIKE TO ACHIEVE]
SELECT post_codes.* FROM post_codes WHERE latlongs.STIntersects(myLatLongPoint) = 1 

我看过的示例(在此站点和其他地方)都似乎可以用于查询中定义的多边形(即,这些点已在查询正文中明确列出)。我看到一些人查看包含多边形边界的记录,但没有一个对我有用。

谢谢。

1 个答案:

答案 0 :(得分:0)

非常感谢@BenThul和@TomC。事实证明,确实,我的点是按顺时针方向输入的,包裹了“不包含多边形的世界其余部分”,并将其创建为多边形区域-因此,在我的查询中返回了1081条记录中的931条。 / p>

因此,我将现有的多边形点(我将其存储为nvarchar(MAX)字符串,与我的地理位置列一起)进行了反转,然后用这些反转的值覆盖了我的地理位置列。然后,我在一些已知的地址/邮政编码组合上运行查询,并且效果很好。按预期,每个查询返回一个邮政编码。很棒!

查询运行(始终)需要16秒钟,但我将作为另一个问题来解决该速度问题。

谢谢你们。