基于宁波DEM高程和宁波人口栅格数据利用八邻域种子蔓延洪水淹没算法的python代码如何计算宁波各区县淹没面积和受灾人口
时间: 2024-03-28 21:40:45 浏览: 70
SpeedSpread.zip_淹没算法_淹没面积_种子蔓延_种子蔓延 淹没_种子蔓延算法
5星 · 资源好评率100%
以下是基于宁波DEM高程和宁波人口栅格数据利用八邻域种子蔓延洪水淹没算法的Python代码,可以计算宁波各区县淹没面积和受灾人口:
```python
import arcpy
import numpy as np
# 定义函数,实现八邻域种子蔓延洪水淹没算法
def floodFillDEM(dem, waterLevel, seedX, seedY):
# 将种子点加入队列
q = [(seedX, seedY)]
# 生成与DEM相同大小的二维数组,用于记录每个像元是否已经被遍历过
visited = np.zeros(dem.shape, dtype=bool)
# 将种子点标记为已遍历
visited[seedY, seedX] = True
# 循环处理队列中的每个像元
while len(q) > 0:
# 取出队首像元的位置
x, y = q.pop(0)
# 遍历该像元周围的八个像元
for dx in range(-1, 2):
for dy in range(-1, 2):
# 排除超出DEM范围的像元和已经遍历过的像元
if x+dx >= 0 and x+dx < dem.shape[1] and y+dy >= 0 and y+dy < dem.shape[0] and not visited[y+dy, x+dx]:
# 如果该像元高度低于水位,则淹没该像元
if dem[y+dy, x+dx] < waterLevel:
dem[y+dy, x+dx] = waterLevel
# 将该像元标记为已遍历,并加入队列
visited[y+dy, x+dx] = True
q.append((x+dx, y+dy))
# 设置工作空间
arcpy.env.workspace = r"C:\data\ningbo.gdb"
# 读取DEM数据和人口栅格数据
dem = arcpy.RasterToNumPyArray("dem")
pop = arcpy.RasterToNumPyArray("pop")
# 定义水位高度
waterLevel = 5
# 计算淹没DEM
floodFillDEM(dem, waterLevel, 500, 500)
# 将淹没DEM转换为栅格数据
floodDEM = arcpy.NumPyArrayToRaster(dem, arcpy.Point(arcpy.env.extent.XMin, arcpy.env.extent.YMin), arcpy.env.cellSize)
floodDEM.save("floodDEM")
# 计算各区县淹没面积和受灾人口
for feature in arcpy.ListFeatureClasses():
# 创建新的栅格数据,用于记录该区县的受灾像元数量
popAffected = np.zeros(pop.shape, dtype=int)
# 生成该区县的栅格数据
arcpy.FeatureToRaster_conversion(feature, "OBJECTID", "tmp", arcpy.env.cellSize)
mask = arcpy.RasterToNumPyArray("tmp")
# 遍历淹没DEM和人口栅格数据的每个像元
for y in range(pop.shape[0]):
for x in range(pop.shape[1]):
# 如果该像元在该区县内,并且淹没了,则将该像元的受灾人口数量加入popAffected数组
if mask[y, x] != arcpy.Raster(mask).noDataValue and dem[y, x] >= waterLevel:
popAffected[y, x] = int(pop[y, x])
# 计算该区县的淹没面积和受灾人口
area = (popAffected > 0).sum() * arcpy.env.cellSize ** 2
population = popAffected.sum()
# 打印结果
print(feature, "淹没面积:", area, "平方米,受灾人口:", population, "人")
```
在上述代码中,我们首先定义了一个名为`floodFillDEM`的函数,该函数实现了八邻域种子蔓延洪水淹没算法。然后我们读取了宁波的DEM数据和人口栅格数据,并指定了水位高度。接下来,我们调用了`floodFillDEM`函数,将DEM进行淹没。然后,我们将淹没后的DEM数据转换为栅格数据,并保存到了文件中。最后,我们遍历了各个区县的图层,计算了每个区县的淹没面积和受灾人口,并输出了结果。
阅读全文