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?