基于DEM的坡度坡向分析

2023-11-21 10:08
文章标签 分析 dem 坡向 坡度

本文主要是介绍基于DEM的坡度坡向分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于DEM的坡度坡向分析https://mp.weixin.qq.com/s?__biz=MzkyNjMzNTQ2Mw==&mid=2247483871&idx=1&sn=f77bf3fae1c43fc6ad44661d10f621d3&chksm=c239a957f54e2041162a1bdfbd9c749fd061ad06192a4032136a450915e537ba21c50f129490&token=2086761678&lang=zh_CN#rd

坡度坡向分析方法

坡度(slope)是地面特定区域高度变化比率的量度。坡度的表示方法有百分比法、度数法、密位法和分数法四种,其中以百分比法和度数法较为常用。本文计算的为坡度百分比数据。如当角度为45度(弧度为π/4)时,高程增量等于水平增量,高程增量百分比为100%。

坡向(aspect)是指地形坡面的朝向。坡向用于识别出从每个像元到其相邻像元方向上值的变化率最大的下坡方向。坡向可以被视为坡度方向。坡向是一个角度,将按照顺时针方向进行测量,角度范围介于 0(正东)到 360(仍是正东)之间,即完整的圆。不具有下坡方向的平坦区域将赋值为-1(arcgis处理时为-1,其他可能为0)。

坡度、坡向计算一般采用拟合曲面法。拟合曲面一般采用二次曲面,即3×3的窗口,如下图所示。每个窗口的中心为一个高程点。图中的中心点e坡度和坡向计算过程如下。

参考链接:

[1]https://blog.csdn.net/zhouxuguang236/article/details/40017219

[2]https://blog.csdn.net/weixin_45561357/article/details/106677574

[3]https://www.cnblogs.com/gispathfinder/p/5790469.html

注意:DEM的空间坐标系一定要为投影坐标系

ArcGIS坡度坡向分析

打开DEM数据

坡度分析

坡度结果

坡向分析

坡向结果

python-gdal坡度坡向分析

from osgeo import gdaldemfile = r"D:\微信公众号\坡度坡向\N40E117_Albers.tif"# 获取DEM信息
infoDEM = gdal.Info(demfile)# 计算坡度
slopfile = r"D:\微信公众号\坡度坡向\N40E117_Albers_gdal_Slope.tif"
slope = gdal.DEMProcessing(slopfile, demfile, "slope", format='GTiff', slopeFormat="percent", zeroForFlat=1, computeEdges=True)# 计算坡向
aspectfile = r"D:\微信公众号\坡度坡向\N40E117_Albers_gdal_Aspect.tif"
b = gdal.DEMProcessing(aspectfile, demfile, "aspect", format='GTiff', trigonometric=0, zeroForFlat=1, computeEdges=True)

坡度结果

坡向结果

python坡度坡向分析

import gdal
import numpy as np
from scipy import ndimage as nd
from copy import deepcopydemfile = r"D:\微信公众号\坡度坡向\N40E117_Albers.tif"
slopefile = r"D:\微信公众号\坡度坡向\N40E117_Albers_python_Slope.tif"#读取DEM数据
ds = gdal.Open(demfile)
cols = ds.RasterXSize
rows = ds.RasterYSize
geo = ds.GetGeoTransform()
proj = ds.GetProjection()
dem_data = ds.ReadAsArray()
data = deepcopy(dem_data).astype(np.float32)
band = ds.GetRasterBand(1)
nodata = band.GetNoDataValue()
data[data == nodata] = np.nan
# data[data<-999]=np.nan
mask = np.isnan(data)
# 将无效值或背景值临近像元填充
if np.sum(mask) > 0:ind = nd.distance_transform_edt(mask, return_distances=False, return_indices=True)data = data[tuple(ind)]# 计算坡度
xsize = np.abs(geo[1])
ysize = np.abs(geo[5])
x = ((data[:-2, 2:] - data[:-2, :-2]) + 2 * (data[1:-1, 2:] - data[1:-1, :-2]) + (data[2:, 2:] - data[2:, :-2])) / (8 * xsize)
y = ((data[2:, :-2] - data[:-2, :-2]) + 2 * (data[2:, 1:-1] - data[:-2, 1:-1]) + (data[2:, 2:] - data[:-2, 2:])) / (8 * ysize)
s_data = np.full((rows, cols), -999, dtype=np.float32)
s_data[1:-1, 1:-1] = (np.arctan(np.sqrt((np.power(x, 2) + np.power(y, 2)))))
s_data[1:-1, 1:-1] = np.abs(np.tan(s_data[1:-1, 1:-1])) * 100
s_mask = s_data==-999
# 边缘填充
if np.sum(s_mask) > 0:ind = nd.distance_transform_edt(s_mask, return_distances=False, return_indices=True)s_data = s_data[tuple(ind)]
# 掩膜
s_data[dem_data==nodata] = -999
# 写出结果
driver = gdal.GetDriverByName("gtiff")
outds = driver.Create(slopefile, cols, rows, 1, gdal.GDT_Float32)
outds.SetGeoTransform(geo)
outds.SetProjection(proj)
outband = outds.GetRasterBand(1)
outband.WriteArray(s_data)
outband.SetNoDataValue(-999)

