繁体   English   中英

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

[英]Return the polygon that lat long resides within using SQL Spatial Data types (STIntersect/STContains etc)

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

我有一个名为“ 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 

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

谢谢。

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

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

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

感谢大伙们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM