共计 2416 个字符,预计需要花费 7 分钟才能阅读完成。
传统遥感分类的局限性
在 GIS 领域干了十几年,最大的感受就是:传统最大似然分类像把钝刀子。遇到城市混合用地(比如绿化带 + 建筑阴影)时,分类结果总会出现大面积椒盐噪声。去年做某开发区土地覆盖项目时,用最大似然法得到的总体精度只有 68%,而决策树轻松冲到 85% 以上——这 17% 的差距直接决定了项目验收时的甲方表情。

技术选型对比
实测 ArcGIS Pro 3.0 环境下,用同一组哨兵 2 号数据(10m 分辨率):
- 训练速度 (1000 个样本):
- 决策树:42 秒
- 随机森林:3 分 15 秒
-
SVM:8 分 37 秒
-
显存占用 :
- 决策树峰值占用仅 1.2GB
- 随机森林训练时爆过 6GB 显存
- SVM 需要预先分配 5GB 缓存
特别提醒:如果显卡是 GTX1060 这种老卡,建议优先考虑决策树。去年用随机森林处理珠海市 200km²数据时,显卡驱动崩溃了 3 次 …
核心实现流程
1. 数据预处理
先上 NDVI 计算的 ArcPy 代码(注意处理负值问题):
import arcpy
from arcpy.sa import *
# 处理异常值
with arcpy.EnvManager(extent="MAXOF"):
red_band = Raster("B4.tif") * 0.0001 # 哨兵 2 号需要缩放
nir_band = Raster("B8.tif") * 0.0001
ndvi = (nir_band - red_band) / (nir_band + red_band + 0.0001) # 避免除零
ndvi.save("NDVI.tif")
2. 高效数据转换
用 FeatureClassToNumPyArray 比直接读 shapefile 快 20 倍:
arr = arcpy.da.FeatureClassToNumPyArray(
in_features="samples.shp",
field_names=["NDVI", "NDWI", "Class"],
where_clause="Class IS NOT NULL" # 过滤空值
)
X = np.array([arr["NDVI"], arr["NDWI"]]).T
y = arr["Class"]
3. 参数调优实战
GridSearchCV 结合 ArcGIS 的独特参数:
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
param_grid = {'max_depth': [3, 5, 7],
'min_samples_leaf': [1, 3, 5],
'splitter': ["best", "random"] # ArcGIS 特有参数
}
grid_search = GridSearchCV(DecisionTreeClassifier(),
param_grid,
cv=5,
n_jobs=4 # 调用多核
)
grid_search.fit(X, y)
print(f"最佳参数:{grid_search.best_params_}")
避坑指南
NoData 处理的三种方案
-
简单粗暴法 (适合小数据量):
arcpy.management.CalculateStatistics("NDVI.tif", ignore_values=[0]) -
掩膜替换法 (推荐方案):
null_raster = Con(IsNull("NDVI.tif"), 0, "NDVI.tif") -
插值法 (耗时但精确):
arcpy.sa.FocalStatistics("NDVI.tif", "Circle 3 CELL", "MEAN")
投影自动化纠正
用这段脚本自动统一投影(曾帮我省下 3 小时手工操作):
import os
def batch_project(input_folder, output_csr):
for root, _, files in os.walk(input_folder):
for file in files:
if file.endswith('.tif'):
in_raster = os.path.join(root, file)
out_raster = os.path.join(root, "prj_" + file)
arcpy.ProjectRaster_management(
in_raster, out_raster, output_csr,
"NEAREST", "10 10" # 保持原始分辨率
)
性能优化技巧
并行计算配置
在 ArcGIS Pro 的 Python 环境中,这个参数能让处理速度翻倍:
arcpy.env.parallelProcessingFactor = "75%" # 预留 25% 内存给系统
内存管理
GIS 数据处理最怕内存泄漏,养成好习惯:
large_raster = arcpy.Raster("big_data.tif")
# 处理代码...
del large_raster # 立即释放
arcpy.ClearWorkspaceCache() # 清理工作空间缓存
流程图示例
用 Mermaid 展示决策树分类流程:
graph TD
A[原始影像] --> B[计算光谱指数]
B --> C[样本数据提取]
C --> D{数据质量检查}
D -->| 通过 | E[训练决策树]
D -->| 不通过 | F[数据清洗]
E --> G[模型评估]
G --> H[分类结果输出]
QGIS 兼容性改造
如果需要迁移到 QGIS,主要修改点:
1. 将 arcpy.sa 替换为 QGIS 的 Processing 算法
2. 用 GDAL 命令替代 ArcGIS 地理处理工具
3. 样本数据建议转存为 GeoPackage 格式
改过最痛的一个项目:原本在 ArcGIS 用 10 行代码实现的流程,QGIS 版写了 80 多行 … 建议提前预留 30% 的改造时间。
结语
决策树分类就像瑞士军刀——不是最锋利的,但绝对是 GIS 工程师包里最实用的。上周刚用这套方法完成了雄安新区 200km²的林地动态监测,从数据准备到成果输出只用了 6 小时。记住:好的分类结果 =60% 的数据质量 +30% 的参数调优 +10% 的运气,祝大家少遇 bug,多出图!
