访问与 LINESTRING M 和 MULTILINESTRING M 几何相关的 M 值
Posted
技术标签:
【中文标题】访问与 LINESTRING M 和 MULTILINESTRING M 几何相关的 M 值【英文标题】:Accessing M-values associated to LINESTRING M and MULTILINESTRING M geometries 【发布时间】:2021-11-25 07:36:29 【问题描述】:如何访问线几何的多个 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 值,但我很难访问它们。
我正在寻找一个函数,它将为line_geom
对象返回[5,6,10]
,为mline_geom
对象返回[[5,6,10],[10,20,30]]
。
以下是我尝试过但最终不起作用的替代方案:
使用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 中。
【问题讨论】:
【参考方案1】:见OGR Geometry docs:
GetM(Geometry self, int point=0)
默认情况下,仅调用 line_geom.GetM()
将返回第一个点的度量 - 默认 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)
【讨论】:
THANKYOUTHANKYOUTHANKYOU!!!这是超级清晰和有用的!!!!我最初尝试查看文档文件,但我很快就迷路了......再次感谢,这太棒了!!!以上是关于访问与 LINESTRING M 和 MULTILINESTRING M 几何相关的 M 值的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB $geoIntersects 与 LineString 类型不匹配
MongoDB:如何确定 GeoJson LineString 和具有半径的点的交集