使用多边形列表过滤点列表

问题描述

给出一个点列表和一个多边形列表。如何返回列表中任何多边形中的点列表(原始点列表的子集)

为了简单起见,我删除了示例表中的其他列

积分表:

| Longitude| Latitude  |
|----------|-----------|
| 7.07491  | 51.28725  |
| 3.674765 | 51.40205  |
| 6.049105 | 51.86624  |

LocationPolygons表:

|     LineString       |
|----------------------|
| CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (-122.20 47.45,-122.81 47.0,-122.942505 46.687131 ...  |
| MULTIPOLYGON (((-110.3086 24.2154,-110.30842 24.2185966,-110.3127...


如果我有LocationPolygons表中的行,我可以做类似的事情

DECLARE @homeLocation geography;  
SET @homeLocation = (select top 1 GEOGRAPHY::STGeomFromText(LineString,4326)
FROM LocationPolygon where LocationPolygonId = '123abc')

select Id,Longitude,Latitude,@homeLocation.STContains(geography::Point(Latitude,4326)) 
as IsInLocation from Points PointId in (1,2,3,)

将以以下格式返回我想要的内容。但是,这仅适用于列表中的一个位置

| Id | Longitude| Latitude  | IsInLocation |
|----|----------|-----------|--------------|
| 1  | 7.07491  | 51.28725  | 0            |
| 2  | 3.674765 | 51.40205  | 1            |
| 3  | 6.049105 | 51.86624  | 0            |

如何处理LocationPolygon表的多行情况?

我想知道

  1. 如果任何点在任何locationPolygons中?
  2. 它们位于哪个特定位置的多边形?或者它们在一个以上的多边形中。

问题2更为额外。有人可以帮忙吗?

更新#1 回应@ Ben-Thul的答案。

不幸的是,我没有访问/权限来更改原始表,我可以请求访问,但不确定会给予访问权限。因此不确定我是否可以添加列或创建索引。尽管我可以在存储的proc中创建临时表,但也许可以用这种方式测试您的解决方案

我偶然发现了如下所示的答案,但对使用交叉联接对性能的影响有些担心。

WITH cte AS (     
      select *,(GEOGRAPHY::STGeomFromText(LineString,4326)).STContains(geography::Point(Latitude,4326)) as IsInALocation  from 
(     
    select Longitude,Latitude from Points nolock  
) a cross join (
    select LineString FROM LocationPolygons nolock 
) b
)

select * from cte where IsInALocation = 1

显然,最好查看查询计划,但是我偶然发现的解决方案与您的解决方案基本相同吗?有没有我错过的潜在问题。对此表示歉意,但是我的sql不太好。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)