Je veux créer par programme un fichier GeoJSON en utilisant des polygones à partir d'un fichier de formes mais en ajoutant des attributs de ma propre application.
Cela se fait facilement pour un fichier de formes:
def create_data_dayer(self,varlist, data):
"""
Creates a new shape to contain data about nodes.
varlist is the list of fields names associated with
the nodes.
data is a list of lists whose first element is the geocode
and the remaining elements are values of the fields, in the
same order as they appear in varlist.
"""
if os.path.exists(os.path.join(self.outdir,'Data.shp')):
os.remove(os.path.join(self.outdir,'Data.shp'))
os.remove(os.path.join(self.outdir,'Data.shx'))
os.remove(os.path.join(self.outdir,'Data.dbf'))
# Creates a new shape file to hold the data
if not self.datasource:
dsd = self.driver.CreateDataSource(os.path.join(self.outdir,'Data.shp'))
self.datasource = dsd
dl = dsd.CreateLayer("sim_results",geom_type=ogr.wkbPolygon)
#Create the fields
fi1 = ogr.FieldDefn("geocode",field_type=ogr.OFTInteger)
dl.CreateField(fi1)
for v in varlist:
#print "creating data fields"
fi = ogr.FieldDefn(v,field_type=ogr.OFTString)
fi.SetPrecision(12)
dl.CreateField(fi)
#Add the features (points)
for n,l in enumerate(data):
#Iterate over the lines of the data matrix.
gc = l[0]
try:
geom = self.geomdict[gc]
if geom.GetGeometryType() != 3: continue
#print geom.GetGeometryCount()
fe = ogr.Feature(dl.GetLayerDefn())
fe.SetField('geocode',gc)
for v,d in zip (varlist,l[1:]):
#print v,d
fe.SetField(v,str(d))
#Add the geometry
#print "cloning geometry"
clone = geom.Clone()
#print geom
#print "setting geometry"
fe.SetGeometry(clone)
#print "creating geom"
dl.CreateFeature(fe)
except: #Geocode not in polygon dictionary
pass
dl.SyncToDisk()
depuis que j'ai toutes les géométries sur un dictionnaire par géocodage (self.geomdict) je crée simplement les entités, définit les champs et clone les géométries à partir de la couche préexistante (code de chargement de cette couche omis pour plus de simplicité). Tout ce dont j'ai besoin maintenant est un moyen de générer le GeoJSON à partir de la combinaison de champs et de géométries, naturellement avec l'aide d'OGR pour obtenir le reste du fichier correctement (CRS, etc. à partir de la carte source)
Comment exporter la collection d'entités générée comme ci-dessus?
fe.ExportToJson()
renvoie une chaîne, vous devez donc terminer avecjson.loads(...)
. Sinon, c'est super utile!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:
la source
C'est le plus simple et le plus facile de Fiona. vous pouvez définir le SRS pour la sortie GeoJSON.
la source