访问与 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_geom
和 mline_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.
中
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)
如何访问线几何的多个 M 值?考虑到所讨论的线几何可以是使用 osgeo
/ogr
.
这是一个可重现的小例子:
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_geom
和 mline_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.
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)