将几何转换为地理会产生无效的形状

问题描述 投票:0回答:1

我有两个 Polygon 或 MultiPolygon 类型的 Geometry 形状 [with Lat & Lng points] 我想得到它们的相交形状。 我这样做如下:

land_shape.STIntersection(grid_shape) as shape

然后,我看看什么时候

shape.STIsValid() = 1 and geography::STGeomFromText(shape.STAsText(), 4326).STIsValid() <> 1

我得到了很多结果。在某些情况下,相交形状作为几何是有效的,但作为地理则不是。这是一个问题,因为我建立在地理形状上以获得该区域。

我测试过将两个输入

(land_shape & grid_shape)
转换为地理是否也无效,但它们并非无效。因此,输入没有损坏。

我不确定是什么导致相交形状作为地理无效。 我尝试使用

IsValidDetailed()
,原因是:

24409: Not valid because some portion of polygon ring (1) lies in the interior of a polygon.
24413: Not valid because of two overlapping edges in curve (1).

但是,为什么它们作为几何有效呢?我知道

MakeValid()
可以修复它,但我只需要了解为什么会发生这种行为,如果我可以在不使用 SQL Server 的情况下消除这个问题
MakeValid()
正如我所读的那样并不完全准确。

sql-server spatial sqlgeography
1个回答
0
投票

将几何图形保存为 WKT 并将其读取为地理图形无法正确地从几何图形转换为地理图形。这两种类型对该 WKT 有不同的解释,即使它们都使用相似的 WKT 并且它们使用相同的坐标。几何中两个顶点之间的边是平面地图上的直线。地理中相同两个顶点之间的边遵循测地线 - 所以这是一条非常不同的线。

考虑例如两个循环:

  'linestring(30 40, 80 40, 80 60, 30 60, 30 40)'

  'linestring(50 42, 60 42, 60 50, 50 50, 50 42)'

在平面地图上,第二个环严格地在第一个环内 - 所以你可以制作一个多边形,第一个环作为壳,第二个环作为洞 - 这将是一个有效的多边形。但是,如果您使用相同的 WKT 并尝试将其解释为地理 - 第二个循环与第一个循环相交,并且如果您以相同的方式构建多边形 - 它不再有效。

因此多边形

 'polygon((30 40, 80 40, 80 60, 30 60, 30 40),(50 42, 60 42, 60 50, 50 50, 50 42))'

作为 Geometry 有效,但作为 Geography 无效。还有关于反子午线和极点的问题。正确的转换意味着将 Geometry 的“平坦”边缘与 Geography 的测地线边缘近似,反之亦然 - 通常涉及边缘的致密化,即在中间添加一些点。例如。这就是 Google BigQuery 在这种情况下所做的:

select st_geogfromtext(
    'polygon((30 40, 80 40, 80 60, 30 60, 30 40),(50 42, 60 42, 60 50, 50 50, 50 42))', 
    planar => TRUE)

注意

planar
参数,它告诉 BigQuery 输入来自平面几何体。结果相当大,但它遵循原始的“扁平”形状,精度约为 10 米:

POLYGON((30 40, 30.1953125 40, 30.390625 40, 30.5859375 40, 30.78125 40, 30.9765625 40, 31.171875 40, 31.3671875 40, 31.5625 40, 31.7578125 40, 31.953125 40, 32.1484375 40, 32.34375 40, 32.5390625 40, 32.734375 40, 32.9296875 40, 33.125 40, 33.3203125 40, ....

还有一个问题是环方向 - 这对几何无关紧要,但对地理非常重要,请参阅https://learn.microsoft.com/en-us/sql/relational-databases/spatial/polygon?view= sql-server-ver16#orientation-of-spatial-data

© www.soinside.com 2019 - 2024. All rights reserved.