我想将这个读取点shp位置像素值的函数修改为读取面shp范围的像素值
from osgeo import ogr
from osgeo import gdal
from osgeo.gdalconst import *
import os, sys, time
import numpy as np
from sklearn.svm import SVC
import pickle
# 获取样本点及其领域的值
def getPixels(shp, img):
driver = ogr.GetDriverByName('ESRI Shapefile')
ds = driver.Open(shp, 0)
layer = ds.GetLayer()
xValues = []
yValues = []
feature = layer.GetNextFeature()
while feature:
geometry = feature.GetGeometryRef()
x = geometry.GetX()
y = geometry.GetY()
xValues.append(x)
yValues.append(y)
feature = layer.GetNextFeature()
gdal.AllRegister()
ds = gdal.Open(img, gdal.GA_ReadOnly)
if ds is None:
print('Could not open image')
sys.exit(1)
rows = ds.RasterYSize
cols = ds.RasterXSize
bands = ds.RasterCount
transform = ds.GetGeoTransform()
xOrigin = transform[0]
yOrigin = transform[3]
pixelWidth = transform[1]
pixelHeight = transform[5]
values = []
for i in range(len(xValues)):
x = xValues[i]
y = yValues[i]
xOffset = int((x - xOrigin) / pixelWidth)
yOffset = int((y - yOrigin) / pixelHeight)
s = str(int(x)) + ' ' + str(int(y)) + ' ' + str(xOffset) + ' ' + str(yOffset) + ' '
pt = []
for j in range(bands):
band = ds.GetRasterBand(j + 1)
data = band.ReadAsArray(xOffset - 5, yOffset - 5, 10, 10)
value = data
value = value.flatten()
pt.append(value)
temp = []
pt = array_change(pt, temp)
values.append(pt)
temp2 = []
all_values = array_change(values, temp2)
all_values = np.asarray(all_values)
temp3 = []
result_values = array_change2(all_values, temp3)
result_values = np.asarray(result_values)
return result_values
if __name__ == '__main__':
img_p = 'G:/test/image/马尔康1.tif' # 大影像的位置
shp_path = 'G:/test/shp/' # 样本点位置,这个样本点文件夹是0.shp,1.shp...这样的矢量文件,对应每个类别,和预测结果的0,1...一一对应
temp_path = 'G:/test/temp/' # 临时文件存放路径
model_path = 'G:/test/model/model2017.pickle' # 模型路径
re_path = "G:/test/wangjiangxian_2017_s.tif" # 结果路径
time1 = time.time()
class_list = []
for shp in os.listdir(shp_path):
if shp[-4:] == '.shp':
shp_full_path = os.path.join(shp_path, shp)
class_type = getPixels(shp_full_path, img_p)
class_list.append(class_type)