1

How to set the CRS when writing an ESRI Shapefile using Fiona on a modern Python version (>3.x)?

Why "modern"? Because Python 2 is now deprecated and this user asked a similar question for Python 2.7, which received (now probably) old fashioned answers: Fiona fails to write CRS to shapefile

Taras
  • 32,823
  • 4
  • 66
  • 137
swiss_knight
  • 10,309
  • 9
  • 45
  • 117

1 Answers1

1

This should work out of the box with fiona.__version__ : '1.8.20' (Python 3.6.9):

import fiona
from shapely.geometry import Point, mapping

my_schema = { 'geometry': 'Point', 'properties': { 'id': 'int', 'attribute1': 'float'}, }

my_id = 1 a_shapely_point = Point(9.17044, 45.45340)

with fiona.open('/path/to/shapefile.shp', mode='w', driver='ESRI Shapefile', crs='epsg:4326', # <-------- Set CRS here using EPSG code! schema=my_schema) as c: c.write( { 'geometry': mapping(a_shapely_point), 'properties': {'id': my_id, 'attribute1': 3.1415}, } )

You can then check it has been correctly written with ogrinfo for example:

$ cd /path/to
$ ogrinfo -so -ro -al shapefile.shp

INFO: Open of shapefile.shp' using driverESRI Shapefile' successful.

Layer name: test Metadata: DBF_DATE_LAST_UPDATE=2021-07-14 Geometry: Point Feature Count: 1 Extent: (9.170440, 45.453400) - (9.170440, 45.453400) Layer SRS WKT: GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["latitude",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["longitude",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]] Data axis to CRS axis mapping: 2,1 id: Integer64 (18.0) attribute1: Real (24.15)

It also loads flawlessly in QGIS.

Doc on fiona.open(): https://fiona.readthedocs.io/en/latest/fiona.html#fiona.open

swiss_knight
  • 10,309
  • 9
  • 45
  • 117