You need to enable JavaScript to run this app. Qt环境下Basemap地图清除原有数据重新绘制失败问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Qt环境下Basemap地图清除原有数据重新绘制失败问题求助

问题根因

你每次触发绘图时都会重复创建Figure、FigureCanvas、工具栏和布局,且没有移除mapWindow中已存在的旧控件,多个控件层叠导致旧内容始终可见,看似没有刷新。同时你混用了matplotlib的pyplot状态机接口和Qt嵌入场景下的面向对象接口,也是导致缓存没有清理的原因之一。

修复方案

  1. 将画布、工具栏、布局的初始化移到__init__方法中,全局仅初始化一次,避免重复创建控件
  2. 绘图时仅清空已有画布、重绘内容、刷新画布即可,不需要重新创建控件
  3. 移除不必要的plt.close("all")调用,避免干扰Qt内嵌的matplotlib实例

修正后完整代码

from PyQt5 import uic, QtWidgets
from PyQt5.QtWidgets import QVBoxLayout

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt, numpy as np
from mpl_toolkits.basemap import Basemap
import sys

qtCreatorFile = ('map_debug_form.ui')

LandingPageUI, LandingPageBase = uic.loadUiType(qtCreatorFile)

class searchApp(LandingPageBase, LandingPageUI):

    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self)
        LandingPageBase.__init__(self)
        self.setupUi(self)    

        # 初始化画布、工具栏、布局 仅执行一次
        self.map_figure = plt.figure(figsize=(20,20))
        self.map_canvas = FigureCanvas(self.map_figure)
        self.map_toolbar = NavigationToolbar(self.map_canvas, self)
        layout = QVBoxLayout() 
        layout.addWidget(self.map_toolbar)
        layout.addWidget(self.map_canvas)
        layout.setSpacing(0)
        self.mapWindow.setLayout(layout)  

        def plotMap(latlongs):            
            # 清空现有画布
            self.map_figure.clear()

            lons=[]
            lats=[]    
            
            for item in latlongs:
                if item[0] < 0:
                    tempLon = 360+item[0]
                else:
                    tempLon = item[0]
                    
                lons.append(tempLon)
                lats.append(item[1])
        
            m =Basemap(llcrnrlon=(min(lons)-15),llcrnrlat=(min(lats)-15),urcrnrlon=(max(lons)+15),urcrnrlat=(max(lats)+15),projection='mill',resolution = 'l')

            x, y = m(lons, lats)
            m.drawcoastlines(linewidth=.75)
            m.fillcontinents(color='0.8')
            m.drawparallels(np.arange(-80,81,5),labels=[1,1,0,0])
            m.drawmeridians(np.arange(0,360,10),labels=[0,0,0,1])
            
            m.scatter(x,y,10,marker='o',color='r', zorder=10,  alpha=0.7,  picker=True)
            self.map_figure.subplots_adjust(left=0, right=1, top=1, bottom=0.04)
            self.map_canvas.draw()         # 刷新画布               
            
        self.btnMap1.clicked.connect(lambda: plotMap([[-167.7742, 54.20214], [-167.7742, 54.20214], [-164.24091, 54.9311], [-163.9388, 54.4394], [-160.59821, 54.86025]]))
        self.btnMap2.clicked.connect(lambda: plotMap([[-172.7829, 50.55793], [-172.7829, 50.55793], [-172.7829, 50.55793], [-169.78149, 50.6384], [-169.78149, 50.6384]]))


if __name__ == "__main__":

    app=QtWidgets.QApplication.instance() 
    if not app: 
         app = QtWidgets.QApplication(sys.argv)

    window = searchApp()
    window.show()
    sys.exit(app.exec_())

内容的提问来源于stack exchange,提问作者jshort

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 21:54:04