访问与 LINESTRING M 和 MULTILINESTRING M 几何关联的 M 值

Accessing M-values associated to LINESTRING M and MULTILINESTRING M geometries

如何访问线几何的多个 M 值?考虑到所讨论的线几何可以是使用 osgeo/ogr.

创建的 LINESTRING M 或 MULTILINESTRING M 几何

这是一个可重现的小例子:

from osgeo import ogr

line_wkt  = 'LINESTRING M (0 0 5, 0 1 6, 1 1 10)'
line_geom = ogr.CreateGeometryFromWkt(line_wkt)


mline_wkt = 'MULTILINESTRING M ((0 0 5, 0 1 6, 1 1 10), (1 1 10, 2 1 20, 3 1 30))'
mline_geom = ogr.CreateGeometryFromWkt(mline_wkt)

在上面的示例中,line_geommline_geom 对象已成功存储了它们各自的 M 值,但我很难访问它们。

我正在搜索一个函数,它将 return [5,6,10] 用于 line_geom 对象,[[5,6,10],[10,20,30]] 用于 mline_geom 对象。

以下是我尝试过但最终没有奏效的备选方案:

使用GetM()方法

GetM() 方法似乎没有给我我想要的东西。例如,当我执行 line_geom.GetM() 时,我只是返回 5.0。我认为它只是给出了直线中第一个点的 M 值。

此外,当我尝试 line_geom.GetM() 时,我返回 0.0 然后是一堆 ERROR 6: Incompatible geometry for operation

使用GetPoints()方法

我想我可以使用 GetPoints() 方法遍历一条线的点并通过那里访问 M 值。不幸的是,这也不起作用 - 当我 运行 line_geom.GetPoints() 时,结果列表不包含 M 值:[(0.0, 0.0), (0.0, 1.0), (1.0, 1.0)].

此外,当我尝试 mline_geom.GetPoints() 时,我得到了一堆 ERROR 6: Incompatible geometry for operation

备注

解决方案需要在 Python 中。我知道我可以使用 ogr2ogr 的 CLI 做很多事情,但这只是更大事情的一小部分,需要在 Python.

参见OGR Geometry docs

GetM(Geometry self, int point=0)

默认情况下,只需调用 line_geom.GetM() 就会 return 第一个点的度量 - 默认 point=0 参数。

对于多线串,您需要先获取每个单独的几何图形,然后再获取点和测量值。

line_wkt  = 'LINESTRING M (0 0 5, 0 1 6, 1 1 10)'
line_geom = ogr.CreateGeometryFromWkt(line_wkt)

for i, point in enumerate(line_geom.GetPoints()):
    print(line_geom.GetM(i), point)


mline_wkt = 'MULTILINESTRING M ((0 0 5, 0 1 6, 1 1 10), (1 1 10, 2 1 20, 3 1 30))'
mline_geom = ogr.CreateGeometryFromWkt(mline_wkt)

for j in range(mline_geom.GetGeometryCount()):
    geom = mline_geom.GetGeometryRef(j)
    for i, point in enumerate(geom.GetPoints()):
        print(geom.GetM(i), point)

输出:

5.0 (0.0, 0.0)
6.0 (0.0, 1.0)
10.0 (1.0, 1.0)
5.0 (0.0, 0.0)
6.0 (0.0, 1.0)
10.0 (1.0, 1.0)
10.0 (1.0, 1.0)
20.0 (2.0, 1.0)
30.0 (3.0, 1.0)