2017-09-25 4 views
0

私は、KMLファイルを読み込んでMatplotlib/Basemapにデータをプロットする簡単なアプリケーションを作成しようとしています - 「貧しい人のGoogle Earth」のようなものです。地理空間上のデータの分布のビュー。python - PyQtアプリケーションにMatplolib/Basemapを埋め込む

私の問題は、ユーザーインターフェイスにベースマップを埋め込むことです。以下のコードはアプリケーションを作成しますが、マップを表示する代わりに、軸のペアのみを表示します。

import warnings 
import sys 
import numpy as np 
from PyQt4 import QtCore, QtGui 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.figure import Figure 
from mpl_toolkits.basemap import Basemap 
warnings.filterwarnings("ignore") 

class MyMplCanvas(FigureCanvas): 
    def __init__(self, parent=None, width=5, height=4, dpi=100): 
     fig = Figure(figsize=(width, height), dpi=dpi) 
     self.axes = fig.add_subplot(111) 

     FigureCanvas.__init__(self, fig) 
     self.setParent(parent) 

     FigureCanvas.setSizePolicy(self, 
            QtGui.QSizePolicy.Expanding, 
            QtGui.QSizePolicy.Expanding) 
     FigureCanvas.updateGeometry(self) 

     m = Basemap() 
     m.drawcoastlines(color='#777799') 
     m.drawcountries(color='#ccccee') 
     m.drawmapboundary() 
     m.bluemarble() 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
     QtGui.QMainWindow.__init__(self) 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 

     self.fileMenu = QtGui.QMenu("&File", self) 
     self.fileMenu.addAction("Open...", self.fileOpen, 
           QtCore.Qt.CTRL + QtCore.Qt.Key_O) 
     self.fileMenu.addSeparator() 
     self.fileMenu.addAction("&Quit", self.fileQuit, 
           QtCore.Qt.CTRL + QtCore.Qt.Key_Q) 
     self.menuBar().addMenu(self.fileMenu) 

     self.statusBar().setSizeGripEnabled(True) 
     self.statusBar().showMessage("Ready") 

     self.items = QtGui.QDockWidget("Layers", self) 
     self.items.setFloating(False) 
     self.items.setFeatures(self.items.NoDockWidgetFeatures) 

     self.listWidget = QtGui.QListWidget() 
     self.listWidget.addItem("file1") 
     self.listWidget.addItem("file2") 
     self.listWidget.addItem("file3")  
     self.items.setWidget(self.listWidget) 

     self.main_widget = QtGui.QWidget(self) 
     l = QtGui.QVBoxLayout(self.main_widget) 
     sc = MyMplCanvas(self.main_widget, width=5, height=4, dpi=100) 
     l.addWidget(sc) 
     self.main_widget.setFocus() 
     self.setCentralWidget(self.main_widget) 
     self.setGeometry(100,100,650,350) 
     self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.items) 
     self.setWindowTitle("Poor's Man KML Viewer") 
     self.show() 

    def fileOpen(self): 
     filename = unicode(QtGui.QFileDialog.getSaveFileName(self, 
         "Open file", "", 
         "KML files (*.kml)")) 
     if filename: 
      self.listWidget.addItem(filename) 

    def fileQuit(self): 
     self.close() 

    def closeEvent(self, ce): 
     self.fileQuit() 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    main = MainWindow() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

はPyQtはアプリケーションにmatplotlibのプロットを埋め込むの良い例がありますが、私はどんな考慮ベースマップを見つけることができませんでした。

誰も私に手を差し伸べることはできますか?

ありがとうございます!

答えて

1

私はあなたはそれが存在する必要軸れるベースマップを伝えるために不足していると言うでしょう:

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

は、私はまた、Pythonの関数の名前でvaraibleを呼び出すことがないお勧めします。私。 mapの代わりにmを使用してください。 これはここでは問題ありませんが、他のケースでは簡単に見過ごされた問題です。

引数を使用しない場合、Basemapは独自のFigureを作成するか、pyplot内で利用可能なmatplotlib軸を取得します。組み込みの場合、pyplotをまったく使用したくないので、ベースマップが住むために特定の軸を指定する必要があります。

+0

ありがとう!実際には、私は数分前にこれを分かっただけです!私はあなたの提案を反映するために質問を編集しました。ところで:地図をキャンバスの全領域に塗りつぶす方法はありますか?私はtight_layout()でいくつかの実験をしましたが、何も変わりませんでした。 – maurobio

+0

これは質問&回答サイトです。質問に答えを与えることはあまり意味がないかもしれません。特に回答がすでに下に与えられている場合はそうです(そうでない場合はもちろん自分の質問に答えることができます)。今、 'tight_layout'に関する問題は明確ではありません - どこにコードがありますか?それを使用するなどの問題は何ですか? 2つの選択肢があります:この問題を編集して 'tight_layout'の問題を尋ねます(答えが役に立たないように答えが与えられた後に質問の意味を変更することは一般的には嫌ですが) 。 – ImportanceOfBeingErnest

+0

tight_layoutの実験はこのコードでは実装されていません。とにかく、私はすでに潜在的な解決策を考案しています。ありがとう! – maurobio

関連する問題