首页 > 解决方案 > 使用 SQL 空间数据类型(STIntersect/STContains 等)返回 lat long 所在的多边形

问题描述

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

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

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

我试图做的是使用 lat/long 点查询此表以返回包含该 lat/long 的任何 post_codes 记录(lat/long 落在边界内的任何记录)。

这是我一直在做的事情;

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 

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

谢谢。

标签: sqlsql-servergeospatialspatial

解决方案


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

所以我拿了我现有的多边形点(我存储为 nvarchar(MAX) 字符串,在我的地理列旁边)并反转它们,然后用这些反转值重写我的地理列。然后,我对一些已知的地址/邮政编码组合进行了查询,并且效果很好。正如预期的那样,每个查询返回一个邮政编码。杰出的!

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

感谢你们。


推荐阅读