如何解决一维数组经纬度映射问题并在QGIS中可视化?
解决AQI数据经纬度映射与QGIS可视化问题
看起来你在把一维AQI数据转成带经纬度的CSV时踩了几个小坑,咱们一步步梳理问题并修正:
核心问题分析
首先明确两个关键前提:
- QGIS默认使用的WGS84坐标系(EPSG:4326)是**[-180,180]经度范围**,[180,-180]的反向映射极少用到,优先考虑前者。
- 你的代码直接从-180开始累加经度,但原数据是0-360的范围,这会导致经纬度和AQI数据的对应关系完全错位。
你的代码存在的具体问题
- 经度生成逻辑错误:你直接从-180开始递增,但原数据的经度是0-360,正确的做法应该先生成0-360的原始经度,再转换为[-180,180]。
- 文件写入效率极低:每次循环都打开/关闭文件,不仅慢,还可能导致数据写入异常。
- 缺少表头:CSV没有表头的话,QGIS导入时容易识别错字段。
修正后的代码
import csv # 替换成你的一维AQI数据数组,长度应为316*544=172904 aqi_data = [...] # 初始化参数(用公式计算步长,更直观) lat_start = -90 lat_step = 180 / 316 # 等价于你写的0.5727848101265823 lon_start = 0 lon_step = 360 / 544 # 等价于你写的0.6617647058823529 # 一次性打开文件写入,避免重复IO操作 with open('pollution.csv', 'w', newline='') as fp: writer = csv.writer(fp, delimiter=',') # 先写入表头,方便QGIS识别字段 writer.writerow(['index', 'latitude', 'longitude', 'aqi']) count = 0 # 先遍历纬度(从南到北) for lat_idx in range(316): current_lat = lat_start + lat_idx * lat_step # 再遍历经度(从0到360,再转成[-180,180]) for lon_idx in range(544): # 生成原始0-360经度 original_lon = lon_start + lon_idx * lon_step # 转换为WGS84的[-180,180]经度 converted_lon = original_lon - 360 if original_lon > 180 else original_lon aqi = aqi_data[count] count += 1 if float(aqi) == 0: continue # 写入单条数据 writer.writerow([count, current_lat, converted_lon, aqi])
额外排查建议
- 验证经纬度对应关系:先打印几个关键点位的结果,比如:
- 原始经度0 → 转换后0
- 原始经度180 → 转换后180
- 原始经度270 → 转换后-90
确认这些点位和你预期的地理位置一致。
- 检查数据顺序:如果导入QGIS后位置还是不对,大概率是你的一维数组
aqi_data的排列顺序和循环顺序不匹配——比如原数据是先遍历纬度再经度,还是先经度再纬度?如果是后者,需要调换循环的嵌套顺序。 - 尝试反向映射(万不得已):如果确认[-180,180]不对,可以把经度转换逻辑改成
converted_lon = 180 - original_lon,这会把0-360转成180到-180的范围,再导入QGIS测试。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

