You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动