Skip to main content
 首页 » 编程设计

python之在 Python GUI 中使用 basemap 作为图形

2024年10月24日32zhoujg

我有生成 basemap 的代码片段,以及 GUI 的(非常粗略的)开始部分。但是,我找不到“one-liner”可以让我在 GUI 中将 map 显示为图形。代码片段如下;理想情况下,我希望发生几件事:

  1. 与 sin(2*pi*t)
  2. 绘图相对应的“ basemap ”图像
  3. 如果我要单击显示的图(希望您可以单击 map 上的任意位置,脚本将记录纬度),我真的希望代码能够记录图形上的(像素)位置以及您点击位置的经度)。

关于第 1 步,我已经尝试过将图形变量 f 设置为等于 basemap ;这完全杀死了 GUI 部分,并在另一个窗口中简单地显示了 map 的图像。

我试图通过尝试实现我在 stackexchange 上找到的几个例程来解决 #2,但从未让它完全工作。

basemap :

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
 
## User-chosen datapoint 
#lons = [10]; lats = [20]; 
 
# Define map projection 
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,\ 
            llcrnrlon=-180,urcrnrlon=180,resolution='c') 
m.drawcoastlines() 

粗糙的图形用户界面:

import matplotlib 
matplotlib.use('TkAgg') 
 
from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
# implement the default mpl key bindings 
from matplotlib.backend_bases import key_press_handler 
 
from Tkinter import * 
from PIL import Image 
import numpy as np 
import matplotlib.pyplot as plt 
 
from PIL import Image 
from mpl_toolkits.basemap import Basemap 
 
from matplotlib.figure import Figure 
 
import sys 
if sys.version_info[0] < 3: 
    import Tkinter as Tk 
else: 
    import tkinter as Tk 
 
root = Tk.Tk() 
root.wm_title("Embedding in TK") 
 
f = Figure(figsize=(5, 4), dpi=100) 
a = f.add_subplot(111) 
t = arange(0.0, 3.0, 0.01) 
s = sin(2*pi*t) 
 
a.plot(t, s) 
 
# a tk.DrawingArea 
canvas = FigureCanvasTkAgg(f, master=root) 
canvas.show() 
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 
 
toolbar = NavigationToolbar2TkAgg(canvas, root) 
toolbar.update() 
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 
 
def on_key_event(event): 
    print('you pressed %s' % event.key) 
    key_press_handler(event, canvas, toolbar) 
 
canvas.mpl_connect('key_press_event', on_key_event) 
 
def _quit(): 
    root.quit()     # stops mainloop 
    root.destroy()  # this is necessary on Windows to prevent 
                    # Fatal Python Error: PyEval_RestoreThread: NULL tstate 
button = Tk.Button(master=root, text='Quit', command=_quit) 
button.pack(side=Tk.BOTTOM) 
 
Tk.mainloop() 

请您参考如下方法:

如何将 basemap 绘图包含到 Tkinter 中的问题实际上尚未得到解答。因此,我们的想法是在图形中创建一个坐标区 ax 并将 basemap 添加到坐标区。这是通过 ax 参数完成的,

m = Basemap(..., ax=ax) 

然后图形以通常的方式添加到 Canvas ;下面是一个完整的例子。

from mpl_toolkits.basemap import Basemap 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
 
import sys 
if sys.version_info[0] < 3: 
    import Tkinter as Tk 
else: 
    import tkinter as Tk 
 
root = Tk.Tk() 
root.wm_title("Embedding in TK") 
 
fig = Figure(figsize=(5, 4), dpi=100) 
ax = fig.add_subplot(111) 
 
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,\ 
            llcrnrlon=-180,urcrnrlon=180,resolution='c', ax=ax) 
m.drawcoastlines() 
 
# a tk.DrawingArea 
canvas = FigureCanvasTkAgg(fig, master=root) 
canvas.show() 
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 
 
toolbar = NavigationToolbar2TkAgg(canvas, root) 
toolbar.update() 
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 
 
def _quit(): 
    root.quit()     # stops mainloop 
    root.destroy()  # this is necessary on Windows to prevent 
                    # Fatal Python Error: PyEval_RestoreThread: NULL tstate 
button = Tk.Button(master=root, text='Quit', command=_quit) 
button.pack(side=Tk.BOTTOM) 
 
Tk.mainloop() 

注意:在较新版本的 matplotlib 中,您应该使用 NavigationToolbar2Tk 而不是 NavigationToolbar2TkAgg。