Saya ingin membuat file GeoJSON secara terprogram menggunakan poligon dari shapefile tetapi menambahkan atribut dari aplikasi saya sendiri.
Ini mudah dilakukan untuk shapefile:
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()
karena saya memiliki semua geometri pada kamus dengan geocode (self.geomdict) Saya cukup membuat fitur, mengatur bidang dan mengkloning geometri dari lapisan yang sudah ada sebelumnya (memuat kode yang lapisannya dihilangkan untuk kesederhanaan). Yang saya butuhkan sekarang adalah cara untuk menghasilkan GeoJSON dari kombinasi bidang dan geometri, secara alami dengan bantuan OGR untuk mendapatkan sisa file yang benar (CRS, dll. Seperti dari peta sumber)
Bagaimana cara mengekspor koleksi fitur yang dihasilkan seperti di atas?
fe.ExportToJson()
mengembalikan sebuah string, jadi Anda harus membungkusnya denganjson.loads(...)
. Kalau tidak, ini sangat membantu!Jika Anda memiliki lingkungan dev GDAL / OGR (header, libs), Anda dapat secara radikal menyederhanakan kode Anda dengan menggunakan Fiona . Untuk membaca fitur dari sebuah shapefile, menambahkan atribut baru, dan menuliskannya karena GeoJSON hanyalah beberapa baris:
sumber
Ini adalah yang paling sederhana dan termudah di Fiona. Anda dapat mengatur SRS untuk keluaran GeoJSON.
sumber