sql - 使用 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
我看过的例子(在这个站点和其他地方)似乎都适用于查询中定义的多边形(即,点在查询正文中明确列出)。我见过一些查看包含多边形边界的记录,但没有一个对我有用。
谢谢。
解决方案
非常感谢@BenThul 和@TomC。事实证明,确实,我的点是按顺时针方向输入的,它包裹了“世界其他地方,不包括你的多边形”并将其创建为一个多边形区域——因此在我的查询中返回了 1081 条记录中的 931 条。
所以我拿了我现有的多边形点(我存储为 nvarchar(MAX) 字符串,在我的地理列旁边)并反转它们,然后用这些反转值重写我的地理列。然后,我对一些已知的地址/邮政编码组合进行了查询,并且效果很好。正如预期的那样,每个查询返回一个邮政编码。杰出的!
查询运行需要(始终)16 秒,但我将把这个速度问题作为一个单独的问题来处理。
感谢你们。
推荐阅读
- c# - 如何在 asp .net MVC 5 中将对象结果模型转换为自定义视图模型
- c# - 从 WPF 应用程序检查用户是否存在于 Azure AD 中
- python - 我想在 Python 中将逗号分隔的文件作为数组读取
- c++ - 为什么这个函数模板在 hpp 文件中不起作用?
- node.js - 如何在消息事件之外使用消息数据?
- php - 将静态文件夹作为插件推出并通过 domainname.com/anyname 访问
- angular - 如何在 Function 内部 SpyOn 函数并返回 Fake 值
- html - 为什么在这种无序列表格式中第二个标题“Chemicals”卡在右侧?
- apache - 在服务器 (Ubuntu) 中找不到请求的 URL
- javascript - 如何在同一条消息中发送附件和嵌入?