使用multiprocessing绘制地图点位时报float对象不可迭代错误如何解决
问题排查与修复
错误原因
- 类型报错原因:
pool.starmap会遍历zip(pop_lon, pop_lat)的每一组元素,每次给multiprocessing_func传入单个经度浮点值、单个纬度浮点值,但函数内部错误地尝试对两个float类型值执行zip遍历操作,因此抛出float不可迭代报错。 - 多窗口原因:Windows系统下Python多进程默认使用spawn启动模式,每个子进程都会重新导入主模块,你将绘图初始化、
plt.show()代码写在了if __name__ == '__main__'保护块之外,导致每个子进程启动时都会执行一次绘图初始化代码,生成独立的窗口。 - 核心逻辑错误:matplotlib的画布/坐标轴对象无法跨进程共享,子进程中操作的
ax是主进程对象的独立副本,绘图结果无法回传到主进程的画布上,因此多进程方案完全无法实现你期望的「多进程加速绘制同一张地图」的需求。
正确优化方案
绘制大量散点不需要循环调用ax.plot,更不需要多进程,直接使用ax.scatter一次性传入所有经纬度数组,渲染效率是循环绘图的数百倍,完全满足你快速微调参数的需求。
优化后代码:
import cartopy.crs as ccrs import matplotlib.pyplot as plt import cartopy.feature as cf import pandas as pd import numpy as np if __name__ == '__main__': df = pd.read_csv('passport.csv') pop_lat = df['latitude'].tolist()[:-2] pop_lon = df['longitude'].tolist()[:-2] central_lat, central_lon = np.median(pop_lat), np.median(pop_lon) extent = [central_lon - 3, central_lon + 3.4, central_lat - 2.2, central_lat + 2] ax = plt.axes(projection=ccrs.AlbersEqualArea(central_lon, central_lat)) ax.set_extent(extent) ax.add_feature(cf.COASTLINE) ax.add_feature(cf.BORDERS) # 一次性绘制所有散点,不需要循环、不需要多进程 ax.scatter(pop_lon, pop_lat, c='b', s=1, transform=ccrs.Geodetic()) plt.show()
内容的提问来源于stack exchange,提问作者Kuehlschrank
相关产品推荐
相关产品推荐

