Daha çox

QGIS openlayers_plugin'i müstəqil python skriptinə necə yükləmək olar (QGIS əlaqədar python konsolu deyil)


openlayers plaginini bağımsız bir tətbiqə yükləməyə çalışsam, həmişə False ilə uğursuz olur, baxmayaraq ki yollar müəyyənləşdirilir və plugin mövcuddur.

(Ubuntu 14.04, QGIS 2.4, python-2.7-də sınaqdan keçirilmişdir)

#! / usr / bin / python # - * - kodlaşdırma: utf-8 - * - idxal sys, os import qgis import qgis.gui, qgis.utils from qgis.core import * PyQt4 from import QtGui # a app app open = QtGui.QApplication (sys.argv) # qgisinizin quraşdırılmış olduğu QgsApplication.setPrefixPath (u '/ usr', True) # yükləyici təminatçıları QgsApplication.initQgis () # qgis.utils.plugin_paths plaginlərini quraşdırın =  [ '/ usr / share / qgis / python / plugins', os.path.expanduser ('~ / .qgis2 / python / plugins'),] qgis.utils.updateAvailablePlugins () print qgis.utils.available_plugins print "… yüklə: ", qgis.utils.loadPlugin (u'openlayers_plugin ') print" ... start: ", qgis.utils.startPlugin (u'openlayers_plugin') print" active:  n ", qgis.utils.active_plugins canvas = qgis.gui. QgsMapCanvas () canvas.show ()

burada məsələ nədir? post pyqgisdən açıq laylar qatını necə almaq olar? əvvəllər plaginin sehrli şəkildə mövcud olduğu yerləşmiş piton konsoluna aiddir.

təşəkkürlər!


Bu heç vaxt, bəlkə də bəzi hacklərlə yaxşı işləmək niyyətində deyil. Plugins normal olaraqQgisInterfaceQGIS interfeysi və metodlarına giriş imkanı verən obyekt. Bağımsız skriptinizdə bu obyekt yoxdur. Əksər plaginlər, hamısı olmasa da, QGIS xaricində çalışması üçün dizayn edilməmişdir.


TDD paradiqmasına çox həvəsli olduğum üçün bir müddət QGIS və QGIS-plaginlərini tək başına çağırmağa imkan verən saxta interfeysi (internetdə tapdığım bəzi kod parçaları əsasında) bir araya gətirdim.

Tapdığım interfeys belə görünür və bu vaxtdan bəri bütün vahid testlərim üçün istifadə etdim:

