python – Creating Python OSGEO/OGR Geometry with M-Values Without WKT

ogrosgeopythonwell-known-binarywell-known-text

I am trying (and failing) to generate M-value geometries (e.g. POINT M, POINT ZM, LINESTRING M, …) with Python's osgeo/ogr library.

Here is what I've tried to far:

import ogr 

# Use OGR specific exceptions
ogr.UseExceptions()

# Creating a list of coordinates
coords = [0, 0, 0]

# Creating a POINT M geometry
point = ogr.Geometry(ogr.wkbPointM)

# Adding the actual point data
point.AddPoint(*coords)

# Extracting the WKT of the newly-created geometry
print(point.ExportToIsoWkt())

> POINT Z (0 0 0)

The code above outputs a POINT Z geometry, not a POINT M geometry. The third value is being interpreted as a regular coordinate, not an M-value.

How can I avoid this?

A cumbersome workaround

I know one dirty trick that works: to use WKT instead. Here's the code:

# Creating a list of coordinates
coords = [0, 0, 0]

# Making a WKT string
pt_wkt = f'POINT M({" ".join([str(coord) for coord in coords])})'


# Converting the WKT string to a geometry
pt_ogr = ogr.CreateGeometryFromWkt(pt_wkt)

# Extracting the WKT back out from the geometry
print(pt_ogr.ExportToIsoWkt())
> 'POINT M (0 0 0)'

The snippet above works: it generates a POINT M geometry, as expected. However, converting a list of coordinates into a WKT can be quite cumbersome, depending on the type of geometry. Also, the creation of this ogr geometry is just going to be a small part of a larger process, so I want to avoid the conversion of a list of coordinates to a WKT string. If I can figure out the correct way to use the wkbPointM geometry (and all other M-value geometries), I might be able to speed things up significantly.

So, I am back to my main question: what is the correct way to create M-value-enabled geometries using Python's osgeo/ogr library from a list of coordinates without converting them into a WKT first?

Best Answer

Try AddPointM() instead of AddPoint():

AddPointM(Geometry self, double x, double y, double m)

https://gdal.org/python/osgeo.ogr.Geometry-class.html#AddPointM