ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

河南省10米土地覆盖数据详解:从下载到GIS处理与面积统计

河南省10米土地覆盖数据详解:从下载到GIS处理与面积统计 简介面向GIS与遥感应用需求的2020年10米分辨率河南省土地覆盖数据包源自全球陆地覆盖产品基于哨兵影像与深度学习方法制作覆盖耕地、林地、草地、湿地、水体、不透水面、裸地等10个分类适用于土地利用变化分析、生态评估与规划研究。包内包含河南省各地级市的TIF栅格数据并附tfw坐标参考、xml元数据、dbf属性表、xlsx表格及png预览等配套文件全部统一为WGS84坐标系便于直接用于ArcGIS等平台。压缩包共126个文件大小65.7MB结构清晰按城市颗粒度组织可快速提取任辖区的土地覆被信息。已有353人学习/下载适合需开展县域或市级土地覆被分析的研究者与行业人员。数据经过行政边界裁剪和坐标转换省去了自行预处理的时间可用于统计各地类面积、制作专题图或作为模型输入。1. 10米土地覆盖数据进河南一张解决“村庄看不清”的2020年地类底图做河南任何涉及土地利用的项目我最头疼的不是算法而是底图看不清。2020年10m精度河南省土地覆盖土地利用这份数据把全球10米分辨率地表分类结果按省级边界切开解压后就是GeoTIFF能直接拖进GIS。和30米分辨率相比它能把村庄边界、零散大棚、坑塘和小沟渠看明白适合拿来做国土空间规划底图、生态评估背景层或者给深度学习模型当地类训练样本。数据是2020年的正好卡在一个时间横截面上很多回忆性研究也用得上。2. 数据底细分类体系、坐标系与文件结构2.1 土地覆盖与土地利用的边界这组数据到底分了哪几类先把概念收紧。我拿到的这一类10米产品绝大多数来自Sentinel-2 10米光学影像的全球分类成果分类体系倾向于“土地覆盖”而不是“土地利用”。这两个词在专业上差别很大土地覆盖问的是“地表物理上是什么”土地利用问的是“人在干什么”。同一块地物理上长草实际可能是牧场也可能是退耕还林后还没恢复成灌木的过渡地块一片水面可能是鱼塘也可能是天然湖泊。这份数据回答的是前者直接拿它当土地利用现状用会遇到一个麻烦分类代码只能描述地表可见状态。10米产品最常见的分类体系是10个类。我用河南的实际场景给你翻译一下分类代码类别英文中文标称在河南大概对应1Water水体黄河、淮河、坑塘、水库2Trees树木伏牛山、桐柏山森林农田林网3Grass草地山坡草地、荒草地4Flooded vegetation被淹没植被河漫滩湿地、水稻田淹水期5Crops作物小麦玉米轮作区、蔬菜大棚6Scrub灌木低山丘陵灌丛7Built Area建设用地/不透水面城镇、乡村宅基地、道路8Bare ground裸地河滩、沙地、施工裸土9Snow/Ice雪/冰河南极少可忽略10Clouds/背景云影或NoData山区零散云影这张表不是这份数据包里保证附带的而是10米土地覆盖产品的通用约定。拿到压缩包后第一件事就要确认有没有对应的样式文件或说明文档如果只有TIF就按上面的代码表先建调色板再抽查几个你熟悉的点比如郑州城区、黄河滩区比对确认代码含义没被翻转过。我见过有人把水体码和裸地码搞反统计结果一下子多出几千平方公里的“滩涂”。2.2 技术参数10m分辨率从哪来、坐标系和格式有什么讲究10米分辨率说起来轻松背后对应的是Sentinel-2的10米波段蓝、绿、红、近红外。全球产品通常的做法是把2020年一整年的无云或低云影像按像素合成再用随机森林或类似的分类器逐像元打标签最后按行政边界裁剪。所以“10m精度”是指名义像元尺寸约10米×10米不是指所有边界都准到10米。拿到文件后我一般不会先打开先跑下面的命令把底裤看穿gdalinfo landcover_hns_2020_10m.tif输出里重点看四样东西Size is 17200, 16200这种行列数和河南省范围对一下大概能算出来是不是10米分网。Coordinate System is GEOGCS[WGS84 ...]说明是地理坐标系存储单位是度不能直接拿象元尺寸算面积。TypeByte8位无符号整型存储的是分类代码不是高程或反射率。NoData Value255或0后期统计要排除。如果坐标系统显示“PROJCS ... UTM Zone 49N”那像元尺寸会写成10米面积统计可以直接乘。如果是WGS84经纬度一个像元的经度跨度在河南大约是0.0001080度纬度跨度0.0000900度地平面上的真实尺寸随纬度变化面积统计必须先投影。格式上这类数据常见的有两种普通GeoTIFF和Cloud Optimized GeoTIFFCOG。如果你的文件里带_ovr文件或元数据XML大概率是原始瓦片切好的产品如果只有单独tif用GDAL的addo补建金字塔会更顺手。河南面积约16.7万平方公里10米像元总数在16亿级别8位整型压缩后通常几百MB到1GB对现代电脑不算夸张但用32位Python直接ReadAsArray()读全部区域会占掉16GB内存很容易爆。所以后面做全量统计时建议分块读。2.3 下载后第一步解压、校验和目录盘点RAR解压我用7-Zip而不是WinRAR一是分卷和中文路径支持更稳二是命令行好写脚本。解压时把压缩包放到一个短路径目录比如D:\hn_lulc\避免中文路径和Windows长路径一起发作。mkdir D:\hn_lulc cd D:\hn_lulc 7z x D:\download\2020年10m精度河南省土地覆盖土地利用.rar -oD:\hn_lulc解压完先别急着拖进QGIS花两分钟做一次清单和校验dir /s D:\hn_lulc python -c from osgeo import gdal; dsgdal.Open(rD:\hn_lulc\landcover_hns_2020_10m.tif); print(ds.GetMetadata()); print(ds.GetGeoTransform())重点确认三件事第一RAR解压后是否只有一个TIF还是带.lyr样式文件第二GeoTransform里的左上角坐标是不是落在了河南省边界附近第三有没有对应的分类说明PDF或txt。很多压缩包会附带样式资源比如QGIS的.qml文件或ArcGIS的.lyr如果存在就直接加载能省掉手动配色的时间。如果只有裸TIF那就按2.1里的代码表建调色板。3. 把栅格变成成果QGIS/ArcGIS里的处理与出图流程3.1 在QGIS里加载与符号化让地类一眼可读10米地类栅格在QGIS里拖进去第一眼往往是全黑或全白。原因是QGIS默认按连续色带渲染分类代码1~10在这些色带上被压到最暗的几个色阶。正确做法是先确认加载没问题再把渲染类型从“单波段假彩色”改成“调色板”。在QGIS界面里操作不复杂打开图层属性选择“符号化”把渲染类型切换至“调色板”然后手动添加分类。没有现成样式的话我会直接用如下QML内容存成landcover_hn.qml放到和TIF同目录!DOCTYPE qgis PUBLIC http://mrcc.com/qgis.dtd SYSTEM qgis version3.28 pipe rasterrenderer typepaletted band1 opacity1 rasterSymbolList symbol typeraster namewater color value68,132,198,255/ /symbol symbol typeraster nametrees color value24,96,48,255/ /symbol symbol typeraster namegrass color value111,180,89,255/ /symbol symbol typeraster nameflooded color value36,142,146,255/ /symbol symbol typeraster namecrops color value254,222,54,255/ /symbol symbol typeraster namescrub color value171,134,108,255/ /symbol symbol typeraster namebuilt color value222,66,66,255/ /symbol symbol typeraster namebare color value185,167,132,255/ /symbol /rasterSymbolList classification idwater value1 label水体/ classification idtrees value2 label树木/ classification idgrass value3 label草地/ classification idflooded value4 label被淹没植被/ classification idcrops value5 label作物/ classification idscrub value6 label灌木/ classification idbuilt value7 label建设用地/ classification idbare value8 label裸地/ /rasterrenderer /pipe /qgis注意上面这个QML只是演示结构具体分类值必须和你手里数据的代码表一致不匹配时会出现“水体变成红色”的乌龙。加载后如果你发现黄河的河道全部是高亮红色说明分类代码被翻转了优先怀疑代码表理解错了。3.2 按行政区统计地类面积从像元数到平方公里拿到栅格以后最常用到的第一个成果是把河南省每个县的各类面积算出来。这里有个关键参数小区矢量边界要和栅格在同一坐标系下否则统计会出大偏差。我一般用Python的rasterstats模块来做它接受GeoJSON和面状矢量返回每个面内各类像元数。先把县级行政区划读进来并改成和栅格相同的CRSimport rasterio from rasterstats import zonal_stats import geopandas as gpd # 读取县界转成与栅格相同的坐标系 counties gpd.read_file(henan_county.shp) counties counties.to_crs(EPSG:4326) # 与栅格坐标系一致 # 执行分区统计用categoricalTrue直接输出各分类代码计数 stats zonal_stats( counties, landcover_hns_2020_10m.tif, categoricalTrue, nodata255, geojson_outTrue )categoricalTrue让每个矢量面得到一个字典键是分类代码值是像元数。这里容易犯的错是不指定nodata于是统计结果里多出一个很大的255类面积怎么都对不上。nodata参数要取2.1里确认过的背景值常见是255或0。统计完成后把计数转成面积。如果栅格是UTM投影像元尺寸是10米一个像元就是100平方米。如果栅格还是经纬度则必须使用等面积投影重新投影后再统计不能用“0.0001080度 × 0.0000900度 ≈ 972平方米”这种近似在河南中部勉强能用越往北误差越明显。我的习惯是统一投到Albers等面积投影比如EPSG:6933世界Albers来算面积。操作如下# 先给栅格做投影转换 gdal.Warp(landcover_hn_albers.tif, landcover_hns_2020_10m.tif, dstSRSEPSG:6933, resampleAlgnearest)再用转换后的栅格去做zonal_stats。这样TypeByte的分类栅格在重采样时会保留正确的类别标签如果用双线性或三次卷积会出现一堆9.7、5.2这种非整数分类码后面就废了。3.3 导出成GeoTIFF和GeoJSON给其他项目喂数据如果你只需要洛阳、南阳这几个市不想要全河南省几百MB的栅格用gdalwarp按裁剪范围切一下gdalwarp -cutline luoyang.shp -crop_to_cutline \ -dstnodata 255 -of COG \ landcover_hns_2020_10m.tif landcover_luoyang_2020.tif这里-cutline指定矢量范围-crop_to_cutline把输出图像严格切到范围-dstnodata 255把边界外全写成背景值。COG输出格式会顺手把概览金字塔写进去后面的Python读图会更快。如果下游是WebGIS想转成矢量瓦片或GeoJSON先把栅格按分类代码转成简化多边形。地类的边界不需要像地籍一样精确算法上先做gdal_polygonize.py再在QGIS里用“简化”工具去掉大量锯齿。但要注意简化容差10米分辨率下边界偏移超过半个像元就失去意义一般容差设为5米到15米超过20米会丢细节特别是河南那种细碎的乡村地块。4. 避坑河南10米地类栅格数据最常见的五个坑4.1 栅格显示成一团黑渲染范围与调色板没设置现象把TIF拖进QGIS整个图都是黑色放大到郑州城区也看不清任何颜色。原因分类栅格是Byte类型QGIS默认按灰度或连续色带渲染代码1~10在0~255的全量拉伸中被压缩到肉眼分不出的暗部。还有一种情况是NoData被设成0导致大面积无值区显示为黑。解决先右键图层查看“信息”确认波段数为1再在“符号化”里把渲染类型改成“调色板”按分类代码逐项赋色。如果仍然全黑用gdalinfo看NoData值然后把背景值设成透明或把色带的最小值设为1、最大值设为10强制拉伸。4.2 统计面积差出几十倍把地理坐标系的像元直接当成10米网格现象用ArcGIS的“表格到Excel”统计出河南省某个县的“建设用地”面积有10万平方公里明显离谱。原因数据源是WGS84地理坐标系像元尺寸是度数不是米。很多人在工具里看到Pixel Size (0.00009, -0.00009)就直接乘10米结果每个像元被当成10m×10m但实际一个像元在纬线上约8.6米、经线上约11米整体面积误差在15%上下。更常见的是把度误解为米。解决先在gdalinfo里确认坐标系再统一用Albers等面积投影重投影到变长网格然后再统计。我通常会在流程说明里写明“本次统计基于CGCS2000 Albers投影栅格重采样方式为最邻近”。这样出来的面积才是可复现的。重采样还会改变像元计数所以面积偏差超过5%就是投影或重采样选择不合适的信号。4.3 河界线与省界总是对不上裁剪边界与数据源坐标漂移现象图层和河南省行政区划边界叠加时黄河两岸明显错开几百米部分县界外有碎屑状栅格。原因10米全球产品是按全球网格切分的生产方在裁剪时可能用了简化版省界或影像自身投影你用的县界是CGCS2000坐标系的测绘边界和WGS84栅格在河南地区最大有几十米的系统差。解决先确认边界和栅格不是同一个椭圆体GIS里叠加时用“重投影图层”的方式拉伸对齐如果只是做统计不要强行对齐边界直接让县界参与统计时保留裁剪容差如果是出图建议以县界为准用gdalwarp -cutline把栅格重新裁一遍切出来的范围就是跟县界完全一致的。不要用WMS底图去对河南村级边界因为底图本身的Web墨卡托投影在河南有更明显的距离变形。4.4 分类代码看着像连续数值直接当土地利用用现象统计出“河南耕地面积比自然资源厅公开的年报少了一千多万亩”或者把成片的“灌木/低矮植被”误算成草地。原因10米土地覆盖产品的“作物Crops”类只识别卫星能看到的一年生作物水稻田在淹水期会被归入“被淹没植被”或“水体”大棚在冬季可能被识别为“裸地”或“不透水面”。所以与统计部门的口径天然差出一截。更细节的是河南大量杨树农田林网和灌丛在10米像元里会混合得像草地一样。解决把“作物”和“被淹没植被”加在一起作为“耕地潜力区”或与30米农业用地数据交叉验证。如果项目目标是要出去年的确权地块面积宁愿用更高分辨率的国产数据不要直接拿这份覆盖产品当最终结论。这份数据的价值是空间格局底图而不是法定统计量。4.5 RAR解压时总报“文件损坏”或路径超长现象WinRAR解压到一半弹出“CRC错误”或者“文件名太长无法解压”用7-Zip能解压但里面某些文件明明存在却打不开。原因RAR压缩包是在Linux或国产系统下打的文件名里带了中文和超长路径Windows默认路径限制260字符复制到桌面这种深层路径后会整体爆掉。杀毒软件实时扫描也会在解压过程中把部分文件锁住产生“CRC校验错误”的假象。解决把压缩包放到D:\hn_lulc\这种短根目录下解压路径总长控制在40个字符以内如果WinRAR报错换用7-Zip并临时退出杀毒软件。解压后立刻用dir /s对比文件个数校验RAR包自带的哈希值不要等到QGIS打开失败才发现文件是不完整的。以后凡是接到这种带中文长文件名的RAR我第一反应就是先复制到根目录再动手这个习惯帮我少踩了很多坑。5. 进阶把地类面积统计写成几分钟跑完的自动化脚本5.1 全量统计的代码骨架如果你手里有多个地市或多年份的数据手动画一次是临时的自动化才是常态。下面这段脚本把整张河南省栅格分块读入统计所有分类代码的像元数。分块读取的意义在于把内存控制在几百MB而不是一次性吃掉16GB。from osgeo import gdal import numpy as np ds gdal.Open(landcover_hns_2020_10m.tif) band ds.GetRasterBand(1) nodata band.GetNoDataValue() or 255 class_count {} block 512 for y in range(0, band.YSize, block): for x in range(0, band.XSize, block): arr band.ReadAsArray(x, y, min(block, band.XSize-x), min(block, band.YSize-y)) vals, counts np.unique(arr[arr ! nodata], return_countsTrue) for v, c in zip(vals.tolist(), counts.tolist()): if v ! 0: class_count[v] class_count.get(v, 0) int(c)ReadAsArray的四个参数是起始列、起始行、读取宽、读取高min(block, ...)保证最后一片不越界。统计完像元数再乘像元面积就能得到平方公里最后用pandas输出Excel。注意只有确认gdalinfo里投影是米制直接乘出来的面积才是可信的经纬度投影必须提前转。5.2 每次跑完必查的三个指标和一处目检自动化统计完成不代表结果能直接用。我给自己定了一套检查流程每次跑完都强制走一遍gdalinfo里确认投影是米制投影而不是默认的WGS84经纬度。把所有类别面积加起来与河南省官方面积16.7万平方公里比对误差超过2%就回去查重采样方式。把郑州、洛阳两个市的统计结果和已有30米产品对比比例差超过8%就要怀疑分类码理解错了。用QGIS随机抽10个点对着Sentinel-2原始影像人工点一下确认代码类别没搞反。这是最后一步也是最容易翻车的。以前我在内蒙古做类似项目脚本和统计全通过最后发现这套产品的“裸地”码不是我想的那个值整个阿拉善的面积全进了“草地”。从那以后我每换一个数据集第一件事永远是去翻分类文档并在QML里用郑州周边最熟悉的地标做一次目检不再相信任何“默认代码表”。希望这份河南10米数据能让你少走我走过的一半弯路。本文还有配套的精品资源点击获取
返回列表