Я хочу программно создать файл GeoJSON, используя полигоны из шейп-файла, но добавляя атрибуты из моего собственного приложения.
Это легко сделать для шейп-файла:
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()
так как у меня есть все геометрии в словаре по геокоду (self.geomdict), я просто создаю элементы, устанавливаю поля и клонирую геометрию из уже существующего слоя (загрузка кода для этого слоя опущена для простоты). Все, что мне сейчас нужно, это способ генерировать GeoJSON из комбинации полей и геометрий, естественно, с помощью OGR, чтобы правильно получить остальную часть файла (CRS и т. Д., Как на исходной карте)
Как экспортировать коллекцию объектов, созданную как указано выше?
fe.ExportToJson()
возвращает строку, поэтому вам нужно обернуть ееjson.loads(...)
. В противном случае это супер полезно!Если у вас есть среда разработки GDAL / OGR (заголовки, библиотеки), вы можете радикально упростить свой код с помощью Fiona . Чтобы прочитать объекты из шейп-файла, добавьте новые атрибуты и запишите их, так как GeoJSON - это всего лишь несколько строк:
источник
Это самый простой и легкий в Фионе. Вы можете установить SRS для вывода GeoJSON.
источник