Ich möchte programmgesteuert eine GeoJSON-Datei mit Polygonen aus einem Shapefile erstellen, aber Attribute aus meiner eigenen Anwendung hinzufügen.
Dies ist für ein Shapefile einfach durchzuführen:
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()
da ich alle geometrien in einem wörterbuch per geocode habe (self.geomdict), erstelle ich einfach die merkmale, setze die felder und klone die geometrien von einer bereits vorhandenen ebene (code, der diese ebene lädt, der einfachheit halber weggelassen). Alles, was ich jetzt brauche, ist eine Möglichkeit, das GeoJSON aus der Kombination von Feldern und Geometrien zu generieren, natürlich mit Hilfe von OGR, um den Rest der Datei richtig zu machen (CRS usw. aus der Quellkarte).
Wie exportiere ich die Feature-Sammlung, die wie oben generiert wurde?
fe.ExportToJson()
ein String zurückgegeben, mit dem Sie sich einschließen müssenjson.loads(...)
. Ansonsten ist das super hilfreich!Wenn Sie eine GDAL / OGR-Entwicklungsumgebung (Header, Bibliotheken) haben, können Sie Ihren Code mithilfe von Fiona radikal vereinfachen . Um Features aus einem Shapefile zu lesen, fügen Sie neue Attribute hinzu und schreiben Sie sie aus, da GeoJSON nur eine Handvoll Zeilen enthält:
quelle
Dies ist die einfachste und einfachste in Fiona. Sie können das SRS für die Ausgabe von GeoJSON festlegen.
quelle