1.简介:

数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数据实现对地面地形的数字化模拟。



这次分享的数据是全国34个省份的DEM裁剪数据,一共有6期数据。



分享的数据效果如上图所示。

2.背景介绍

首先,自己的百度云盘堆满了各种DEM数据,但都是单景,每一次使用都需要进行按区域裁剪、镶嵌。做得多也就烦了。

正好,前段时间研究了一下GDAL与Geopandas结合到一起,进行栅格的批量裁剪与转换。我就一次性地把DEM都裁剪到了省。



人数多了,就想要更多人数。

因此我写了这篇推文,阐述批量裁剪DEM的流程,以及分享各省的裁剪DEM资源。

3.数据制作

3.1 流程图

总体思路是:DEM数据转换、按省份裁剪DEM、切片镶嵌,结果数据后处理。

3.1数据准备工作

首先是下载数据,数据量加在一起是60G大小。



待下载好之后,检查数据,统一所有数据格式为TIFF。例如NASA_30mDEM数据为1300张hgt格式的影像,需全部转为tiff文件,

这步使用arcgis的栅格批量转换功能。

3.2 DEM按省份裁剪

3.2.1 脚本进行裁剪

使用python的RasterIO模块进行单景的DEM读取,使用Geooandas模块操作省份矢量裁剪。考虑到这条推文的阅读性,所有脚本代码我会在github上公开(https://github.com/KUAIDUOBAO),这里暂时只放重要的裁剪脚本:

#裁剪函数
def clip(pathDir,shpdata,rasterfile):
for i in tqdm(range(len(pathDir))):
# 读入栅格文件
rasterfile = files_path+"\\"+pathDir[i]
rasterdata = rio.open(rasterfile)
#获取栅格信息
profile = rasterdata.profile
#标识符
note = pathDir[i]
# 投影变换,使矢量数据与栅格数据投影参数一致
shpdata = shpdata.to_crs(rasterdata.crs)
# 按照所有矢量进行循环裁剪
for j in range(0, len(shpdata)):
try:
# 获取矢量数据的features
geo = shpdata.geometry[j]
#获取该要素的属性信息
data_shp_name=shpdata.全称[j]
#文件保存位置的文件夹 各省
data_filepath=str(data_shp_name)
feature = [geo.__geo_interface__]
# 通过feature裁剪栅格影像
out_image, out_transform = rio.mask.mask(rasterdata, feature, all_touched=True, crop=True, nodata=0)
profile.update(
height=out_image.shape[1],
width=out_image.shape[2],
shape=(out_image.shape[1],out_image.shape[2]),
nodata=0,
bounds=[],
transform=out_transform,
)
# 定义要创建的目录
mkpath = "目录名"
# 检测目录是否存在
mkdir(mkpath)
# 文件名字
name="文件名"
with rasterio.open(name, mode='w', **profile) as dst:
dst.write(out_image)
except:
pass

使用上述脚本,可以得到省级行政图裁剪每一张影像后的裁剪结果。



这些影像都是按照省级轮廓裁剪后的结果,单张只能覆盖一部分区域,因此需要对所有子集影像进行镶嵌。

3.2 DEM按省份镶嵌

需要遍历34个省份的文件夹,镶嵌使用gdal库的Warp函数。

3.3 数据后处理

主要是使用python脚本,对每一个省份文件夹中的结果影像进行重命名,并删除多余的切片文件。这一步需要添加一个判定函数,判定是否为镶嵌文件,

是则保留,不是则删除。

3.3 数据处理总结

除了上述处理过程,中间也写了数个辅助脚本,用以批量归类DEM文件、多线程处理、批量删除与重命名、匹配文件等。这部分脚本我会上传到github中,不再多做介绍。

当然,进行DEM分省裁剪最大的困难从不是算法问题,而是巨大的数据量,单类全国30m的DEM数据解压后差不多40G。长时间的跑数据,我的笔记本电脑cpu真的可以烤肉了(跑数据过程中,温度长期稳定在80度)。

总得来说,工作量很大,下班后都没时间碰"云顶之弈"这个游戏了。

4.结果展示

裁剪得到了34个省份的DEM,各有6张影像,三种30米分辨率、一种90米分辨率、一种250米分辨率以及一种1000米分辨率。总共166G文件,已经上传到百度云。





5.总结

5.1数据总结

使用gdal、geopandas可以很方面地使用矢量裁剪栅格。

而针对全国的DEM数据裁剪,算法不是问题,唯一的问题是数据量很大,需要足够的算力。

5.2下一步的计划

考虑到我的台式电脑即将组装完毕,而它的优点就是散热能力更强。因此,在工作的闲暇之余,接下来会做:

1.使用更高精度的12.5米分辨率的ALOS PALSAR数据和15米分辨率的SRTM-X-DLR,进行一个行政区划的裁剪;

2.从34个省份的DEM裁剪,扩展到全国400个地级市、2700多个县,并进行归类。

6.数据分享

“锐多宝的地理空间”gongzonghao,回复“DEM”,获取数据下载方式。

DEM数据全国各省的裁剪与分享(30m、90m、250m、1000m)的更多相关文章

  1. Python:爬取全国各省疫情数据并在地图显示

    代码: import requests import pymysql import json from pyecharts import options as opts from pyecharts. ...

  2. arcgis如何制作DEM数据

    DEM描述的是地面高程信息,它在测绘.水文.气象.地貌.地质.土壤.工程建设.通讯.军事等国民经济和国防建设以及人文和自然科学领域有着广泛的应用.如在工程建设上,可用于如土方量计算.通视分析等:在防洪 ...

  3. DEM数据如何生成高程点

    这次给大家介绍一个arcgis里的实用功能:通过地形数据提取高程点. 首先做好准备工作: 1.地形数据下载获取 2.软件准备 locaspace viewer:http://rj.baidu.com/ ...

  4. DEM数据及其他数据下载

    GLCF大家都知道吧?http://glcf.umiacs.umd.edu/data/ +++++++++++++++去年12月份听遥感所一老师说TM08初将上网8万景,可是最近一直都没看到相关的网页 ...

  5. geoServer 发布geoTiff格式的DEM数据

    1/数据下载(首先感谢earthexplorer提供了免费的全球DEM数据) 下载地址  https://lta.cr.usgs.gov/GTOPO30  ,首先要注册才可以下载,登陆网站后点击get ...

  6. 聚合数据全国天气预报api接口

    查询天气预报在APP中常用的一个常用功能,聚合数据全国天气预报api接口可以根据根据城市名/id查询天气.根据IP查询天气.据GPS坐标查询天气.查询城市天气三小时预报,并且支持全国不同城市天气预报查 ...

  7. Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9941208.html 主讲人:大石头 时间:2018-11-10 晚上20:00 地点:钉钉群(组织代码 ...

  8. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  9. 全球DEM数据资源下载

    想找有海底地形的全球DEM数据作为三维地球展示用,发现很多都是只有陆地DEM而不带海底的,而且还需要通过Web页面进行选择然后数据下载. 找到一个学校的Ftp可以直接下载数据集,特别是这篇文章几乎汇集 ...

随机推荐

  1. Python包安装过程

    以下是paramiko-1.7.7.1的安装过程,可以看到整个过程分为步,第一步是build,就是拷贝源文件到build文件夹里, F:\VMFiles\tmpFiles\paramiko-1.7.7 ...

  2. spring学习07(整合MyBatis)

    10.整合MyBatis 10.1 相关jar包 junit <dependency> <groupId>junit</groupId> <artifactI ...

  3. SSH以及ROS远程登录设置保姆级教程

    本文用来实现在同一局域网内的两台计算机之间的相互通信,实现一台计算机登录到另一台计算机,本文基于SSH来实现. 1.SSH简介 Secure Shell(SSH)是由 IETF(The Interne ...

  4. 微信小程序 简易搜索功能实现

    先看效果图 挺简单的一个实现方法,导入外部js数据,将数据通过radio-group展示出来,根据数据里的status属性判断显不显示该项. 在搜索框内实时读取输入的数据,去除空格后将数据跟js里的n ...

  5. RocketMQ可视化控制台

    中午文档 https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_C ...

  6. 微信小程序 errMsg: "navigateTo:fail webview count limit exceed"

    返回过多 用wx.redirectTo或者wx.reLaunch 解决

  7. 轻松让你的nginx服务器支持HTTP2协议

    目录 简介 HTTP1.1和HTTP2 安装最新的nginx 开启HTTP2支持 添加SSL支持 修改加密算法 Diffie–Hellman对消息进行加密 重定向所有的HTTP请求到HTTPS 启动n ...

  8. WPF 获取主线程

    WPF线程获取UI线程   WPF中只能是UI线程才可以改变UI控件相关,当采用多线程工作时,可用以下代码获取 UI线程进行操作: App.Current.Dispatcher.Invoke((Act ...

  9. Inject-APC (Ring3)

    1 // APCInject.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include "APCInjec ...

  10. git rebase和git merge的区别

    前言:    平时工作中发现一般同事在同步远程代码的时候都是用git pull,其实git pull包含有两个操作,一个是fetch远程的代码,一个是将本地当前的代码和远程代码进行merge,即git ...