Python 2.7 将字段添加到geojson并填充它-python

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

从中,我插入一个字符串格式的“内存中”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(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
不管怎样,我试过了,但我收到了两种错误:

  • 错误6:不支持从内联定义更新
  • 列表错误1:无效索引:-1
  • 也许还有另一种可能,将“内存中”geojson与返回的原始代码字典合并,以添加字段并填充它。也许是geojson库

    --更新--

    下面是一个解决方案,我的代码是:

    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功能对象。