C#+arcengine实现输出水深图的功能(通过淹没区域和dem高程数据)(包含栅格计算器(减)、feature to line、产生随机点、获得高程、extract values to poin)

因为项目需要,这几天研究了一下输出水深图的功能,如题,给出一副shp文件(面状)和一副dem数据,有两个思路,如下:

(注:本博文只是给出思路,相应的功能请参照我的其他博文,都有贴出来)欢迎各位高手指导!

思路一:

1、输入shp文件(面状),利用 feature to line GP工具把面转化为线,提取出边界


2、利用extract by maskGP工具实现提取掩膜,把高程等信息提取到边界上


3、获得边界的点集合


3、获得点集合的Z值(输入参数分别为点集合,extract by mask输出的栅格)(会和高程值有1-5不等之间的差距)


4、得到高程的众数


5、裁剪dem数据


6、栅格计算器,裁剪影像--高程众数


思路二:


1、输入shp文件(面状),利用 feature to line GP工具把面转化为线,提取出边界


2、产生随机点,约束条件为上一步输出的线shp


3、利用extract values to pointsGP工具把dem高程信息提取到上一步的随机点(此步我的测试数据只有五个点,所以用来产生更多的点,你可以考虑不用)


4、利用获得栅格属性表的方法获得属性表中的RASTERVALU字段的数值(即为高程,只要用extract values to points工具提取的都有RASTERVALU字段,且为高程)


5、获得高程众数


6、裁剪dem数据


7、栅格计算器,裁剪影像--高程众数

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于宁波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数据转换为栅格数据,并保存到了文件中。最后,我们遍历了各个区县的层,计算了每个区县的淹没面积和受灾人口,并输出了结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值