2007-2022年六期太阳能面板空间分布数据GIS处理与出图实战

发布时间:2026/10/13 4:15:37
2007-2022年六期太阳能面板空间分布数据GIS处理与出图实战 简介这份资源面向遥感解译、光伏产业研究与地理信息分析人员提供2007至2022年中国太阳能面板空间分布数据可用于刻画光伏产业时空演变、支撑能源规划与学术研究。数据基于Google Earth Engine平台以Landsat影像为源采用分层抽样与分区建模结合的方式通过随机森林算法解译模型F1得分高于0.92视觉验证F1高于0.87解译细节与真彩色影像一致。因全国范围年度影像难以拼凑数据每三年一期共六个时期。压缩包约194MB含106个文件以shp、shx、dbf、prj等标准矢量文件为主另附mxd工程文件、TIF栅格及中国地图与南海诸岛shp可直接在ArcGIS中打开编辑或直接使用。已有128人学习下载适合需要现成光伏分布底图与可编辑工程文件的研究者快速开展空间分析与制图。1. 拿到一份 2007-2022 年六期太阳能面板空间分布数据先搞清楚它能干什么如果你手头正好有一份覆盖 2007 到 2022 年、按六个时期切分的中国太阳能面板空间分布数据里面还配了标准 shp 文件、mxd 工程文件、中国地图 shp 和南海诸岛 shp那它大概率不是拿来“看一眼就完事”的展示型资料而是能直接进 GIS 工作流的底图级素材。我最早接触这类数据是在做一个县域光伏选址复盘当时最头疼的不是模型而是找不到一套时间跨度够长、边界又规范的空间底图。这份数据的价值就在于它把太阳能面板的分布变化按六个时期拆开同时把中国地图和南海诸岛的边界单独给全省掉了大量拼图、对坐标、补岛屿的重复劳动。适合谁用做能源地理、双碳研究、区域规划、遥感变化检测以及需要出规范专题图的人。下面我按“先立住坐标系和文件结构再跑通可视化最后避坑”的顺序把整套流程拆开讲。2. 六个时期怎么切、shp 和 mxd 各自管什么先把数据组织逻辑理清2.1 六个时期不是随便分的它决定了你后面怎么做时间对比标题里“2007-2022 年六个时期”这个说法常见做法是按政策节点或数据可获取性来切比如 2007-2009、2010-2012、2013-2015、2016-2018、2019-2020、2021-2022 这种跨度。你拿到手第一件事不是急着打开 ArcGIS而是先确认每个时期对应的属性字段名。通常会在属性表里看到一个类似period或phase的字段值可能是 1 到 6也可能是年份区间字符串。如果字段名是中文比如“时期”那在后续用 Python 读取时就要注意编码问题。我一般会先用ogrinfo把图层结构和字段类型打印出来确认每个时期的记录数和几何类型是否一致。这一步花五分钟能省掉后面两小时的“为什么筛选不出来”的玄学问题。ogrinfo -so -al solar_panel_2007_2022.shp这条命令的-so表示只输出摘要-al表示所有图层。重点看Feature Count和Geometry两行。如果某个时期的记录数明显偏少可能是该时期数据本身稀疏也可能是字段值有空格或大小写不一致。参数上不需要额外调直接跑就行。如果输出里出现乱码说明 shp 的.cpg文件缺失或编码不是 UTF-8这时候要么补一个.cpg文件写明UTF-8要么在读取时强制指定编码。2.2 mxd 文件是出图模板不是数据本身别把它当数据源很多人第一次拿到 mxd 会误以为它是“另一个版本的数据”其实 mxd 是 ArcMap 的工程文件里面存的是图层引用、符号系统、版面布局和标注规则。它指向的仍然是那些 shp 文件。你双击 mxd 打开时如果路径变了它会显示红色感叹号提示数据源丢失。这时候不要慌在 ArcMap 里点“图层属性 - 源 - 设置数据源”重新指到你的 shp 目录即可。我一般会先把所有 shp 放在一个固定文件夹里比如D:\solar_gis\data然后再打开 mxd这样修复路径一次就能全部恢复。mxd 里通常已经配好了六个时期的颜色渐变和南海诸岛的插图框你直接导出地图就能用。但要注意mxd 是 ArcMap 的格式ArcGIS Pro 虽然能导入但符号系统可能会有细微偏移建议出图前先预览一遍。2.3 中国地图 shp 和南海诸岛 shp 为什么要单独给这是这类数据里最容易被忽视、但出事最多的部分。中国地图 shp 提供的是陆地国界和省级行政区划南海诸岛 shp 则是把南海诸岛及其附近海域单独作为一个图层。很多公开底图要么缺南海诸岛要么把九段线画得含糊导致出图不合规。这份数据把两者分开给好处是你可以灵活控制做全国专题图时把南海诸岛作为插图放在右下角做局部放大时又可以单独调用。常见做法是主图用中国地图 shp 做省界底南海诸岛 shp 放在版面右下角比例尺单独设。注意南海诸岛 shp 的坐标系必须和中国地图 shp 一致否则拼在一起会错位。我一般会先用gdalinfo看一下两个文件的Coordinate System是否相同。gdalinfo china_map.shp | findstr Coordinate gdalinfo south_china_sea_islands.shp | findstr Coordinate如果两个输出的 EPSG 码不一样比如一个是 4326一个是 3857那就需要先统一投影。统一投影用ogr2ogr就能做不需要打开桌面软件。ogr2ogr -t_srs EPSG:4326 china_map_4326.shp china_map.shp ogr2ogr -t_srs EPSG:4326 south_china_sea_islands_4326.shp south_china_sea_islands.shp-t_srs指定目标坐标系这里统一到 WGS84 地理坐标系。如果你要做面积统计建议统一到 Albers 等积投影EPSG 码常见的是 102025 或自定义。参数上-s_srs可以指定源坐标系但如果源文件自带.prjogr2ogr会自动读取不用手动写。3. 用 Python 把六个时期的 shp 读进来做时间序列对比的最小命令3.1 环境准备geopandas 和 matplotlib 就够了不需要装 ArcGIS 也能跑通分析。我一般用geopandas读 shpmatplotlib出图contextily加底图可选。安装命令如下pip install geopandas matplotlib contextily如果你用的是 condaconda install -c conda-forge geopandas更稳因为 geopandas 依赖 GDAL 和 Fionaconda 能自动解决版本匹配。装完后先跑一个最小读取测试import geopandas as gpd # 读取太阳能面板分布 shp gdf gpd.read_file(solar_panel_2007_2022.shp) # 查看前 5 行和字段列表 print(gdf.head()) print(gdf.columns.tolist()) print(gdf.crs)这段代码的逻辑很简单read_file自动识别 shp 的几何类型和属性表head()看数据长什么样columns看字段名crs看坐标系。如果crs输出是None说明.prj文件丢了你需要手动指定gdf.crs EPSG:4326。参数上read_file还支持rows参数只读前 N 行数据量大时可以先rows100试读确认字段没问题再全量读。3.2 按六个时期分组统计面板数量或面积假设属性表里有一个period字段值是 1 到 6还有一个area_km2字段表示面板面积。你可以这样分组统计# 按时期分组统计记录数和总面积 summary gdf.groupby(period).agg( count(period, size), total_area(area_km2, sum) ).reset_index() print(summary)groupby按period分组agg里用size统计记录数用sum统计面积。如果area_km2字段不存在你可以用gdf.geometry.area现算但注意单位取决于坐标系。地理坐标系算出来是平方度没有实际意义必须投影到等积坐标系再算。我一般会先gdf.to_crs(EPSG:102025)转成 Albers 等积投影再算面积。这一步是很多新手翻车的地方直接对 4326 算面积结果出来是小数还以为是数据错了。3.3 出六张分时期专题图统一图例和比例尺出图时最容易乱的是图例和比例尺不统一导致六个时期没法直接对比。我一般会先确定一个统一的数值范围比如面板面积从 0 到 5000 平方公里然后六个时期都用同一套颜色映射。import matplotlib.pyplot as plt from matplotlib.colors import Normalize import matplotlib.cm as cm fig, axes plt.subplots(2, 3, figsize(18, 12)) periods sorted(gdf[period].unique()) norm Normalize(vmin0, vmax5000) cmap cm.get_cmap(YlOrRd) for ax, p in zip(axes.flat, periods): subset gdf[gdf[period] p] subset.plot(columnarea_km2, cmapcmap, normnorm, axax, legendFalse) ax.set_title(fPeriod {p}) ax.set_axis_off() # 加一个共享色带 sm cm.ScalarMappable(normnorm, cmapcmap) sm.set_array([]) fig.colorbar(sm, axaxes, orientationhorizontal, fraction0.05, pad0.05) plt.savefig(solar_panel_six_periods.png, dpi300, bbox_inchestight)这段代码的关键是norm和cmap在循环外定义保证六个子图用同一套映射。set_axis_off()去掉坐标轴出图更干净。bbox_inchestight防止色带被裁掉。参数上vmax要根据你的实际数据调如果最大值是 8000就改成 8000否则高值会被截断。dpi300是出版级日常看 150 就够。4. 避坑与排查shp 文件下载后最容易翻车的五个地方4.1 现象打开 shp 发现属性表全是乱码字段名变成问号原因shp 的.dbf文件默认编码是 GBK 或 Latin-1而你的读取环境默认 UTF-8。尤其是从某些渠道下载的 shp 文件.cpg文件缺失或写错。解决先看目录里有没有.cpg文件没有就手动建一个内容写UTF-8或GBK。如果已经乱码用geopandas读取时指定encodingGBKgdf gpd.read_file(solar_panel.shp, encodingGBK)如果还是不行用ogr2ogr转一次编码ogr2ogr -lco ENCODINGUTF-8 output.shp input.shp4.2 现象mxd 打开后图层全是红色感叹号提示数据源丢失原因mxd 里存的是绝对路径你把数据挪了位置或换了盘符它就找不到。解决在 ArcMap 里右键图层 - 属性 - 源 - 设置数据源重新指到新的 shp 路径。如果图层多用“修复数据源”批量操作。更稳的做法是把 mxd 和所有 shp 放在同一个文件夹里用相对路径保存。ArcMap 里可以在“文件 - 地图文档属性 - 路径名”里勾选“存储相对路径”。4.3 现象南海诸岛 shp 和中国地图 shp 拼在一起岛屿位置偏到海里原因两个文件的坐标系不一致或者其中一个没有投影文件。解决用gdalinfo分别看 EPSG 码不一致就用ogr2ogr -t_srs统一。如果.prj缺失需要手动指定。常见的是中国地图 shp 用 EPSG:4326南海诸岛 shp 用 EPSG:3857统一到 4326 后就能对齐。4.4 现象按时期分组统计时某个时期记录数为 0原因period字段的值可能有空格、大小写不一致或者用了中文数字“一、二、三”。解决先print(gdf[period].unique())看实际值然后用str.strip()去空格用str.lower()统一大小写。如果是中文数字写一个映射字典替换mapping {一: 1, 二: 2, 三: 3, 四: 4, 五: 5, 六: 6} gdf[period] gdf[period].map(mapping)4.5 现象算出来的面板面积是小数明显不对原因直接对地理坐标系EPSG:4326算面积单位是平方度。解决先转等积投影再算。中国区域常用 Albers 投影参数是中央经线 105°E双标准纬线 25°N 和 47°N。用geopandas转gdf_albers gdf.to_crs(projaea lat_125 lat_247 lon_0105 datumWGS84) gdf_albers[area_km2] gdf_albers.geometry.area / 1e6/1e6是把平方米转成平方公里。这一步做完面积数值就正常了。5. 进阶用法用 mxd 模板批量出图再拿 shp 做空间自相关5.1 用 ArcPy 调 mxd 模板批量导出六个时期的地图如果你装了 ArcMap可以用 ArcPy 直接调 mxd 模板改一下图层定义查询批量导出六张图。这样比手动一张张出图快得多而且风格完全一致。import arcpy mxd arcpy.mapping.MapDocument(rD:\solar_gis\template.mxd) df arcpy.mapping.ListDataFrames(mxd)[0] lyr arcpy.mapping.ListLayers(mxd, solar_panel, df)[0] for p in range(1, 7): lyr.definitionQuery fperiod {p} arcpy.mapping.ExportToPNG(mxd, fD:\\solar_gis\\output\\period_{p}.png, df, resolution300) del mxddefinitionQuery是 ArcMap 里的定义查询相当于 SQL 的WHERE。ExportToPNG的resolution参数设 300 就是出版级。注意路径里用双反斜杠或原始字符串否则会报转义错误。这段代码只能在 ArcMap 的 Python 2.7 环境里跑ArcGIS Pro 用的是 Python 3API 不一样需要换成arcpy.mp。5.2 用 Morans I 看六个时期的空间聚集变化如果你想知道太阳能面板在空间上是不是越来越集中可以算全局 Morans I。geopandas本身不带需要pysal或esda。pip install esda libpysalimport libpysal from esda.moran import Moran w libpysal.weights.Queen.from_dataframe(gdf_albers) w.transform r for p in range(1, 7): subset gdf_albers[gdf_albers[period] p] if len(subset) 1: w_sub libpysal.weights.Queen.from_dataframe(subset) w_sub.transform r mi Moran(subset[area_km2], w_sub) print(fPeriod {p}: Morans I {mi.I:.4f}, p {mi.p_sim:.4f})Queen是邻接权重transformr是行标准化。mi.I是 Morans I 值大于 0 表示聚集小于 0 表示离散。p_sim是置换检验的伪 p 值小于 0.05 才算显著。注意每个时期要单独建权重因为记录数不同。如果某个时期记录太少Morans I 会不稳定这时候看趋势就行不用太纠结单期显著性。5.3 一个我踩过的坑别用 mxd 里的符号系统直接套到新数据上有一次我拿 mxd 模板出图发现颜色和之前不一样查了半天才发现 mxd 里的符号系统是按“记录数”分级的而新数据的记录数变了分级断点就自动重算了。后来我改成手动设断点或者用classificationField固定到area_km2才稳定下来。所以如果你要对比多个时期符号系统的分级字段和断点一定要锁死别让它自动算。这个习惯我后来一直保持出图前先检查一遍图层的符号系统是不是“手动”而不是“自然间断”。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询