Chcę programowo utworzyć plik GeoJSON przy użyciu wielokątów z pliku kształtu, ale dodając atrybuty z własnej aplikacji.
Można to łatwo zrobić dla pliku kształtu:
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()
ponieważ mam wszystkie geometrie w słowniku według geokodu (self.geomdict), po prostu tworzę obiekty, ustawiam pola i klonuję geometrie z wcześniej istniejącej warstwy (ładowanie kodu tę warstwę pominięto dla uproszczenia). Wszystko, czego teraz potrzebuję, to sposób na wygenerowanie GeoJSON z kombinacji pól i geometrii, oczywiście za pomocą OGR, aby uzyskać prawidłową resztę pliku (CRS itp. Z mapy źródłowej)
Jak eksportować wygenerowany zbiór funkcji jak wyżej?
fe.ExportToJson()
zwraca ciąg znaków, więc musisz się z tym skończyćjson.loads(...)
. W przeciwnym razie jest to bardzo pomocne!Jeśli masz środowisko programistyczne GDAL / OGR (nagłówki, biblioteki lib), możesz radykalnie uprościć swój kod, używając Fiony . Aby odczytać elementy z pliku kształtu, dodaj nowe atrybuty i wypisz je, ponieważ GeoJSON to tylko garść linii:
źródło
Jest to najprostszy i najłatwiejszy w Fiona. możesz ustawić SRS dla wyjścia GeoJSON.
źródło