QGIS中如何计算滑雪场多边形区域的平均坡向
计算滑雪场多边形区域内的平均坡向方法
核心注意点
坡向是环形数据(0-360°),不能直接用普通算术平均(比如10°和350°的算术平均是180°,但实际平均方向是0°),必须通过三角函数转换后再计算。
一、桌面GIS工具实现(QGIS/ArcGIS)
QGIS步骤
生成坡向栅格
打开栅格 > 分析 > 坡向工具,输入你的DEM数据,输出坡向栅格文件。计算坡向的sin/cos栅格
用栅格计算器生成两个新栅格:- 正弦值:
sin(radians("aspect@1")) - 余弦值:
cos(radians("aspect@1"))
- 正弦值:
分区统计平均值
打开矢量 > 分析工具 > 分区统计:- 分区图层:选择你的滑雪场多边形GeoJSON
- 值图层:分别选择刚才生成的sin和cos栅格
- 统计类型:勾选
平均值
完成后,多边形属性表会新增两个字段(比如sin_mean、cos_mean)。
计算最终平均坡向
打开属性表 > 字段计算器,新增计算字段,表达式:if(atan2("sin_mean", "cos_mean") * 180 / pi() < 0, atan2("sin_mean", "cos_mean") * 180 / pi() + 360, atan2("sin_mean", "cos_mean") * 180 / pi())这个表达式会把弧度转成角度,并处理负值(转成0-360°范围)。
ArcGIS步骤
逻辑和QGIS一致:
- 用
表面分析 > 坡向生成坡向栅格。 - 用
栅格计算器生成sin/cos栅格。 - 用
分区统计获取每个多边形的sin/cos平均值。 - 在属性表中用字段计算器,通过
ATAN2函数转换为平均坡向,处理负值。
二、代码实现(Python+GDAL/GeoPandas)
适合批量处理或自动化场景,以下是核心代码:
import numpy as np import rasterio from rasterstats import zonal_stats import geopandas as gpd from osgeo import gdal # 1. 生成坡向栅格 gdal.DEMProcessing('aspect_output.tif', 'your_dem.tif', 'aspect', computeEdges=True) # 2. 读取坡向栅格并计算sin/cos with rasterio.open('aspect_output.tif') as src: aspect_data = src.read(1) affine = src.transform nodata = src.nodata aspect_rad = np.deg2rad(aspect_data) sin_aspect = np.sin(aspect_rad) cos_aspect = np.cos(aspect_rad) # 3. 读取滑雪场多边形 gdf = gpd.read_file('ski_resorts.geojson') # 4. 分区统计sin/cos的平均值 sin_stats = zonal_stats(gdf, sin_aspect, affine=affine, stats=['mean'], nodata=nodata) cos_stats = zonal_stats(gdf, cos_aspect, affine=affine, stats=['mean'], nodata=nodata) # 5. 计算平均坡向并添加到属性 gdf['avg_sin'] = [stat['mean'] for stat in sin_stats] gdf['avg_cos'] = [stat['mean'] for stat in cos_stats] gdf['avg_aspect'] = np.rad2deg(np.arctan2(gdf['avg_sin'], gdf['avg_cos'])) # 处理负值,转为0-360° gdf['avg_aspect'] = gdf['avg_aspect'].apply(lambda x: x + 360 if x < 0 else x) # 保存结果 gdf.to_file('ski_resorts_with_avg_aspect.geojson', driver='GeoJSON')
内容的提问来源于stack exchange,提问作者spreaderman
相关产品推荐
相关产品推荐

