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 ?
-
1Did my advice provide any help?Basile– Basile2018年05月19日 19:42:08 +00:00Commented May 19, 2018 at 19:42
3 Answers 3
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()
One of the easiest python libraries to read/write shapefiles is pyshp. You can install it with pip:
pip install pyshp
After you can import the library and create your shapefile:
import shapefile
out_file = 'test.shp'
# Set up a shapefile writer
writer = shapefile.Writer(shapeType=shapefile.POINT)
# Create empty fields
writer.field("ID_HYD", "N") # integer field - see pyshp docs
writer.field("SBD_KM2", "F") # float field - see pyshp docs
# Save shapefile
writer.save(out_file)
These links may help you to get started:
Just use FIONA a python wrapper for OGR and allows you to build and convert any data. Or just OGR2OGR