使用 SQL 空间数据类型(STIntersect/STContains 等)返回经度驻留的多边形



我已经研究了两天了,找不到任何适合我的东西,这可能是我的数据库设计,但我认为它的设计很好。

我有一个名为"post_codes_new"的表格,它包含以下列;

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

我正在尝试做的是使用经度/经度点查询此表,以返回包含该经度/经度的任何post_codes记录(经度/经度落在其边界内的任何记录(。

这是我一直在做的事情;

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 

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

谢谢。

非常感谢@BenThul和@TomC。事实证明,我的点确实是按顺时针方向输入的,它包裹了"世界其他地区,不包括您的多边形"并将其创建为多边形区域 - 因此在我的查询中返回了 1081 条记录中的 931 条。

因此,我采用了现有的多边形点(我将其存储为 nvarchar(MAX( 字符串,与地理列一起(并反转它们,然后用这些反转的值覆盖我的地理列。然后,我对一些已知的地址/邮政编码组合运行了查询,它运行良好。按预期,每个查询返回一个邮政编码。明!

查询运行(始终(需要 16 秒,但我将把这个速度问题作为一个单独的问题来处理。

谢谢你们。

最新更新