[GIS] Creating shapefile in standalone script using PyQGIS

pyqgisshapefile

I'm trying to write a standalone script that writes a shapefile (using QGIS 3.0.2). I've tried something like :

from qgis.core import *
from qgis.PyQt.QtCore import QVariant
from qgis.utils import QGis


QgsApplication.setPrefixPath("/usr/bin/qgis", True)
qgs = QgsApplication([], False)

qgs.initQgis()

fields = QgsFields()
fields.append(QgsField("ID_HYD", QVariant.Int))
fields.append(QgsField("SBD_KM2", QVariant.Double))


writer = QgsVectorFileWriter("/home/sylvain/test.shp",
                             "CP1250",
                             fields,
                             QGis.WKBPoint,
                             None,
                             "ESRI Shapefile")

qgs.exitQgis()

The issue is as follow :

/usr/bin/python3.5 /home/sylvain/test.py
Must construct a QGuiApplication first.

Process finished with exit code 1

Is there a way to write a shapefile on drive without constructing a GUIApplication ?

If not, how should I do do create such an item ?

Best Answer

You are getting the error in line 3 from qgis.utils import QGis. In QGIS 3, geometry types is specified by QgsWkbTypes enum in core library. Thus, remove from qgis.utils import QGis

Use script in the following way. Notice highlighted lines with ####.

from qgis.core import *
from qgis.PyQt.QtCore import QVariant
# from qgis.utils import QGis  # REMOVE THIS LINE ####

QgsApplication.setPrefixPath("/usr/bin/qgis", True)
qgs = QgsApplication([], False)

qgs.initQgis()

fields = QgsFields()
fields.append(QgsField("ID_HYD", QVariant.Int))
fields.append(QgsField("SBD_KM2", QVariant.Double))


writer = QgsVectorFileWriter("/home/sylvain/test.shp",
                             "CP1250",
                             fields,
                             QgsWkbTypes.Point, #### instead of QGis.WKBPoint
                             QgsCoordinateReferenceSystem(), #### instead of None
                             "ESRI Shapefile")

qgs.exitQgis()
Related Question