【问题标题】:determine if geography point falls on geography polygon line确定地理点是否落在地理多边形线上
【发布时间】:2016-02-13 22:13:34
【问题描述】:

我知道您无法使用类似的方法检查地理点是否接触例如地理多边形(请参阅here),这在几何世界中是可能的:

WHERE A.Geo.STTouches(@s0) = 1

有没有办法在地理世界中实现这一目标?我想一个解决方案是将地理多边形+地理点转换为它们的几何等价物?

PS:

这也适用于复杂的多边形——比如这个有孔的:

POLYGON((99.999999999999986 5.3926387744713564E-14,101.00000000000001 5.3926387744713564E-14,100.99999999999987 1.0000000000000155,100.00000000000013 1.0000000000000155,99.999999999999986 5.3926387744713564E-14),(100.20000000000003 0.19999999999992918,100.19999999999989 0.79999999999990257,100.80000000000011 0.79999999999990234,100.79999999999998 0.19999999999992912,100.20000000000003 0.19999999999992918))

【问题讨论】:

  • STIntersects()代替STTouches()怎么样?
  • 我想知道它正好在边界上。 STIntersects() 不会告诉我这个。希望这是有道理的?
  • 啊……那是一匹不同颜色的马。基本上,您想知道该点是否与多边形的边界相交。

标签: sql-server geospatial sql-server-2014


【解决方案1】:

我假设您想要跟踪给定点是否与多边形的边界相交。以下应该可以解决问题:

SELECT @point.STIntersects(@polygon.RingN(1));

本质上,你得到的是RingN(1) 的外边界(我假设这是一个简单的多边形,所以第一个环应该是外边界)然后检查 那个 与您关心的点相交。

编辑:如果您想检查给定点是否位于给定多边形中 any 环的边界上,这样的事情应该可以解决问题:

select n.n as [IntersectedRingNumber], 
   @polygon.RingN(n) as [IntersectedRing]
from dbo.Numbers as n
where n <= @polygon.NumRings()
   and @point.STIntersects(@polygon.RingN(n)) = 1;

【讨论】:

  • 这是个好主意。理想情况下,它也应该适用于复杂的多边形 - 请参阅原始问题中的 PS。
  • 绝对是这样做的。根据您正在寻找的准确度级别,您可能希望考虑使用一个小缓冲区来解决潜在的坐标舍入问题和/或数据质量问题。例如SELECT @point.STBuffer(0.1)...。这大约。 10cm 缓冲区对于大多数地理要求来说足够准确,但允许 10.9999999999993 等于 11(或 10.99999)。
  • @csetzkorn:应该。 AFAIK,环 1 始终是最外层的环,因此会给你你想要的。
  • 谢谢,但是如何检查点是否位于任何带有一点缓冲区的内孔边界上?
  • @JonBellamy:我想到了你对我今天开车的评论,这是一个非常好的观点。当然,操作顺序很重要;外环周围的缓冲区会产生一个狭窄的二维带,而缓冲区周围的环仍然只是一条一维线。我知道你知道这一点,但我是为了明确起见。
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 2014-02-15
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2013-11-08
  • 2014-11-18
相关资源
最近更新 更多