# coding = utf-8 "" "QGIS plagininin tətbiqi ... qeyd :: Bu proqram pulsuz bir proqramdır; Pulsuz Proqram Vəqfi tərəfindən yayımlandığı kimi GNU General Public License şərtlərinə uyğun olaraq yenidən paylaya və / və ya dəyişə bilərsiniz; Lisenziyanın 2-si və ya (seçiminizə görə) hər hansı bir sonrakı versiya ... qeyd :: Bu qaynaq kodunun əsası 'postgis Viewer' tətbiqindən orijinal müəlliflərlə kopyalandı: Müəllif hüquqları (c) 2010, Ivan Mincik, ivan.mincik @ gista.sk Müəllif hüquqları (c) 2011 Alman Carrillo, [email protected] Müəlliflik hüququ (c) 2014 Tim Sutton, [email protected] "" "qgis._core import QgsVectorLayer from PyQt4.QtCore import QObject, pyqtSlot, pyqtSignal, QCoreApplication , PyQt4.QtGui'dən QSize qgis.core'dan QWidget idxal QgsMapLayerRegistry, QgsApplication, QgsVectorLayer from qgis.gui import QgsMapCanvasLayer, QgsMapCanvas idxal log sys from mole import config LOGGER = logging.getL "(logging.getL) "" Bir QGIS yalançı tətbiqetmə qurur hich zəng üsullarını sanki QGIS konsolundan çağırarkən imkan verir. : return qgis_app: Pseudo QGIS-instansiya: rtype: QgsApplication: return canvas: map canvas: rtype: QgsMapCanvas: return iface: Lazımi metod çağırışlarına giriş verən bir saxta interfeys: rtype: QgisInterface "" "gui_flag = True # All test qgis-i gui rejimində çalıştıracaq qgis_app = QgsApplication (sys.argv, gui_flag) prefix_path = config.qgis_prefix_path () qgis_app.setPrefixPath (prefix_path, True) qgis_app.initQgis () QCoreApplication.setNApp'App (App) QGIS2 ') # parent = QWidget () # canvas = QgsMapCanvas (parent) # canvas.resize (QSize (400, 400)) canvas = MyMapCanvas () iface = QgisInterface (canvas) return qgis_app, canvas, iface #noinspection PyMethodMayBeStatic, PyP class QgisInterface (QObject): "" "QGIS obyektlərini və funksiyalarını plaginlərə məruz qoyma sinfi. Bu sinif yalnız vahid testlərini aparmağımızı təmin etmək üçün buradadır, buna görə əksər metodlar sadəcə stub. "" "currentLayerChanged = pyqtSignal (QgsMapCanvasLayer) def __init __ (self, canvas):" "" Constructor: param canvas: "" "QObject .__ init __ (self) self.canvas = canvas self.legend_interface = MyLegendInterface () self._ Yoxdur # Qatlar # əlavə edildikdə QGIS davranışını təqlid edə biləcəyimiz üçün yuvalar qurun. .instance (). layerWasAdded.connect (self.addLayer) # noinspection PyArgumentList QgsMapLayerRegistry.instance (). removeAll.connect (self.removeAllLayers) # emal modulu üçün self.destCrs = Yox @pyqtSlot ('QgsMapLay) , qat): "" "Qeydlərə əlavə olunan bir təbəqəni kətanda görünməsi üçün idarə edin. : param qat: siyahı əlavə edilmiş xəritə qatlarının siyahısı ... qeyd: QgsInterface api-də bu metod daxil deyil, burada testi asanlaşdırmaq üçün köməkçi olaraq əlavə olunur ... qeyd: addLayer metodu QGIS 1.8-də köhnəlmişdi, bu üsula çox ehtiyac duymamalısınız. "" "# bu yaxınlarda əlavə edilmiş qatı aktiv olaraq təyin etdi # LOGGER.debug ('Əvvəl Qat Sayısı:% s'% len (self.canvas.layers ())) current_layers = self.canvas.layers () final_layers = [] + current_layers final_layers.append (QgsMapCanvasLayer (qat)) self.canvas.setLayerSet (final_layers) self.active_layer = layer @pyqtSlot () def removeAllLayers (self): "" "Səthləri silinmədən əvvəl kətandan çıxarın." "" self .canvas.setLayerSet ([]) def newProject (self): "" "Yeni layihə yaradın." "" # noinspection PyArgumentList QgsMapLayerRegistry.instance (). removeAllMapLayers () def legendInterface (self): "" "Əfsanəni əldə edin." "" return self.legend_interface def activeLayer (self): "" "İşarəçini aktiv təbəqəyə gətirin (əfsanədə seçilmiş təbəqə)." "" self.active_layer def setActiveLayer (self, layer): "" "Verilmiş olanı seçin aktiv olaraq təbəqə. : param qat: Aktiv olaraq təyin olunacaq qat: type layer: QgsMapLayer "" "self.active_layer = layer class actionAddFeature (object): def __init __ (self): pass def trigger (self): pass class actionZoomToLayer (object): def __init __ (self): pass def trigger (self): pass # ---------------- QgsInterface üçün API Mock aşağıdakı --------------- ---- def zoomFull (self): "" "Xəritəni tam ölçüdə böyüdün." "" def zoomToPrevious keçin (self): "" "Əvvəlki baxış dərəcəsinə yaxınlaşdırın." "" def zoomToNext (self) keçin: " "" Növbəti baxış dərəcəsinə qədər böyüdün. "" "Def zoomToActiveLayer (özünü) keçin:" "" Aktiv təbəqənin dərəcəsinə qədər böyüdün. "" "Def addVectorLayer (özünü, yol, baza_adı, provayder_ açarı):" "" Bir vektor əlavə edin. qat. : param yolu: təbəqəyə yol. : type path: str: param base_name: qat üçün əsas ad. : type base_name: str: param provider_key: Provayder açarı məs. 'ogr': type provider_key: str "" "pass def addRasterLayer (self, path, base_name):" "" Raster layer layneri verilmiş bir raster layer əlavə et: param path: Lay qat. : type path: str: param base_name: qat üçün əsas ad. : type base_name: str "" "pass def addToolBarIcon (self, action):" "" Plugins toolbar-a icon əlavə edin. : param action: Alətlər çubuğuna əlavə etmək üçün hərəkət. : type action: QAction "" "pass def removeToolBarIcon (self, action):" "" Plugin toolbar-dan bir fəaliyyət (icon) silin. : param action: Alətlər çubuğuna əlavə etmək üçün hərəkət. : type action: QAction "" "pass def addToolBar (self, name):" "" Belirtilen adla araç çubuğu əlavə edin. : param adı: alətlər panelinin adı. : növü adı: str "" "pass def mapCanvas (özünü):" "" bir göstəricini xəritə kətanına qaytarın. "" "self.canvas def mainWindow (self):" "" bir göstəricini əsas pəncərəyə qaytarın. QGIS halında QgisApp nümunəsini qaytarır. "" "pass def addDockWidget (self, area, dock_widget):" "" Əsas pəncərəyə dok widget əlavə edin. : param sahəsi: UI-nin olduğu yerə dok qoyulmalıdır. : növü sahəsi:: param dock_widget: Arayüzə əlavə etmək üçün dok widgetı. : type dock_widget: QDockWidget "" "pass class MyLegendInterface (object): def __init __ (self): self.layer_visibility = {} def setLayerVisible (self, layer, yes_no): self.layer_visibility [layer.name ()] = yes_no def isLayerVisible (self, layer): try: return self.layer_visibility [layer.name ()] xaricində KeyError: print ('Layer {} hələ təyin edilməyib (daxilində) görünmür.'. format (layer.name ())) False class MyMapCanvas (object) return: def __init __ (self): self.layer_set = [] def layer (self): return self.layer_set def layer (self, index): layer = self.layer_set [index] .layer () return layer def setLayerSet (self, layer_set): self.layer_set = layer_set def layerCount (self): return len (self.layer_set)

QGIS və quraşdırılmış bir plaginlə qarşılıqlı əlaqəni indi yoxlamaq / istifadə etmək istəyirsinizsə, aşağıdakıları edin (unittest setUp məs.):

qgis_app, canvas, iface = set_up_interface () plugin_name = 'openlayers_plugin' utils.plugin_paths = [os.path.expanduser ('~ / .qgis2 / python / plugins')] utils.updateAvailablePlugins () utils.loadPlugin (yük). iface = self.iface utils.startPlugin (plugin_name)

Vahid test QGIS tətbiqlərində daha çox istifadə nümunəsi və bəzi real həyat nümunələri üçün github səhifəmizə baxa bilərsiniz (https://github.com/UdK-VPT/Open_eQuarter/tree/master/mole). Qovluq testlər bütün vahid testlərini ehtiva edir (bunlar əsasən qgisinteraction paketindəki modulları əks etdirən, point_sampling_tool-plugin ilə qarşılıqlı əlaqədə olan modulları yoxlayır).


Videoya baxın: QGIS Tutorial: How to install OpenLayers Plugin in QGIS 3 EN (Oktyabr 2021).