Wednesday, 19 July 2017

Creating shapefile in standalone script using PyQGIS?



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 ?



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()

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...