Microsoft SQL Server查询不在美国/指定矩形内的geometry类型点数据
实现不在美国境内点的SQL查询方案
没问题,我来帮你一步步搞定这个需求~
一、先用矩形范围快速筛选(临时方案)
根据你的要求,我们先构建一个覆盖美国(包含加拿大部分区域)的矩形,筛选出不在这个矩形内的点。SQL Server的geometry类型自带的STWithin()方法可以轻松判断点是否在某个几何范围内。
1. 确定矩形边界坐标
结合阿拉斯加到佛罗里达的范围,我们可以设定以下大致边界:
- 最西经度:-170(阿拉斯加西侧附近)
- 最东经度:-65(佛罗里达东侧附近)
- 最南纬度:24(佛罗里达南侧附近)
- 最北纬度:71(阿拉斯加北侧,覆盖加拿大北部部分区域)
2. 编写查询语句
我们用STPolyFromText()生成矩形的多边形对象,然后筛选出不在该范围内的记录:
-- 筛选不在目标矩形内的所有点 SELECT * FROM MyData WHERE latlng.STWithin( geometry::STPolyFromText( 'POLYGON((-170 24, -65 24, -65 71, -170 71, -170 24))', 0 -- 这里的SRID要和你的latlng列保持一致!默认是0,若用WGS84坐标系则填4326 ) ) = 0;
划重点:如果你的
latlng列用的是WGS84(全球通用的GPS坐标系,SRID=4326),一定要把上面的0改成4326,否则空间判断会出错。
二、替换为美国复杂多边形(后续优化)
等你拿到美国完整边界的WKT格式数据后,只需要把矩形的WKT替换成美国的多边形WKT就行。如果是包含夏威夷、阿拉斯加这类飞地的多部分边界,要用MULTIPOLYGON类型的WKT:
-- 用美国完整边界多边形筛选不在境内的点 SELECT * FROM MyData WHERE latlng.STWithin( geometry::STPolyFromText( 'MULTIPOLYGON((...这里替换成美国边界的完整WKT字符串...))', 4326 -- 保持和latlng列一致的SRID ) ) = 0;
小贴士:美国边界的WKT可以从公开地理数据平台获取,注意要和你的坐标系匹配哦。
提升查询性能的小技巧
如果你的MyData表数据量很大,记得给latlng列创建空间索引,不然查询会很慢:
CREATE SPATIAL INDEX SIX_MyData_latlng ON MyData(latlng);
另外,也可以用STIntersects()反向判断,效果和STWithin()是一样的:latlng.STIntersects(多边形) = 0,选你顺手的写法就行。
内容的提问来源于stack exchange,提问作者Jtello




