河流概化技巧方法介绍
由于工作需要,博主大概在2020年的时候开始接触一些水模型(efdc、delft3D),令人头疼的就是概化河流耗时太久,于是,在经过三、四个工程的洗礼之后,逐渐摸索到一些河流概化的技巧和方法,可以提高效率,避开纯手绘,而且精度也比较高。下面逐步介绍一下。
注:本博客是建立在有一定水模型建模基础的前提下.
工具:python3、arcgis10.2、GlobalMapper、Delft3D。
这些工具可能安装起来比较麻烦,但是安装好之后,是一劳永逸的。
1. 安装python3
该步骤,在csdn有很多博客可以参考,博主仅根据浏览量推荐几篇,其实建议安装anaconda,在anaconda下建立python虚拟环境:
参考博客:https://blog.csdn.net/qq_59636442/article/details/123079968
参考博客:https://blog.csdn.net/Lottle123/article/details/125441622
安装完成,启动python方法(windows):【win】+【R】,输入cmd,进入终端,输入python,然后进入python环境,输入【exit()】,则退出。
在安装完python之后,需要安装一个gee的包。
参考博客:https://blog.csdn.net/qq_44023827/article/details/120572149(这篇博客,是使用的anaconda环境下的python环境)
要保证下面这三个包可以被调用。
import ee
import os
import geemap
2. 安装Arcgis10.2**版(你懂的)
当然,假如你有正版的,那更好,这个软件安装起来可能会比较麻烦,耐心一点。
下载及参考博客:https://blog.csdn.net/shanyanyi7173/article/details/124875816
3. 安装GlobalMapper**版(你懂的)
这个安装不麻烦,下面的版本是我之前一直用的,大家也可以用其他版本的。应该都没啥问题。不会安装的,自己百度一下。
软件:https://download.csdn.net/download/qq_38423499/86954545
4. 安装Delft3D
参考博客:https://zhuanlan.zhihu.com/p/442917790
###################分割线###################################
好。这里默认大家软件都准备好了!
5. python3代码运行
下面放代码(建议在jupyter下面运行):
参考博客:
import ee
import os
import geemap
# 设置vpn
# 这里要设置自己的VPN,所以需要梯子
os.environ['HTTP_PROXY'] = 'http://****.***.com.cn:80'
os.environ['HTTPS_PROXY'] = 'http://****.***.com.cn:80'
ee.Initialize()
# class 02_2 所有basemap的展示
# 初始化地图
Map = geemap.Map()
Map
这里会给出一个初始化的地图。
#part 02 在地图上加载影像数据
point = ee.Geometry.Point([118.7719, 31.8799])
# 指定位置的tif文件
image = (
ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.filterBounds(point)
.filterDate('2020-08-01', '2021-10-31')
.sort('CLOUD_COVER')
.first()
.select('B[1-7]')
)
vis_params = {'min': 0, 'max': 3000, 'bands': ['B5', 'B4', 'B3']}
#将某个点作为中心点进行缩放
Map.centerObject(point, 8)
Map.addLayer(image, vis_params, "Landsat-8")
#part 03 检查影像属性
props = geemap.image_props(image)
props.getInfo()
props.get('IMAGE_DATE').getInfo()
props.get('CLOUD_COVER').getInfo()
指定截取区域,目标河流所在的矩形块。
# part 04 训练数据集
# 下面有几种方法可以创建用于生成训练数据集的区域。
# 1、在地图上画一个形状(如矩形)
region = Map.user_roi
region = ee.Geometry.Rectangle([118.309746,31.25, 119.023791,31.60]) # 2、定义一个几何形状
# region = ee.Geometry.Point([118.7719, 37.8799]).buffer(10000) # 3、在中心点周围建立一个缓冲区
# 4、也可以直接在整个影像中选取训练数据随机点
scale_value = 15
training = image.sample(
**{
'region': region, # 上面选择的训练样本点选择的区域(范围)
'scale': scale_value,
'numPixels': 10000,
'seed': 0,
'geometries': True, # Set this to False to ignore geometries
}
)
Map.addLayer(training, {}, 'training', False)
Map
通过K-mean算法对地图中不同的地貌进行聚类,保证【水体】可以被聚到同一个类中。
# part 05 实例化聚类器并进行训练,利用K-mean聚类方法进行非监督分类
n_clusters = 7
clusterer = ee.Clusterer.wekaKMeans(n_clusters).train(training)
# part 06 影像分类
# 使用训练过的聚类对输入roi影像进行分类。
result = image.cluster(clusterer)
resultclip = result.clip(region)
# #使用随机颜色展示分类结果
Map.addLayer(resultclip.randomVisualizer(), {}, 'clusters')
Map
上图,中间的部分,就是处理后的结果。
# part 7 分类图例修改
legend_keys = ['Sediment water', 'Bare flat', 'S.salsa', 'water', 'land', 'Vegetation','buildings','high_land']
# legend_colors = [ '#FB8072','#8DD3C7', '#FFFFB3', '#BEBADA', '#80B1D3']
legend_colors = [ '#E3B672','#FFFFB3', '#FB8072', '#80B1D3','#8DD3C7']
# Reclassify the map
result = resultclip.remap([0, 1, 2, 3, 4, 5 ,6, 7], [1, 2, 3, 4, 5, 6, 7, 8])
Map.addLayer(
result, {'min': 1, 'max': 8, 'palette': legend_colors}, 'Labelled clusters'
)
# Map.add_legend(
# legend_keys=legend_keys, legend_colors=legend_colors, position='bottomright'
# )
Map
最后一步保存tif文件。
# # 透明度可视化结果
# print('Change layer opacity:')
# cluster_layer = Map.layers[-1]
# cluster_layer.interact(opacity=(0, 1, 0.1))
# 将非监督分类结果图导出
import os
out_dir = os.path.join(os.path.expanduser('~'), 'Downloads')
out_file = os.path.join(out_dir, 'maansahn2.tif')
geemap.ee_export_image(result, filename=out_file, scale=25)
我这里得到的图片是这样子的。用arcgis打开,是这个效果。
到这里tif文件得到了,下面就该使用Arcgis处理了。
5. Arcgis调整tif文件
将tif文件代入Arcgis ,其实,从这里已经可以看出,这个tif文件被算法聚类成:2、3、4、5、6、7这六种类别。其中有一个是【水体】。
右键 -【属性】
在【符号系统】里面,点击【唯一值】,生成属性表。然后在点击【已分类】。生成一个属性表,【应用】-【确定】。
点击【工具箱】找见【栅格转面】,生成shp文件,过程可能比较慢。
在【转换工具】里面找见【栅格转面】
新生成的shp文件会被加载进来
右键【打开属性表】,点击【编辑器】,开始编辑,删除不属于河流的部分。
详细说明:结合生成的shp文件的分级色彩图,比如上图,2, 2-4, 4-5 ,5-7分别代表不同的地貌,其中有一个代表【水体】,这个值 可以对应到【属性表】中的GRIDCODE变量上。
这个可以多选,点击开始行(左边), 按住ctrl+shirft,再点击结尾【结尾行】,右键,删除即可,这个过程可能比较卡。最终,手动筛选。得出最终河流。右键-【导出数据】,生成shp。
注:文档修改过几次,所以图的内容和上面的没对上,流程是没有问题的。
这上面还有很多碎的小块。要处理调。点击鼠标,拖住,画矩形,然后就被选中了,然后就可以删除了。
在删除完噪声块之后,可根据需求,对shp文件进行编辑(比如:只想保留河流的边,则对shp编辑,删除多余结点,这个随后补充,或者自己百度如何删除结点)
至此,预处理就完成。
5. GlobalMapper转换文件
打开GlobalMapper,代入shp,如图。
定义空间坐标系。【tools】-【configue】-【projection】,定义好之后,点击ok
【file】-【export】-【export-vector/lidar-format】,选择delft3d|ldb,然后输出。这时就生成*.ldb文件了。
6. Delft3D处理ldb
带入附属文件ldb,按照下面截图操作,生成可编辑的文件。
!!!一般情况下,ldb是闭合的线,但是在制作河流的时候,需要四条线围成矩形。因此,需要打开ldb文件,手动编辑成2条线(河网不行,没法切分)。然后重新带入。Ldb的数据结构比较简单,不做赘述。当然,假如前面已经编辑成河流边界线了,那么这里就不做多余的处理了。
处理效果
做到这里,我想大家应该就知道怎么做了吧?