基于python实现利用DEM数据计算坡度、坡向
基本概念
DEM数据
DataMark:CNSDTF-DEM
Version:1.0
Unit:M
Alpha:0.000000
Compress:0.000000
X0:258000.000
Y0:324000.000
DX:22.500
DY:22.500
Row:321
Col:481
ValueType:Integer
Hzoom:1000192743 191068 187814 181388 173357 165286 157185 152266 147335 142391 139052 137327 135608 130633 124014 117372 118908 123706 128495 133265 138026 139540 139440 139337 135994 131025 127669 124312 120947 119208 125633 135280 141643 149598 155913 160612 162106 163600 160300 160203 158500 156795 155094 151780 148466 143534 138590 133632 130287 126935 125208 126733 133122 136259 137773 139280 142407 143916 142199 142101
坡度
坡度是法线与铅垂线之间的夹角。如图2.2所示,利用坡度计算公式 α = a r c t a n f x 2 + f y 2 \alpha=arctan \sqrt{f_x^2+f_y^2} α=arctanfx2+fy2 ,进行求解。
坡向
坡向是法线在水平面上的投影与正北方向之间的夹角(顺时针度量)。如图2.3所示,利用坡向计算公式 A = arctan f y f x A = \arctan \frac{{f_y }}{{f_x }} A=arctanfxfy , 求解。
程序流程
2)计算各点梯度
如图3.5所示,可以利用像下面的公式写一个函数进行计算, s l o p e x = e 1 − e 3 2 × d s i z e x s l o p e y = e 4 − e 2 2 × d s i z e y slope_x = \frac{{e_1 - e_3 }}{{2 \times dsizex}}\;\;\;\;slope_y = \frac{{e_4 - e_2 }}{{2 \times dsizey}} slopex=2×dsizexe1−e3slopey=2×dsizeye4−e2
。首先计算3*3DEM格网数据的X,Y方向的变化。对于整幅图而言,由于本图像元点不是特别多,故对于边缘的点处理时,可以在栅格点外再加一圈栅格便于求梯度。而添加点的方式只需要把原本边缘的栅格点的高程值复制一遍即可,如图3.6所示。
3)解算坡度、坡向
如图3.5所示,可以利用下面的公式计算求得坡度和坡向 s l o p = arctan s l o p e x 2 + s l o p e y 2 A = arctan s l o p e y s l o p e x slop = \arctan \sqrt {slope_x^2 + slope_y^2 } \;\;\;A = \arctan \frac{{slope_y }}{{slope_x }} slop=arctanslopex2+slopey2 A=arctanslopexslopey。在这一过程中可以整体进行计算,从而较为方便地获得坡度和坡向的二维矩阵。
4)可视化
利用python中的绘图库matplotlib,编写了一个可视化函数,利用plot里面的imshow,将之前计算得到的二维矩阵存进去,最后以栅格的方式显示。对于三维DEM显示,利用Axes3D的方法,利用DEM文件中的起始坐标和分辨率推算出各个栅格的坐标,对应出高程值,绘制出三维图形。
程序代码
DEMclass模块
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cbook
from matplotlib import cm
from matplotlib.colors import LightSource
import matplotlib.pyplot as plt
import numpy as np
import re
import math
#####读取文件并处理成numpy并返回
def readfile():with open('datas.DEM', 'r', encoding='utf-8')as file:datas = file.readlines()[13:]list1 = []strs = ""row = 321col = 481npdata = np.zeros((row, col), dtype=np.int16)for data in datas:data = data.strip()if len(data) > 20:strs = strs + " " + dataif len(data) < 20:strs = strs + " " + datalist1.append(strs)strs = ""for i, sitem in enumerate(list1):item = str(sitem).strip()# item=item.split(" ")item = re.findall(r'\d+', item)for j, one in enumerate(item): # i是序号,one是数值npdata[i][j] = int(one)return npdata
#####在原栅格图像周围加一圈并返回
def AddRound(npgrid):ny, nx = npgrid.shape # ny:行数,nx:列数zbc=np.zeros((ny+2,nx+2))zbc[1:-1,1:-1]=npgrid#四边zbc[0,1:-1]=npgrid[0,:]zbc[-1,1:-1]=npgrid[-1,:]zbc[1:-1,0]=npgrid[:,0]zbc[1:-1,-1]=npgrid[:,-1]#角点zbc[0,0]=npgrid[0,0]zbc[0,-1]=npgrid[0,-1]zbc[-1,0]=npgrid[-1,0]zbc[-1,-1]=npgrid[-1,0]return zbc
#####计算xy方向的梯度
def Cacdxdy(npgrid,sizex,sizey):zbc=AddRound(npgrid)dx=((zbc[1:-1,:-2])-(zbc[1:-1,2:]))/sizex/2/1000dy=((zbc[2:,1:-1])-(zbc[:-2,1:-1]))/sizey/2/1000dx=dx[1:-1,1:-1]dy=dy[1:-1,1:-1]np.savetxt("dxdy.csv",dx,delimiter=",")return dx,dy
####计算坡度\坡向
def CacSlopAsp(dx,dy):slope=(np.arctan(np.sqrt(dx*dx+dy*dy)))*57.29578 #转换成°slope=slope[1:-1,1:-1]#坡向a=np.zeros([dx.shape[0],dx.shape[1]]).astype(np.float32)for i in range(dx.shape[0]):for j in range(dx.shape[1]):x=float(dx[i,j])y=float(dy[i,j])if (x==0.)& (y==0.):a[i,j]=-1elif x==0.:if y>0.:a[i,j]=0.else:a[i,j]=180.elif y==0.:if x>0:a[i,j]=90.else:a[i,j]=270.else:a[i,j]=float(math.atan(y/x))*57.29578if a[i,j]<0.:a[i,j]=90.-a[i,j]elif a[i,j]>90.:a[i,j]=450.-a[i,j]else:a[i,j]=90.-a[i,j]return slope,a
####绘制平面栅格图
def Drawgrid(judge,pre=[],A=[],strs=""):if judge==0:if strs == "":plt.imshow(A, interpolation='nearest', cmap=plt.cm.hot, origin='lower') # cmap='bone' cmap=plt.cm.hotplt.colorbar(shrink=0.8)plt.xticks(())plt.yticks(())plt.show()else:plt.imshow(A, interpolation='nearest', cmap=strs, origin='lower') # cmap='bone' cmap=plt.cm.hotplt.colorbar(shrink=0.8)xt=range(258000, 268822,22)yt=range(324000, 331222,22)plt.xticks(())plt.yticks(())plt.show()elif judge==1:fig = plt.figure()ax = Axes3D(fig)# X = np.arange(1,482,1)# Y = np.arange(1,322,1)X = np.arange(258000.000, 268822.500, 22.5)Y = np.arange(324000.000, 331222.500, 22.5)X, Y = np.meshgrid(X, Y)Z = preax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow')) # cmap=plt.get_cmap('rainbow')ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.cm.hot)ax.set_zlim(0, 200000)plt.show()
主函数
import DEMclass as dem
from DEMclass import Drawgrid
import numpy as np
####程序入口
if __name__=='__main__':npgrid=dem.readfile()pre=npgridnpgrid=dem.AddRound(npgrid)dx,dy=dem.Cacdxdy(npgrid,22.5,22.5)slope,arf=dem.CacSlopAsp(dx,dy)dem.np.savetxt("slope.csv",slope,delimiter=",")#绘制三维DEMDrawgrid(judge=1,pre=pre)#绘制二维DEMDrawgrid(judge=0,A=pre,strs="bone")#绘制坡度图Drawgrid(judge=0,A=slope,strs="rainbow")#绘制坡向图Drawgrid(judge=0,A=arf)
效果图
三维图:
二维DEM:
坡度图:
坡向图:
参考资料
1.Python的地形三维可视化——简介Matplotlib和gdal
https://blog.csdn.net/allenlu2008/article/details/51880333
2.Pycharm中配置GDAL库的一种方法
https://blog.csdn.net/qq_35960361/article/details/96438650
3.python 调用gdal 处理dem数据
https://blog.csdn.net/qq_15642411/article/details/79123677
4.适用于Python扩展程序包的非官方Windows二进制文件——GDAL
https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal
5.python gdal安装与简单使用
https://blog.csdn.net/nima1994/article/details/79207805/
pip install GDAL-2.4.1-cp37-cp37m-win_amd64.whl
6.(目测有用)【GDAL】python读取DEM计算坡度与坡向
https://blog.csdn.net/qq_37935516/article/details/85028979
7.arcgis计算坡度、坡向
http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#//009z000000vz000000
8.C语言实现GDAL使用DEM数据计算坡度坡向
https://blog.csdn.net/liminlu0314/article/details/8498985
9.gdal在python功能(官方)
https://gdal.org/python/index.html
10.玩转python的正则表达式|提取字符串中的所有数字
https://blog.csdn.net/guanyonglai/article/details/89512659
https://blog.csdn.net/u011436427/article/details/82628597
可视化
1.三维图(目测有用)
https://blog.51cto.com/9291927/2435621
2.地图+热力图(可以用于坡度坡向)
https://www.zhihu.com/question/33783546
3.统计
https://www.cnblogs.com/dudududu/p/9149762.html
4.turtle库
https://blog.csdn.net/weixin_44078196/article/details/10065651
基于python实现利用DEM数据计算坡度、坡向相关推荐
- python计算坡度_基于python实现利用DEM数据计算坡度、坡向
1.Python的地形三维可视化--简介Matplotlib和gdal https://blog.csdn.net/allenlu2008/article/details/51880333 2.Pyc ...
- GDAL使用DEM数据计算坡度坡向
零. 前言 之前写过一个3×3的通用模板算子函数的博客<基于GDAL的一个通用的3×3模板函数>,网址:http://blog.csdn.net/liminlu0314/ar ...
- GDAL使用DEM数据计算地形指数
零. 前言 本文是接上文<GDAL使用DEM数据计算坡度坡向>,还是一篇关于DEM计算地形指数的一篇文章.这里所要计算的地形指数主要包括以下三个指数:地形耐用指数(Terra ...
- GDAL使用DEM数据计算山体阴影(Hillshade)
零. 前言 说起Hillshade,其实就是模拟太阳光照射地形所引起的明暗对比,然后来对地形图进行渲染,使之看起来具有立体效果的一种方式,常用于地图的渲染,如表1所示,具体的可以参考文献 ...
- ArcGIS中利用DEM数据生成地形图既视感的等高线;利用掩膜进行等高线注记;DEM的可视化表达总结
文章目录 前言 一.效果图展示 二.地形(DEM)可视化表达 1.一维可视化 2.二维可视化 3.三维可视化 二.ArcGIS中利用DEM数据制作等高线 1.DEM数据下载 2.镶嵌 3.提取出需要的 ...
- 基于算力网络的大数据计算资源智能调度分配方法
摘要 [目的]进入算力时代以来,伴随泛在接入.万物互联,全社会数据量迎来爆发式增长.需要通过算力网络解决大数据计算资源不足.异构算力不足.边缘算力不足等问题.[方法]基于算力网络,重新设计大数据计算体 ...
- 基于python快速简便地实时计算金融技术指标
从简单应用到平台框架应用,不同场景下,基于python快速简便地实时计算金融技术指标的方法,总结如下(鄙人之前走了不少弯路,以下五种场景实现及避坑方法,分别介绍给各位朋友,请借鉴): 一.tradin ...
- 基于Python的微博大数据舆情分析,舆论情感分析可视化系统
运行效果图 基于Python的微博大数据舆情分析,舆论情感分析可视化系统 系统介绍 微博舆情分析系统,项目后端分爬虫模块.数据分析模块.数据存储模块.业务逻辑模块组成. 先后进行了数据获取和筛选存储, ...
- python实现图的数据存储_Neo4j推出基于Python的嵌入式图数据存储
龙源期刊网 http://www.qikan.com.cn Neo4j 推出基于 Python 的嵌入式图数据存 储 作者:
最新文章
- 4篇SCI,1篇A类期刊,这位复旦博士生分享自身科研经验
- 《2021全球脑科学发展报告》发布
- 研华物联网论坛和ARM技术研讨会随笔
- spring中的AnnotationConfigUtils
- 程序员面试题精选100题(41)-把数组排成最小的数[算法]
- hive中,向map类型插入数据时,需要str_to_map一下
- hadoop yarn 获取日志_在 YARN 中简化用户日志的管理和使用
- stm32中断优先级_关于STM32 (Cortex-M3) 中NVIC的分析(转)
- scss里的继承操作符@extend
- 程序员求职面试三部曲之三:快速适应新的工作环境
- 安装配置tengine
- Linux|CentOS下配置Maven环境
- 关于runc漏洞CVE-2019-5736的修复公告 1
- sql插入时返回插入主键id(id位自动增长)
- csdn下载频道资源整理
- python股票编程_Python爬虫回测股票的实例讲解
- C. Mortal Kombat Tower(cf)dp
- [Eclipse]GEF入门系列(三、应用实例)
- Java对接微信公众号模板消息推送(架包WxJava)
- 网络工具Netwox和Wireshark详解
热门文章
- 2023年国家级高新技术企业认定,严查这类公司!
- Win8系统无法上网的原因与处理方法【绿色】
- PMP项目管理 新考纲概述
- Educational Codeforces Round 100 (Rated for Div. 2)
- 2019中科大数学考研复试题(回忆版)
- android ion内存统计,android ion 内存泄漏排查
- 护卫神怎么重启php,护卫神·主机大师如何开启php_opcache_护卫神
- 实验记录 | 6/7 收一下尾巴
- C# Unity3D游戏开发
- COMSOL java API——编译comsol模型java文件