Python >> Tutoriel Python >  >> Python Tag >> JSON

Générer GeoJSON avec Python

Si vous avez un environnement de développement GDAL/OGR (en-têtes, bibliothèques), vous pouvez radicalement simplifier votre code en utilisant Fiona. Pour lire des entités à partir d'un fichier de formes, ajoutez de nouveaux attributs et écrivez-les car GeoJSON n'est qu'une poignée de lignes :

import fiona
import json

features = []
crs = None
with fiona.collection("docs/data/test_uk.shp", "r") as source:
    for feat in source:
        feat['properties'].update(...) # with your attributes
        features.append(feat)
    crs = " ".join("+%s=%s" % (k,v) for k,v in source.crs.items())

my_layer = {
    "type": "FeatureCollection",
    "features": features,
    "crs": {
        "type": "link", 
        "properties": {"href": "my_layer.crs", "type": "proj4"} }}

with open("my_layer.json", "w") as f:
    f.write(json.dumps(my_layer))
with open("my_layer.crs", "w") as f:
    f.write(crs)

Heureusement, OGR peut le faire pour vous en tant que ogr.Feature et ogr.Geometry les objets ont ExportToJson() méthodes. Dans votre code ;

fe.ExportToJson()

Et puisque les objets geojson FeatureCollection sont simplement des dictionnaires avec un type de FeatureCollection et un features objet contenant une liste d'objets Feature.

feature_collection = {"type": "FeatureCollection",
                      "features": []
                      }

feature_collection["features"].append(fe.ExportToJson())

L'objet CRS d'une collection de fonctionnalités peut être de deux types :

  • Un SCR nommé (par exemple, une URN OGC ou un code EPSG)
  • Un objet lien avec un URI et un type tel que "proj4"

En fonction de votre format de données, il est fort probable que le nom soit difficile à obtenir d'OGR. Au lieu de cela, si nous écrivons la projection dans un fichier sur disque que nous pouvons référencer avec l'URI. Nous pouvons saisir la projection de l'objet calque (qui a plusieurs fonctions d'exportation)

spatial_reference = dl.GetSpatialRef()

with open("data.crs", "wb") as f:
    f.write(spatial_reference.ExportToProj4())

feature_collection["crs"] = {"type": "link",
                             "properties": {
                                 "href": "data.crs",
                                 "type": "proj4"
                                 }
                             }

C'est le plus simple et le plus facile de Fiona. vous pouvez définir le SRS pour la sortie GeoJSON.

import fiona
from fiona.crs import from_epsg

source= fiona.open('shp/second_shp.shp', 'r', encoding = 'utf-8')

with fiona.open('tool_shp_geojson/geojson_fiona.json','w',  driver ="GeoJSON", schema=source.schema, encoding = 'utf-8', crs=fiona.crs.from_epsg(4326)) as geojson:
     geojson.write(feat)