问题描述
给出一个点列表和一个多边形列表。如何返回列表中任何多边形中的点列表(原始点列表的子集)
为了简单起见,我删除了示例表中的其他列
积分表:
| 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表的多行情况?
我想知道
- 如果任何点在任何locationPolygons中?
- 它们位于哪个特定位置的多边形?或者它们在一个以上的多边形中。
问题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 (将#修改为@)