You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:39:01