2

I am having the following issue writing points to a SQLite file using ogr with SPATIALITE enabed:

ERROR 1: Cannot insert feature with geometry of type POINTZ in column GEOMETRY. Type POINT expected

Below is my code, this code was previously used to create a GeoPackage with exactly the same fields. (But not with Spatialite enabled because it doesn't have it)

I have commented the code to indicate where the point is created and where the error message comes up

import ogr
import numpy as np
import os 
DataSource= ogr.GetDriverByName("SQLite").CreateDataSource(os.path.join(OutputFolder,"DataFile.sqlite"), options = ["SPATIALITE=YES"])
DataLayer = DataSource.CreateLayer("Data_Points",proj,geom_type=ogr.wkbPoint)

DataLayer.CreateField(ogr.FieldDefn('ID',ogr.OFTInteger64))
DataLayer.CreateField(ogr.FieldDefn('buffer_dist',ogr.OFTInteger64))
DataLayer.CreateField(ogr.FieldDefn('arr_id',ogr.OFTInteger64))

Data_layer_defn = DataLayer.GetLayerDefn()
DataSource.StartTransaction()


data = np.load(os.path.join(OutputFolder,"Output0.npy"))
arr_id = 0
for row in range(len(data)):


    point = ogr.Geometry(ogr.wkbPoint)
    point.AddPoint(float(data[row,1]),float(data[row,2])) #x,y Setting the point

    Data_Feature = ogr.Feature(Data_layer_defn)
    Data_Feature.SetField("ID", int(data[row,0]))
    Data_Feature.SetField("buffer_dist", int(data[row,3]))
    Data_Feature.SetField("arr_id", arr_id)
    Data_Feature.SetGeometry(point)
    DataLayer.CreateFeature(Data_Feature) #Error message happens on this line

    point = None
    arr_id +=1

DataSource.CommitTransaction()
DataSource.FlushCache()
7
  • Would you mind to improve you code with required imports etc?
    – user30184
    Commented Jun 16, 2019 at 20:47
  • I have added the imports necessary, there are only two
    – Francis
    Commented Jun 17, 2019 at 8:26
  • I am getting error "NameError: name 'os' is not defined".
    – user30184
    Commented Jun 17, 2019 at 9:47
  • 1
    3D geometry seems to be the default. Test with three lines point=ogr.Geometry(ogr.wkbPoint) point.AddPoint(float(1.0),float(2.0)) print point.ExportToWkt() POINT (1 2 0). The same appears here pastebin.com/ewkKPuVM.
    – user30184
    Commented Jun 17, 2019 at 11:00
  • 1
    And so as in gis.stackexchange.com/questions/199820/… you must flatten 3D into 2D first with point.FlattedTo2D().
    – user30184
    Commented Jun 17, 2019 at 11:15

1 Answer 1

3

Creating a point with 2 coordinates actually creates a 3D point as can be tested with

point=ogr.Geometry(ogr.wkbPoint)
point.AddPoint(float(1.0),float(2.0))
print point.ExportToWkt()
POINT (1 2 0)

You can turn 3D points into 2D points with FlattenTo2D

point.FlattenTo2D()
print point.ExportToWkt()
POINT (1 2)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.