分区统计(python)

概要

本文主要利用了majority这个字段,来区别栅格与矢量ploygon_feature之间的关系。简单来说,当ploygon_feature内对应的栅格区域,栅格的某个值X超过了百分之五十,那么majory这个字段对应的值就为X。
在这里插入图片描述

代码

import time
import geopandas as pd
import rasterio
from rasterio.plot import show
from rasterstats import zonal_stats
from osgeo import gdal, ogr

start = time.time()
ras_path = 'cq_test.tif'
shp_path = 'cq_test.shp'
# stats_list = ['min', 'max', 'mean', 'median', 'majority']
stats_list = ['majority']

ras_driver = rasterio.open(ras_path)
array = ras_driver.read(1)
affine = ras_driver.transform
shp_driver = pd.read_file(shp_path)
zs = zonal_stats(shp_path, array, affine=affine, stats = stats_list)

driver = ogr.GetDriverByName('ESRI Shapefile')
layer_source = driver.Open(shp_path,1)
lyr = layer_source.GetLayer()
defn = lyr.GetLayerDefn()

featureCount = defn.GetFieldCount()
exists_fields = []
for i in range(featureCount):
	field = defn.GetFieldDefn(i)
	field_name = field.GetNameRef()
	exists_fields.append(field_name)

for ele in stats_list:
	if ele in exists_fields:
		pass
	else:
		# cls_name = ogr.FieldDefn(k, ogr.OFTString)
		cls_name = ogr.FieldDefn(ele, ogr.OFTReal)
		# cls_name.SetWidth(64)
		lyr.CreateField(cls_name)

driver = None

driver = ogr.GetDriverByName('ESRI Shapefile')
layer_source = driver.Open(shp_path,1)
lyr = layer_source.GetLayer()
defn = lyr.GetLayerDefn()

featureCount = defn.GetFieldCount()

count = 0
feature = lyr.GetNextFeature()
while feature is not None:
	for i in range(featureCount):
		field = defn.GetFieldDefn(i)
		field_name = field.GetNameRef()
		if field_name in stats_list:
			feature.SetField(field_name, zs[count][field_name])
			lyr.SetFeature(feature)
		else:
			pass
	count+=1
	feature = lyr.GetNextFeature()

end = time.time()
print((end-start)/3600.0)

猜你喜欢

转载自blog.csdn.net/weixin_42990464/article/details/114652193