5

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 ?

PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked May 18, 2018 at 9:44
1
  • 1
    Did my advice provide any help? Commented May 19, 2018 at 19:42

3 Answers 3

5

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()
answered May 20, 2018 at 22:42
4

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:

  1. Official pyshp docs
  2. Another library to create shapefiles with python - ogr
answered May 18, 2018 at 16:33
2

Just use FIONA a python wrapper for OGR and allows you to build and convert any data. Or just OGR2OGR

answered May 20, 2018 at 18:28

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.