简介:2025全国风机点位数据是一套基于OSM开源地图提取的中国范围风机空间分布数据集,面向风电行业研究者、规划者和GIS技术人员,可应用于风能资源普查、风电场选址、电力规划、环境影响评价及新能源政策研究等场景。资源包共9个文件,压缩后约5.44MB,涵盖shp、dbf、prj、cpg、qmd等标准GIS类型,其中shp保存风机点位空间位置,dbf记录风机名称、类型、坐标等属性,prj定义投影与坐标参考系统,cpg和qmd分别处理字符编码与元数据。已有159人学习/浏览。数据可直接导入ArcGIS或QGIS进行查询、可视化和专题制图,通过缓冲区分析考察风机周边地物,通过叠加分析评估风电场与地形、居民区及生态敏感区的空间关系;还能结合风资源历史观测数据,为风电功率预测、风机微观选址及运维优化提供训练样本,支撑清洁能源规划与碳减排决策。
1. 2025全国风机点位数据:先看它能不能直接落地用
做风电项目前期踏勘或后评估时,最耗时间的往往不是选型计算,而是先把手头风机位置从一堆坐标里理清楚。这份2025全国风机点位数据,核心就是一份能直接落到GIS里的风机坐标点集,包含经纬度、海拔、机型、单机容量、所属场站等基础属性。它的价值在于省掉从可研报告、环评附件里手工整理坐标的体力活,适合电力设计院、新能源开发商的技经人员,以及做地理信息分析的工程师拿来当底图或初筛工具。但要把这份数据用明白,得先搞清楚它的字段底细和坐标系情况,否则点位落上去偏几百米都不知道问题出在哪。下面从数据结构开始,一步步拆。
2. 点位数据的底子:字段、坐标系与数据质量检查
2.1 先看字段:每列是什么,能干什么
拿到点位数据第一步不是画图,而是打开属性表看字段。常见的风机点位表,核心字段大概有这几类:标识字段(风机编号、场站名称)、空间字段(经度、纬度、海拔)、机型参数(单机容量、轮毂高度、风轮直径)、归属信息(省份、地市、项目名称)。下面是一份典型字段清单,字段名在不同来源里可能有出入,但对齐逻辑是一样的。
| 字段名 | 类型 | 示例值 | 用途 |
|---|---|---|---|
| FID | int | 101 | 唯一标识,用于关联台账 |
| wind_turbine_id | string | ZY-0312 | 风机编号,场内唯一 |
| lng | float | 116.3825 | 经度(十进制度) |
| lat | float | 39.9142 | 纬度(十进制度) |
| elevation | int | 42 | 海拔,米,来自SRTM或实测 |
| capacity | float | 3.6 | 单机容量,MW |
| hub_height | int | 110 | 轮毂高度,米 |
| rotor_diameter | int | 171 | 风轮直径,米 |
| plant_name | string | 张家口北风电场 | 所属场站 |
| province | string | 河北省 | 行政区划 |
这里最容易踩的坑有两个。一是capacity和hub_height这类数值字段可能存在单位不统一的情况,有的表用MW,有的表用kW,不加判断直接做加总,装机容量会差三个数量级。二是经纬度字段名可能不叫lng/lat,有的来源叫longitude/latitude,有的是x/y,而且y可能是纬度也可能是投影坐标的北坐标,这个靠字段名猜容易翻车,稳妥的办法是拿一两个已知风机场站做交叉验证。
2.2 坐标系先对齐:WGS84、CGCS2000还是别的
点位数据里最玄学的部分就是坐标系。全国风机点位数据通常有三个来源:机载GPS实测(多为WGS84)、设计院图纸提取(常见CGCS2000高斯投影)、地图平台采集(可能是GCJ02加密坐标)。三种坐标系在平原地区相互之间误差几米到几百米不等,山区可能差得更离谱。直接拿不同来源的数据叠到一张图上,点位和底图道路对不上是常态。
我一般会先做一次坐标系识别。最简单的方法是找一份已知的行政边界或已有风机图层,把待检数据叠上去看偏移量。如果整体偏移约300到500米且方向一致,大概率是GCJ02与WGS84的差异;如果完全重合,说明数据源坐标系和底图一致。另一种办法是读数据自带的投影信息,CSV文件通常没有,Shapefile的.prj文件里会有,比如GEOGCS["CGCS2000", DATUM["China_2000"...,这就是明确的坐标系声明。
常见的处理路径是把所有数据统一到WGS84经纬度,方便和公开栅格数据叠加。如果原始数据是CGCS2000地理坐标系,直接用EPSG:4490读取,再转EPSG:4326,参数如下:
import geopandas as gpd gdf = gpd.read_file('风机点位_2025.shp') print(gdf.crs) # 先看原始坐标系 gdf_wgs84 = gdf.to_crs('EPSG:4326')这段代码的逻辑是先用read_file读入Shapefile,打印crs确认原始坐标系,然后用to_crs转换到WGS84经纬度。注意to_crs的输入可以是EPSG代码字符串,也可以是proj4字符串。转换完成后建议把结果另存为新文件,不要覆盖原始数据,因为后续可能还要反查原始坐标系下的成果。
2.3 数据质量检查:空值、重复点、异常坐标
坐标系对齐之后,做一轮数据质量检查很有必要。点位数据的脏数据通常集中在这几类:经纬度为0或空值、同一场站内风机编号重复、海拔为负或明显离谱(比如沿海平原出现海拔2000米以上)、单机容量为0或空白。这些异常值不处理,后续做机位筛选或发电量测算时会把结果带偏。
用GeoPandas做去重和空值过滤的常规写法:
import geopandas as gpd import pandas as pd gdf = gpd.read_file('风机点位_2025.shp') # 空值过滤 gdf = gdf.dropna(subset=['lng', 'lat', 'capacity']) # 重复点去重:同一场站内风机编号唯一 gdf = gdf.drop_duplicates(subset=['plant_name', 'wind_turbine_id'], keep='first') # 异常坐标过滤:经纬度范围检查 gdf = gdf[(gdf['lng'] >= 73) & (gdf['lng'] <= 135)] gdf = gdf[(gdf['lat'] >= 18) & (gdf['lat'] <= 54)] # 海拔合理范围:这里按国内地形设个宽松阈值 gdf = gdf[(gdf['elevation'] >= -100) & (gdf['elevation'] <= 2500)]这段逻辑分四步走:先删除关键字段为空的行,再按场站加风机编号的组合去重,然后按中国经纬度范围框定空间范围,最后按海拔做合理性校核。参数里要注意经纬度范围是按中国国境大致框的,如果数据包含海外项目需要调整。去重时的subset参数是关键,只按风机编号去重会把不同场站的同编号风机误删,必须带上场站名。
3. 把点位变成能用图层:QGIS加载与GeoPandas批量处理
3.1 QGIS加载CSV点位:从文本到图层的标准操作
拿到CSV格式的风机点位,最快的验证方式是拖进QGIS看分布。QGIS加载CSV有三种路径:直接拖拽文件、通过图层菜单添加文本数据图层、用浏览器面板导入。直接拖拽最简单,但有时QGIS会误判字段类型,导致经纬度列没有被识别为数值。我习惯用第二种方式,可控性更高。
具体步骤是:打开QGIS,菜单栏选择图层 -> 添加图层 -> 添加文本数据图层,选中CSV文件,在文件格式里把编码设置为UTF-8。关键一步是在几何定义区域里选择"点坐标",X字段选经度列,Y字段选纬度列,坐标系选择WGS84或CGCS2000。如果原始数据是GCJ02,这里也要如实选对应坐标系,后续再通过导出重投影换成WGS84。
加载完成后检查两件事:一是属性表里有没有出现geometry字段,二是光栅化后的点位是否落在预期的省份范围内。如果点位飘到海上去,多半是X和Y字段选反了,QGIS里X是经度(左右方向),Y是纬度(上下方向),选反了点位会沿对角线镜像。这类问题在数据量大的时候不容易一眼发现,建议把省级边界图层叠在下面做参照。
3.2 GeoPandas批量处理:坐标转换与属性关联
当点位数据不是一份而是几十份分省文件时,QGIS手动加载效率太低,这时候用GeoPandas做批量处理更合适。常见需求是把多个省份的CSV合并成一个全国文件,顺便完成坐标系统一和字段规整。下面是一段批量合并的参考代码:
import geopandas as gpd import pandas as pd from pathlib import Path files = Path('./风机点位_分省').glob('*.csv') gdf_list = [] for f in files: df = pd.read_csv(f, encoding='utf-8-sig') # 列名规整:统一转为小写 df.columns = [c.strip().lower() for c in df.columns] if 'lng' not in df.columns or 'lat' not in df.columns: print(f'{f.name} 缺少经纬度列,跳过') continue # 从DataFrame构造GeoDataFrame gdf = gpd.GeoDataFrame( df, geometry=gpd.points_from_xy(df['lng'], df['lat']), crs='EPSG:4326' ) gdf_list.append(gdf) merged = pd.concat(gdf_list, ignore_index=True) merged.to_file('全国风机点位_合并.shp', encoding='utf-8')这里有几个参数值得说明:encoding='utf-8-sig'是为了兼容带BOM头的CSV文件,很多从Windows导出的CSV带BOM,不加这个参数第一列字段名会带乱码字符。points_from_xy接收两个序列,分别对应经度和纬度。crs='EPSG:4326'是声明该数据是WGS84经纬度,不是投影坐标系,如果原数据是CGCS2000地理坐标,这里应填EPSG:4490。最后to_file把合并结果导出为Shapefile,注意输出编码指定utf-8,避免在QGIS里打开中文乱码。
3.3 属性关联:把风机台账挂到点位上
点位数据只有空间坐标还不够,实际项目里通常还要关联风机台账,比如投运日期、制造商、齿轮箱型号、变压器容量这些运维信息。台账表里如果有统一的风机编号字段,就可以用pandas的merge做关联。常见做法是以场站名加风机编号作为联合主键,因为不同场站可能存在相同的风机编号,只用风机编号关联会串数据。
merged = merged.merge( taizhang_df[['plant_name', 'wind_turbine_id', 'commission_date', 'manufacturer']], on=['plant_name', 'wind_turbine_id'], how='left', validate='1:1' )这段代码的逻辑是把台账表里的投运日期、制造商信息按场站名和风机编号关联到点位表上。validate='1:1'是pandas的校验参数,如果关联后发现右边有重复键,会直接报错,这能提前暴露数据的重复问题,比事后检查省事得多。参数how='left'表示以点位表为主表,台账表匹配不上时留空,这一般是期望行为,因为点位数据通常比台账全。
4. 实操避坑:坐标系偏移、编码乱码与重复点的排查
4.1 避坑一:点位整体偏移数百米,边界和道路对不上
现象:点位在QGIS里加载后,和卫星底图叠在一起,风机明显落在农田或水面上,整体向东南或西北偏移300米以上,且偏移方向一致。
原因:数据坐标系与底图坐标系不一致。最常见的是点位为GCJ02加密坐标,底图为WGS84(或相反);另一种情况是点位为CGCS2000投影坐标(如高斯克吕格投影),被当作经纬度读取。
解决:先确认底图和点位的坐标系。如果点位是GCJ02,需要转成WGS84再叠加。转换逻辑可以简单理解为分两步:先把GCJ02反算成WGS84,再重新投影。如果点位是投影坐标,则需要知道具体投影分带参数,否则无法正确转换。判断方法:在QGIS里把点位的属性表打开,看坐标值范围。经纬度坐标范围一般在-180到180之间,投影坐标的北坐标(Y值)通常是六位数,比如4300000这样的数值。
我处理这类问题时会把原始数据单独放一个图层,转换后的放到另一个图层,两个图层设置不同的颜色,对比转换前后是否基本重合。如果点位分布与场站实际位置存在系统性偏移,大概率是坐标系判断错误。
4.2 避坑二:CSV打开全是乱码,中文场站名变成锟斤拷
现象:用QGIS或GeoPandas读取CSV,其他列正常,场站名、省份列显示乱码,或者直接报UnicodeDecodeError。
原因:CSV文件编码混乱。国内来源的CSV常见三种编码:UTF-8、GB2312、GBK。QGIS默认按UTF-8读取,遇到GBK编码就乱码;GeoPandas的read_file遇到GBK编码会直接报错。
解决:读取前先判断编码。用文本编辑器或Python的chardet判断,也可以直接用编码参数逐个试。常见做法是在pd.read_csv里指定编码为'gbk',如果报错再换'gb18030',后者是GBK的超集,兼容性更好。QGIS加载时在编码下拉框里选择GB2312或GB18030即可。另外注意导出Shapefile时设置编码为utf-8,否则在GeoPandas里读回又乱码。
4.3 避坑三:同一坐标出现多个风机点,去重时误删有效数据
现象:某场站点位数量远超实际风机台数,检查发现有大量点经纬度完全一致或非常接近;按风机编号去重后,点数变少但仍有部分有效数据被删掉。
原因:点位数据可能由多批次文件拼接而成,同一风机的坐标被重复采集;或者不同来源数据叠加时,同一位置出现微小的坐标抖动,导致特征上属于同一点但数值不完全相等。如果盲目按经纬度完全一致去重,会漏掉抖动点;如果按风机编号去重,又把不同来源的同编号风机误删。
解决:先用模糊匹配把极小距离内的点聚合。GeoPandas里可以用buffer加空间连接实现,或者简单一点,先把经纬度四舍五入到小数点后4位(约10米精度)再做去重。如下:
gdf['lng_round'] = gdf['lng'].round(4) gdf['lat_round'] = gdf['lat'].round(4) gdf = gdf.drop_duplicates(subset=['plant_name', 'lng_round', 'lat_round'], keep='first')这个思路是把空间坐标网格化到10米量级,同一网格内的点视为重复。参数round(4)是保留四位小数,在赤道附近约11米精度;如果风机场站风机间距较小,可以改成round(5),约1米精度。注意去重前先按场站分组,避免不同场站距离过近时跨场站误删。
4.4 避坑四:点位数量和台账对不上,少了几十台
现象:点位文件里的风机数量和可研报告、并网验收报告里的装机台数不一致,少了几十台,或者多了几十台。
原因:点位数据多是设计阶段或建设阶段采集的,和最终并网状态存在差异。有些点位是规划机位,项目调整后未更新;有些则是分批建设,点位文件只覆盖了一期工程。
解决:先用场站名做分组统计,把每个场站的点数与台账对比。对不上时优先排查是否存在多期工程,通常需要按照项目名称的批次字段做拆分。如果点位文件里有stage或phase字段,按这个字段分组看数量分布,能定位是缺了某期还是多了规划机位。
4.5 避坑五:海拔数据异常,山地场站点位比实际低几百米
现象:某山地风电场的点位在三维视图里看,海拔明显低于实际地形,风机机位和DEM地形起伏不匹配。
原因:点位文件里的海拔可能来自不同的DEM产品,SRTM在山区存在高程偏差,或者部分点位直接取了机位坐标的GPS海拔而GPS本身误差较大。不同来源混在一起,海拔值一致性就差。
解决:做整体分析时不要直接用点位自带海拔,改用高精度DEM提取。常见做法是用ASTER GDEM或ALOS 12.5米数据做提取,QGIS里用"采样栅格值"工具,或者GeoPandas里面配合rasterio做值提取。提取前先把点位和DEM投影到同一坐标系,否则采样位置偏移。
5. 进阶玩法:点位与风速、地形叠加做机位初筛
点位数据不只能画点看分布,更实用的玩法是叠加气象栅格和地形数据做机位初筛。思路是把每个风机点位对应的年平均风速、海拔、坡度提取出来,按阈值筛选出低效机位,为后评估或技改提供量化依据。
先准备风速栅格和DEM。公开数据源这边,风速可以用ERA5再分析数据或第三方风资源图,DEM用ALOS 12.5米或ASTER。用GeoPandas加rasterio做提取的常规写法:
import rasterio import geopandas as gpd from rasterio.sample import sample_gen gdf = gpd.read_file('全国风机点位_合并.shp') gdf_wgs84 = gdf.to_crs('EPSG:4326') # 提取风速栅格值 with rasterio.open('年均风速_100m.tif') as src: coords = [(x, y) for x, y in zip(gdf_wgs84.geometry.x, gdf_wgs84.geometry.y)] gdf['ws_mean'] = [v[0] for v in sample_gen(src, coords)] # 按风速阈值筛选 low_wind = gdf[gdf['ws_mean'] < 6.5] print(f'低风速机位数量: {len(low_wind)}')这段代码先从GeoDataFrame取所有点位的经纬度坐标,用rasterio的sample_gen在栅格对应位置采样,把风速值写回属性表,然后按6.5m/s阈值筛出低效机位。需要注意栅格和点位的坐标系必须一致,这里统一到EPSG:4326再采样,避免投影不一致导致采样位置偏移。阈值本身需要根据机型切入风速来定,陆上大型机的切入风速一般在3m/s左右,但年均风速低于6.5m/s的场站发电表现普遍一般,你可以根据自己手里的实际发电数据调整。
筛出低效机位之后,再做一轮坡度提取。坡度可以理解成地形变化率,数值越大代表地形越陡,施工难度和基础成本越高。用DEM提取坡度的代码如下:
import numpy as np with rasterio.open('dem_alos_12m.tif') as dem: dem_array = dem.read(1) transform = dem.transform # 计算坡度 x, y = np.gradient(dem_array, transform[0], transform[4]) slope = np.arctan(np.sqrt(x*x + y*y)) * 180 / np.pi # 提取点位坡度 coords = [(x, y) for x, y in zip(gdf_wgs84.geometry.x, gdf_wgs84.geometry.y)] gdf['slope_deg'] = [slope[int((coord[1] - transform[2]) / transform[4]), int((coord[0] - transform[0]) / transform[0])] for coord in coords]这段代码通过numpy的gradient计算DEM网格在x和y方向的梯度,换算出坡度角,再按点位坐标从坡度数组里取值。注意坐标转行列号的公式:行号由纬度减左上角Y再除以像元高度,列号由经度减左上角X再除以像元宽度,栅格数据不先做统一坐标系的情况下直接用这个公式容易拿错行列。实际项目里我一般会把DEM重投影到和点位一致后再提取,宁可多一步转换也不省这个环节。
机位初筛是把风速低、坡度大、远离现有道路的点位标记出来,作为重点核查对象。注意初筛只是提示风险,不能替代微观选址的实地踏勘。栅格数据本身有精度限制,风速数据是再分析或遥感反演产品,和实际测风塔数据有偏差,在山地复杂地形中偏差更大。把这套逻辑跑完后,我会把所有标记点位导出成一个CSV,配上场站名、风机编号、平均风速、坡度,交给自己或同事去现场复核。从那以后我做这类数据前,都会强制走一遍坐标系对齐和字段规整的流程,再进入叠加分析,省掉了不少返工时间。希望帮到你。
本文还有配套的精品资源,点击获取