访问与 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_geommline_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 和具有半径的点的交集

将字符串的小节转换为 int c++

确定 Shapely 点是不是在 LineString/MultiLineString 内

ios LINESTRING解析

MySQL数据类型 - 空间数据类型