简介:这份资源面向遥感解译、地理信息分析与光伏产业研究者,提供2007至2022年中国太阳能面板空间分布数据,可用于刻画光伏产业时空演变、支撑能源规划与区域研究。数据基于Google Earth Engine平台,以Landsat影像为源,采用分层抽样与分区建模结合的方式,通过随机森林算法解译,模型F1得分高于0.92,视觉验证F1高于0.87,光伏细节与真彩色影像一致。受中国区域范围大、年度影像难以拼合的限制,数据每三年生成一期,共六个时期。资源包共106个文件,约194.14MB,包含19个shp及配套shx、dbf、prj等矢量文件、1个mxd工程文件、1个tif栅格成果,以及中国地图与南海诸岛等辅助数据,可直接在ArcGIS中打开编辑或使用TIF图片。已有128人学习下载,适合需要现成光伏分布底图与可编辑工程文件的研究者快速开展分析。
1. 从一份 2007–2022 年六期光伏面板 shp 说起:它到底能解决什么
如果你正在做光伏选址、能源规划、双碳路径模拟,或者要给某个县域做太阳能潜力评估,大概率绕不开一个前置问题:中国到底哪里装了光伏板,什么时候装的,装了多少。这个问题听起来简单,真动手就会发现公开数据几乎空白——统计年鉴只有装机容量,没有空间位置;遥感影像自己解译,一年全国跑下来算力、样本、验证全是坑。这份「中国太阳能面板 2007–2022 年六个时期空间分布数据」就是冲着这个缺口来的:它用 Google Earth Engine 上的 Landsat 影像,配合分层抽样加分区建模,再用随机森林做解译,最终落成一套标准 shp 文件,外加一个能直接用 ArcGIS 打开的 mxd 工程。六个时期分别是 2007、2010、2013、2016、2019、2022,每三年一期,原因很实在——中国区域太大,单一年份很难拼出满足解译要求的无云 Landsat 影像,与其硬凑不如拉长周期保证质量。模型精度 F1 大于 0.92,视觉验证 F1 大于 0.87,解译出的光伏分布细节和 Landsat 真彩色影像对得上。适合谁?做能源地理的研究生、做国土空间规划的工程师、做光伏投资前期筛查的分析师,以及需要一份可信底图来二次开发的人。下面我按「拿到手怎么用 → 参数怎么调 → 哪里会翻车」的顺序拆一遍。
2. 数据组织与坐标体系:先搞懂 shp、mxd、dbf 各自管什么
2.1 六个时期文件的命名规律与属性表结构
拿到压缩包解压后,你会看到一组按年份命名的文件,每个年份一套 shapefile 的标准三件套(部分带 .cpg 编码声明)。从项目正文给出的文件清单能看出结构:
| 文件 | 类型 | 作用 |
|---|---|---|
| 2007太阳能面板分布.shp / .dbf / .cpg | 矢量 | 2007 年光伏面板分布面/点要素 |
| 2010、2013、2016、2019、2022 同名文件 | 矢量 | 对应年份分布 |
| 中国地图 shp(china.dbf 等) | 矢量 | 国界、省界底图 |
| 南海诸岛 shp | 矢量 | 南海区域标准表达 |
| 世界行政区_国家_NE版(world.dbf) | 矢量 | Natural Earth 世界国家边界,做全球对照或出图背景 |
| 制作好的 .mxd | 工程 | ArcGIS 地图文档,含符号化与图层组织 |
.cpg 文件是编码声明,告诉软件 dbf 属性表用的是什么字符集。国内很多老 shp 默认 GBK,ArcGIS 打开中文属性容易乱码,有 .cpg 就省心很多。.dbf 是属性表本体,光伏面板的分布信息(比如面积、类别、年份标识)就存在这里。关键点:六个年份是独立文件,不是一张表加年份字段,所以做时间序列分析时要自己合并。
2.2 坐标系与投影:为什么不能直接拿去算面积
这类全国尺度数据,常见做法是地理坐标系 WGS84(EPSG:4326)或 CGCS2000。WGS84 单位是度,直接算面积会得到平方度,没有物理意义。正确姿势是先投影到等面积投影再统计。国内做全国面积统计,我一般用 Albers 等面积投影(双标准纬线常见取 25°N 和 47°N,中央经线 105°E)。在 ArcGIS 里操作:
# ArcPy 批量投影六个年份的 shp 到 Albers 等面积投影 import arcpy, os arcpy.env.workspace = r"D:\solar_shp" out_coord = arcpy.SpatialReference(102025) # Asia North Albers Equal Area Conic for yr in [2007, 2010, 2013, 2016, 2019, 2022]: in_fc = f"{yr}太阳能面板分布.shp" out_fc = f"{yr}_albers.shp" arcpy.Project_management(in_fc, out_fc, out_coord) print(yr, "done")逻辑说明:Project_management做坐标系转换,SpatialReference(102025)是 Esri 内置的亚洲北部 Albers 等面积投影。参数上,如果你研究区偏南(比如只做华南),可以把中央经线改到 114°E 附近,标准纬线相应下调,减少边缘变形。投影完再开属性表新建面积字段,用「计算几何」算平方公里,这才是能进报告的数字。别跳过这步,我见过太多人拿 WGS84 直接算面积,结果和统计年鉴差出几倍,回头查半天才发现是单位问题。
2.3 mxd 工程怎么用:省掉符号化和出图的重复劳动
mxd 是 ArcGIS 的地图文档,里面已经配好了图层顺序、符号、标注。双击打开(需对应 ArcGIS 版本,10.x 系列兼容性较好),你会看到光伏分布叠在中国地图上,南海诸岛也按标准位置放好。想改配色,右键图层 → Properties → Symbology;想换底图,直接拖入自己的影像或矢量。注意:mxd 里引用的数据源路径是作者机器上的绝对路径,换电脑打开会显示红色感叹号,右键图层 → Data → Repair Data Source 重新指到你解压后的 shp 即可。这一步是新手最容易卡住的地方,不是数据坏了,是路径没对上。
3. 从 shp 到分析结果:筛选、叠加与时间序列统计
3.1 按行政区提取光伏分布:以县域边界为例
热搜里「县域行政区划边界 shp」出现频率很高,说明很多人拿到全国数据后第一件事就是按县切。假设你有一份县域边界 shp,想统计每个县六个年份的光伏面板面积:
# 按县域边界统计各年份光伏面积 import arcpy arcpy.env.workspace = r"D:\solar_shp" county = r"D:\boundary\county.shp" for yr in [2007, 2010, 2013, 2016, 2019, 2022]: solar = f"{yr}_albers.shp" out_tab = f"county_{yr}.dbf" # 相交后按县汇总面积 inter = f"inter_{yr}.shp" arcpy.Intersect_analysis([solar, county], inter) arcpy.Statistics_analysis(inter, out_tab, [["Shape_Area", "SUM"]], "县代码字段") print(yr, "统计完成")逻辑说明:Intersect_analysis把光伏面和县界求交,得到每个县内的光伏碎片;Statistics_analysis按县代码字段分组,对面积字段求和。参数上,"县代码字段"要换成你边界数据里实际的唯一标识字段名(常见是 adcode 或 NAME)。如果光伏数据是点要素而非面,就把Shape_Area换成Count,统计的是面板个数。跑完你会得到六个 dbf,再在 Excel 或 pandas 里按县代码 join 起来,就是一张「县 × 年份」的面板面积矩阵,直接能画增长曲线。
3.2 叠加土地覆盖或坡度数据:做选址适宜性初筛
光伏选址常看两个硬约束:不能占耕地、坡度不能太陡。把这份分布数据和土地覆盖栅格叠加,能快速看出已建光伏主要落在什么地类上,反过来指导新选址。
# 用分区统计提取光伏分布区的坡度均值 import arcpy from arcpy.sa import * arcpy.CheckOutExtension("Spatial") slope = Slope("dem.tif", "DEGREE") # 从 DEM 生成坡度 solar = "2022_albers.shp" out = ZonalStatisticsAsTable(solar, "OBJECTID", slope, "slope_stat.dbf", "DATA", "MEAN")逻辑说明:Slope从 DEM 算坡度,单位设成度;ZonalStatisticsAsTable对每个光伏要素统计其范围内坡度的均值。参数"DATA"表示忽略 NoData,"MEAN"是统计量,你也可以换成 MAX 看最陡处。这一步能帮你判断现有光伏的坡度上限大概在哪,作为后续筛选阈值。常见做法是把坡度大于 15° 或 25° 的区域先排除,再叠加电网、道路做进一步打分。
3.3 时间序列对比:六个年份怎么放一起看变化
六个独立 shp 要看出「哪里新增、哪里没动」,最直接的是做叠加分析或转栅格后做差值。矢量方式:
# 找出 2019 到 2022 新增的光伏区域 import arcpy arcpy.env.workspace = r"D:\solar_shp" arcpy.Erase_analysis("2022_albers.shp", "2019_albers.shp", "new_1922.shp")逻辑说明:Erase_analysis从 2022 年里挖掉 2019 已覆盖的部分,剩下的就是三年间新增。反过来Intersect能得到持续存在的区域。参数上注意两个图层必须同一坐标系,否则结果会错位。如果你更习惯栅格,可以先把每个年份转成 0/1 栅格(有光伏为 1),再做栅格减法,正值就是新增。栅格方式更适合大范围快速出图,矢量方式属性更完整、便于统计精确面积。
4. 避坑与排查:这份数据最容易翻车的五个地方
4.1 属性表中文乱码
现象:ArcGIS 打开 dbf,中文字段显示成问号或方块。原因:dbf 编码和软件默认编码不一致,老数据常见 GBK,新软件默认 UTF-8。解决:确认同目录有 .cpg 文件且内容为GBK或UTF-8;没有就手动建一个同名 .cpg,写入GBK,重开即可。QGIS 里可以在图层属性 → 源 → 数据源编码手动指定。
4.2 面积算出来偏大或偏小
现象:统计的光伏面积和预期差很多。原因:没投影就计算几何,或者投影选错(比如用了等距投影算面积)。解决:统一转到 Albers 等面积投影再算,检查投影的中央经线和标准纬线是否覆盖你的研究区。血泪经验:同一份数据在不同投影下面积能差 5%–10%,全国尺度尤其明显。
4.3 mxd 打开全是红色感叹号
现象:图层列表里每个图层前都有红色感叹号,地图空白。原因:mxd 记录的是绝对路径,换机器后路径失效。解决:右键图层 → Data → Repair Data Source,定位到解压后的 shp;或者用 ArcCatalog 的「Set Data Source」批量修复。如果版本差异太大(比如用 10.8 打开 9.x 的 mxd),可能部分符号丢失,重新配一下即可。
4.4 六个年份边界对不齐
现象:把 2007 和 2022 叠一起,发现同一块光伏位置有偏移。原因:不同年份影像来源或配准基准有细微差异,或者你中途对某个年份单独做过投影没同步。解决:全部统一到同一坐标系和同一投影参数后再叠加;如果仍有偏移,用「Spatial Adjustment」做一次配准,以底图或某一年为基准。注意:偏移通常在几十米量级,做全国趋势分析可忽略,做地块级对比必须处理。
4.5 直接拿 shp 转 txt 或转 3dtiles 丢精度
现象:把 shp 转成 txt 坐标或转 3dtiles 做三维展示后,位置飘了。原因:转换工具默认可能做了坐标舍入或投影变换。解决:转 txt 前确认输出的是原始经纬度还是投影坐标,保留足够小数位(经纬度至少 6 位);转 3dtiles 时指定正确的空间参考,别让工具自动猜。热搜里「shp转txt」「shp转3dtiles」都是高频操作,但精度丢失往往就出在这一步。
5. 进阶:把六期 shp 做成可复用的光伏增长栅格栈
如果你要喂给机器学习模型,或者做长时间序列的空间分析,把六个年份的矢量转成一套对齐的栅格栈会方便很多。思路是:统一范围、统一分辨率、统一投影,每个年份生成一张 0/1 或密度栅格,再堆叠成多波段。
# 六个年份 shp 转统一栅格栈 import arcpy from arcpy.sa import * arcpy.CheckOutExtension("Spatial") arcpy.env.extent = "china_boundary.shp" # 统一范围 arcpy.env.cellSize = 1000 # 1km 分辨率 arcpy.env.snapRaster = "reference.tif" # 对齐基准 for yr in [2007, 2010, 2013, 2016, 2019, 2022]: shp = f"{yr}_albers.shp" out_raster = f"solar_{yr}.tif" # 转栅格,有光伏为1,无则为0 arcpy.PolygonToRaster_conversion(shp, "Shape_Area", out_raster, "MAXIMUM_AREA", "OBJECTID", 1000) print(yr, "栅格化完成") # 用栅格计算器堆叠成多波段(或用 Composite Bands 工具) arcpy.CompositeBands_management( [f"solar_{y}.tif" for y in [2007,2010,2013,2016,2019,2022]], "solar_stack.tif")逻辑说明:PolygonToRaster_conversion把面转栅格,"MAXIMUM_AREA"表示像元取覆盖面积最大的要素值,"OBJECTID"是值字段(这里其实用面积或类别字段更合适,按你属性表实际字段改)。CompositeBands_management把六张单波段合成一个六波段影像,波段顺序对应年份。参数上,cellSize设 1000 米是权衡精度和体量,做全国尺度够用;如果只做某个省,可以降到 100 或 30 米。snapRaster保证所有栅格像元对齐,否则后续做波段运算会错位。
拿到solar_stack.tif后,你可以算每个像元的增长斜率、做变化检测、或者作为特征输入分类模型。验证方法很简单:随机抽几百个点,对照 Landsat 真彩色影像看解译对不对,算个混淆矩阵。作者已经做过视觉验证,F1 大于 0.87,你自己复核时重点看城乡结合部和大型地面电站边缘,这些地方最容易混分。
从那以后我每次拿到多期矢量数据,都强制先做三件事:统一投影、统一范围、统一分辨率,再谈分析。这套流程帮我省掉了无数次返工。希望帮到你。
本文还有配套的精品资源,点击获取