Python 2.7 将字段添加到geojson并填充它-python
从中,我插入一个字符串格式的“内存中”geojson和一个gdal“内存中”光栅作为循环中的“分区统计”多边形的输入,然后我从分区统计()接收每个特征的int值。该值由FID存储在字典中 原始代码:Python 2.7 将字段添加到geojson并填充它-python,python-2.7,dictionary,geojson,ogr,Python 2.7,Dictionary,Geojson,Ogr,从中,我插入一个字符串格式的“内存中”geojson和一个gdal“内存中”光栅作为循环中的“分区统计”多边形的输入,然后我从分区统计()接收每个特征的int值。该值由FID存储在字典中 原始代码: def loop_zonal_stats(input_zone_polygon, input_value_raster): shp = ogr.Open(input_zone_polygon) lyr = shp.GetLayer() featList = range(ly
def loop_zonal_stats(input_zone_polygon, input_value_raster):
shp = ogr.Open(input_zone_polygon)
lyr = shp.GetLayer()
featList = range(lyr.GetFeatureCount())
statDict = {}
for FID in featList:
feat = lyr.GetFeature(FID)
maxValue = zonal_stats(feat, input_zone_polygon, input_value_raster)
statDict[FID] = int(maxValue)
return statDict
print statDict
{0: 5, 1: 5, 2: 5, 3: 5, ...}
目标是添加一个名为Densitykm2的字段,并使用直接从geojson“内存”中的zonal_stats()获取的值填充该字段。此更新的geojson将作为该方法的返回
下面是修改后的代码:
def loop_zonal_stats(input_zone_polygon, input_value_raster):
shp = ogr.Open(input_zone_polygon)
lyr = shp.GetLayer()
featList = range(lyr.GetFeatureCount())
maxFldDef = ogr.FieldDefn('Densitykm2', ogr.OFTInteger)
lyr.CreateField(maxFldDef)
for FID in featList:
feat = lyr.GetFeature(FID)
maxValue = zonal_stats(feat, input_zone_polygon, input_value_raster)
feat.SetField('Densitykm2', int(maxValue))
lyr.SetFeature(feat)
return input_zone_polygon
不管怎样,我试过了,但我收到了两种错误:
def loop_zonal_stats(input_zone_polygon, input_value_raster):
# Load Polygon
shp = ogr.Open(input_zone_polygon)
lyr = shp.GetLayer()
# Density field Definition
maxFldDef = ogr.FieldDefn('Densitykm2', ogr.OFTInteger)
# Create Temporary memory layer
outdriver = ogr.GetDriverByName('MEMORY')
source = outdriver.CreateDataSource('memData')
outdriver = outdriver.Open('MEM', 1)
# Copy of Polygon layer
source.CopyLayer(lyr, 'temp', ['OVERWRITE=YES'])
# Load temp Temporary memory layer
memlyr = source.GetLayer()
# Density Field creation
memlyr.CreateField(maxFldDef)
# List of ID to enumerate on
featList = range(lyr.GetFeatureCount())
print "Number of Wetlands in process = {0}".format(len(featList))
# input SpatialReference
inSpatialRef = osr.SpatialReference()
inSpatialRef.ImportFromEPSG(2959)
# input SpatialReference
outSpatialRef = osr.SpatialReference()
outSpatialRef.ImportFromEPSG(4326)
# create the CoordinateTransformation
coordTrans = osr.CoordinateTransformation(inSpatialRef, outSpatialRef)
# Empty list to be filled with Geojon Feature Objet = []
GeojonFeatObj = []
# Loop over features
for FID in featList:
FeatIn = lyr.GetFeature(FID)
# Get feature of Polygon
featOut = memlyr.GetFeature(FID)
# get ZonalStats
maxValue = zonal_stats(FeatIn, input_zone_polygon, input_value_raster)
# Add density to feature
featOut.SetField('Densitykm2', maxValue)
print "Wetlands features proceed FID = {0} / {1}".format(FID, len(featList))
# write the feature to the layer
memlyr.SetFeature(featOut)
# Get geometry
geom = featOut.GetGeometryRef()
# Transform geometry (UTM18N ---> WGS84)
geom.Transform(coordTrans)
# update feature geometry
featOut.SetGeometry(geom)
# Export the feature to a feature geojson
GeojonFeatObj.append(featOut.ExportToJson())
return GeojonFeatObj
请注意,您需要:
-为要素对象列表生成要素集合
-添加crs作为前缀
-清除组织字符串混乱
fc = geojson.FeatureCollection(tupple)
outputGeojson = geojson.dumps(fc)
#outputGeojson.replace(,'') }, {"geometry":
prefix = '{"crs": {"type": "link", "properties": {"href": "http://spatialreference.org/ref/epsg/4326/", "type": "proj4"}}, '
output = prefix+outputGeojson[1:]
output = output.replace('\\', '').replace('}"]', '}]').replace('["{', '[{').replace('", "{"geometry":', ', {"geometry":')
亚历克斯我只发现了一个错误。不支持更新geojson之类的字符串源!我必须加载geojson并将其复制到可以更新功能的格式中。模块OGR的类功能中的ExportToJson()将导出geojson功能对象。