坡度结果

import gdal
import numpy as np
from scipy import ndimage as nd
from copy import deepcopydemfile = r"D:\微信公众号\坡度坡向\N40E117_Albers.tif"
aspectfile = r"D:\微信公众号\坡度坡向\N40E117_Albers_python_Aspect.tif"#读取DEM数据
ds = gdal.Open(demfile)
cols = ds.RasterXSize
rows = ds.RasterYSize
geo = ds.GetGeoTransform()
proj = ds.GetProjection()
dem_data = ds.ReadAsArray()
data = deepcopy(dem_data).astype(np.float32)
band = ds.GetRasterBand(1)
nodata = band.GetNoDataValue()
data[data == nodata] = np.nan
# data[data<-999]=np.nan
mask = np.isnan(data)
# 将无效值或背景值临近像元填充
if np.sum(mask) > 0:ind = nd.distance_transform_edt(mask, return_distances=False, return_indices=True)data = data[tuple(ind)]# 计算坡向
xsize = np.abs(geo[1])
ysize = np.abs(geo[5])
x = ((data[:-2, 2:] - data[:-2, :-2]) + 2 * (data[1:-1, 2:] - data[1:-1, :-2]) + (data[2:, 2:] - data[2:, :-2])) / (8 * xsize)
y = ((data[2:, :-2] - data[:-2, :-2]) + 2 * (data[2:, 1:-1] - data[:-2, 1:-1]) + (data[2:, 2:] - data[:-2, 2:])) / (8 * ysize)
a_data = np.full((rows, cols), -999, dtype=np.float32)
a_data[1:-1, 1:-1] = np.arctan2(y, -1 * x) * 57.29578
a_data_ = deepcopy(a_data[1:-1, 1:-1])
a_data[1:-1, 1:-1][a_data_ < 0] = 90 - a_data[1:-1, 1:-1][a_data_ < 0]
a_data[1:-1, 1:-1][a_data_ >90] = 450 - a_data[1:-1, 1:-1][a_data_ > 90]
a_data[1:-1, 1:-1][(a_data_ >= 0) & (a_data_ <= 90)] = 90 - a_data[1:-1, 1:-1][(a_data_ >= 0) & (a_data_ <= 90)]
a_data[1:-1, 1:-1][(x==0.)& (y==0.)] = -1
a_data[1:-1, 1:-1][(x==0.)& (y>0.)] = 0
a_data[1:-1, 1:-1][(x==0.)& (y<0.)] = 180
a_data[1:-1, 1:-1][(x>0.)& (y==0.)] = 90
a_data[1:-1, 1:-1][(x<0.)& (y==0.)] = 270.# 边缘填充
a_mask = a_data==-999
if np.sum(a_mask) > 0:ind = nd.distance_transform_edt(a_mask, return_distances=False, return_indices=True)a_data = a_data[tuple(ind)]# 掩膜
a_data[dem_data==nodata] = -999
# 写出结果
driver = gdal.GetDriverByName("gtiff")
outds = driver.Create(aspectfile, cols, rows, 1, gdal.GDT_Float32)
outds.SetGeoTransform(geo)
outds.SetProjection(proj)
outband = outds.GetRasterBand(1)
outband.WriteArray(a_data)
outband.SetNoDataValue(-999)

坡向结果

测试数据:

链接:https://pan.baidu.com/s/1PODbTJn1JOqOA4qeaJq4Gg 

提取码:l3fw 

欢迎关注个人wx_gzh: 小Rser

这篇关于基于DEM的坡度坡向分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/401637

相关文章

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory