out_ds = driver.Create('C:/yingxiang/output.tif', width=4096,height=4096, 1, gdal.GDT_Float32)这句话报错
时间: 2024-03-05 21:54:41 浏览: 21
这个错误信息可能是因为在创建输出数据集时,传递的参数个数不正确。根据你提供的代码,应该将 `width` 和 `height` 这两个参数放在前面,然后才是数据集的数量和数据类型,如下所示:
```
out_ds = driver.Create('C:/yingxiang/output.tif', width=4096, height=4096, bands=1, eType=gdal.GDT_Float32)
```
这应该可以正确创建输出数据集了。请注意,`bands` 和 `eType` 这两个参数需要指定名称,否则会引起语法错误。希望这可以帮助你解决问题。
相关问题
def extract_building_shadow(image, dsm, ground_spacing, radius): shadow_mask = np.zeros_like(image, dtype=np.bool) for i in range(0, image.shape[0], ground_spacing): for j in range(0, image.shape[1], ground_spacing): if not np.any(shadow_mask[i, j]): center = (i, j) ground_height = dsm[i, j] for x, y in spiral_search(center, radius, ground_spacing): if x < 0 or x >= image.shape[0] or y < 0 or y >= image.shape[1]: continue if np.any(shadow_mask[x, y:]): continue height = dsm[x, y] if height > ground_height: shadow_mask[x, y] = True elif height == ground_height: if np.linalg.norm(np.array([x, y]) - np.array(center)) < \ np.linalg.norm(np.array([i, j]) - np.array(center)): shadow_mask[x, y] = True cv2.imwrite(output_path, shadow_mask.astype(np.uint8) * 255) return shadow_mask image = cv2.imread('C:\yingxiang\DJI_20230322140516_0026_V.JPG') dsm_path = 'C:/sanwei/jianmo/Productions/Production_2/Production_2_DSM_part_2_2.tif' dsm_dataset = gdal.Open(dsm_path) output_path = 'C:\yingxiang\mask.png'这段代码为什么运行后不能将掩膜结果保存
这可能是由于在保存 PNG 文件之前,尝试在代码中访问 `output_path` 变量,而此时该变量尚未定义。您可以将 `output_path` 变量的定义移动到函数之前,以确保在访问变量之前它已经存在。例如:
```
output_path = 'C:\yingxiang\mask.png'
def extract_building_shadow(image, dsm, ground_spacing, radius):
shadow_mask = np.zeros_like(image, dtype=np.bool)
for i in range(0, image.shape[0], ground_spacing):
for j in range(0, image.shape[1], ground_spacing):
if not np.any(shadow_mask[i, j]):
center = (i, j)
ground_height = dsm[i, j]
for x, y in spiral_search(center, radius, ground_spacing):
if x < 0 or x >= image.shape[0] or y < 0 or y >= image.shape[1]:
continue
if np.any(shadow_mask[x, y:]):
continue
height = dsm[x, y]
if height > ground_height:
shadow_mask[x, y] = True
elif height == ground_height:
if np.linalg.norm(np.array([x, y]) - np.array(center)) < \
np.linalg.norm(np.array([i, j]) - np.array(center)):
shadow_mask[x, y] = True
cv2.imwrite(output_path, shadow_mask.astype(np.uint8) * 255)
return shadow_mask
image = cv2.imread('C:\yingxiang\DJI_20230322140516_0026_V.JPG')
dsm_path = 'C:/sanwei/jianmo/Productions/Production_2/Production_2_DSM_part_2_2.tif'
dsm_dataset = gdal.Open(dsm_path)
# 调用函数
extract_building_shadow(image, dsm_dataset.ReadAsArray(), 10, 10)
```
请注意,此代码还将 `dsm` 数据集转换为数组,并将其传递给函数。
def DSM_grid_sorting_masking_check(DSM,grid_size,threshold_angle): ''' 进行基于DSM格网排序的遮蔽检测方法 :param DSM: 输入的数字高程模型 :param grid_size: 格网大小 :param threshold_angle: 实现遮蔽的最大角度 :return: 遮蔽检测结果。True表示不遮蔽,False表示遮蔽 ''' width = DSM.RasterXSize height = DSM.RasterYSize #计算网格数量 grid_num_y =int(np.ceil(height/grid_size)) grid_num_x =int(np.ceil(width/grid_size)) #初始化遮蔽检测结果矩阵 result = np.ones((grid_num_y,grid_num_x),dtype=bool) #计算每个格网进行遮蔽检测 for i in range(grid_num_y): for j in range(grid_num_x): #当前格网内的点坐标 y_min = i*grid_size y_max = min((i+1)*grid_size,height) x_min = j * grid_size x_max = min((j+1)*grid_size,width) coords = np.argwhere(DSM.ReadAsArray(x_min, y_min, x_max - x_min, y_max - y_min) > 0) coords[:, 0] += y_min coords[:, 1] += x_min # 构建KD树 tree = cKDTree(coords) # 查询每个点的最邻近点 k = 2 dist, ind = tree.query(coords, k=k) # 计算每个点的法向量 normals = np.zeros(coords.shape) for l in range(coords.shape[0]): if k == 2: p1 = coords[l, :] p2 = coords[ind[l, 1], :] else: p1 = coords[l, :] p2 = coords[ind[l, 1], :] normals[l, :] = np.cross(p1 - p2, p1 - DSM.ReadAsArray(p1[1], p1[0], 1, 1)) # 计算每个点的可见性 visibilities = np.zeros(coords.shape[0]) for l in range(coords.shape[0]): if k == 2: p1 = coords[l, :] p2 = coords[ind[l, 1], :] else: p1 = coords[l, :] p2 = coords[ind[l, 1], :] angle = np.cross(np.dot(normals[l, :], (p2 - p1) / dist[l, 1])) * 180 / np.pi if angle <= threshold_angle: visibilities[l] = 1 # 判断当前格网是否遮蔽 if np.sum(visibilities) == 0: result[i, j] = False else: result[i, j] = True return result dsm_path = 'C:/yingxiang/output.tif' DSM = gdal.Open(dsm_path) result = DSM_grid_sorting_masking_check(DSM,grid_size=10,threshold_angle=10) print(result.shape)这段代码怎么改可以输出每个点是否被遮蔽
可以在函数中添加一个返回值,记录每个点是否被遮蔽。可以按照以下方式修改函数:
```python
def DSM_grid_sorting_masking_check(DSM,grid_size,threshold_angle):
''' 进行基于DSM格网排序的遮蔽检测方法
:param DSM: 输入的数字高程模型
:param grid_size: 格网大小
:param threshold_angle: 实现遮蔽的最大角度
:return: 遮蔽检测结果。True表示不遮蔽,False表示遮蔽,以及每个点是否被遮蔽的矩阵,True表示不遮蔽,False表示遮蔽
'''
width = DSM.RasterXSize
height = DSM.RasterYSize
#计算网格数量
grid_num_y =int(np.ceil(height/grid_size))
grid_num_x =int(np.ceil(width/grid_size))
#初始化遮蔽检测结果矩阵
result = np.ones((grid_num_y,grid_num_x),dtype=bool)
mask = np.zeros((height, width), dtype=bool)
#计算每个格网进行遮蔽检测
for i in range(grid_num_y):
for j in range(grid_num_x):
#当前格网内的点坐标
y_min = i*grid_size
y_max = min((i+1)*grid_size,height)
x_min = j * grid_size
x_max = min((j+1)*grid_size,width)
coords = np.argwhere(DSM.ReadAsArray(x_min, y_min, x_max - x_min, y_max - y_min) > 0)
coords[:, 0] += y_min
coords[:, 1] += x_min
# 构建KD树
tree = cKDTree(coords)
# 查询每个点的最邻近点
k = 2
dist, ind = tree.query(coords, k=k)
# 计算每个点的法向量
normals = np.zeros(coords.shape)
for l in range(coords.shape[0]):
if k == 2:
p1 = coords[l, :]
p2 = coords[ind[l, 1], :]
else:
p1 = coords[l, :]
p2 = coords[ind[l, 1], :]
normals[l, :] = np.cross(p1 - p2, p1 - DSM.ReadAsArray(p1[1], p1[0], 1, 1))
# 计算每个点的可见性
visibilities = np.zeros(coords.shape[0])
for l in range(coords.shape[0]):
if k == 2:
p1 = coords[l, :]
p2 = coords[ind[l, 1], :]
else:
p1 = coords[l, :]
p2 = coords[ind[l, 1], :]
angle = np.cross(np.dot(normals[l, :], (p2 - p1) / dist[l, 1])) * 180 / np.pi
if angle <= threshold_angle:
visibilities[l] = 1
# 判断当前格网是否遮蔽
if np.sum(visibilities) == 0:
result[i, j] = False
mask[y_min:y_max, x_min:x_max] = True
else:
result[i, j] = True
return result, mask
dsm_path = 'C:/yingxiang/output.tif'
DSM = gdal.Open(dsm_path)
result, mask = DSM_grid_sorting_masking_check(DSM,grid_size=10,threshold_angle=10)
print(result.shape)
```
使用该函数后,`mask` 矩阵的值即表示每个点是否被遮蔽,True 表示被遮蔽,False 表示没有被遮蔽。