Laden Sie den Composer programmgesteuert aus der Vorlage und erstellen Sie mit PyQGIS einen Atlas


10

Ich versuche, ein Plugin zu erstellen, um einen Druckkomponisten aus einer Datei zu laden, einen Atlas zu generieren und in ein Bild zu exportieren. Bisher konnte ich die Vorlage erfolgreich laden und in ein Bild exportieren.

Ich konnte keine der Ebenen in der Legende (die sich auch im toc befinden) zur exportierten Karte hinzufügen, was dazu führt, dass eine leere Karte und keiner der Feldausdrücke funktioniert.

    # Get layers in the legend and append, must be a cleaner way to do this?
    layers = self.iface.legendInterface().layers()
    layerStringList = []
    for layer in layers:
        layerID = layer.id()
        layerStringList.append(layerID)

    # Add layer to map render
    myMapRenderer = QgsMapRenderer()
    myMapRenderer.setLayerSet(layerStringList)
    myMapRenderer.setProjectionsEnabled(False)

    # Load template
    myComposition = QgsComposition(myMapRenderer)
    myFile = os.path.join(os.path.dirname(__file__), 'MMR_Template.qpt')
    myTemplateFile = file(myFile, 'rt')
    myTemplateContent = myTemplateFile.read()
    myTemplateFile.close()
    myDocument = QDomDocument()
    myDocument.setContent(myTemplateContent)
    myComposition.loadFromTemplate(myDocument)

    # Save image
    myImagePath = os.path.join(os.path.dirname(__file__), 'come_on.png')
    myImage = myComposition.printPageAsRaster(0)
    myImage.save(myImagePath)

Hier ist ein Ausschnitt aus der geladenen Vorlage, mit dem der Atlas eingerichtet werden soll:

 <Atlas hideCoverage="false" featureFilter="reference = '61922'"    coverageLayer="desktop_search20130615160118593" fixedScale="true" composerMap="0" singleFile="false" filenamePattern="&quot;reference&quot;" enabled="true" filterFeatures="true" sortFeatures="true" sortKey="0" sortAscending="true" margin="1"/>

Ich bin mir auch nicht sicher, wie ich die gesamte Ebene im toc am besten zur Instanz von QgsMapRenderer () hinzufügen kann.

Vielen Dank

Antworten:


18

Wenn jemand hier interessiert ist, ist der Code, mit dem ich gelandet bin. Dadurch werden bestimmte Ebenen im Inhaltsverzeichnis (aus einer Liste von Ebenen) aktiviert / deaktiviert, eine ausgewählte Composer-Vorlage aus einer Datei geladen, ein Atlas erstellt und die Karte exportiert. Zum Schluss wird das Inhaltsverzeichnis wieder in den ursprünglichen Zustand versetzt.

def sort_toc(self):

    # Turn on/off layers as required by search type
    legend = self.iface.legendInterface()
    layers = legend.layers()
    wanted_layers = metal_wanted
    global turn_on, turn_off, atlas_desktop
    turn_off = []
    turn_on = []
    all_layers = []
    for layer in layers:
        layername = layer.name()
        all_layers.append(layername)
        layerid = layer.id()
        if layername == "desktop_search":
            atlas_desktop = layer
        if layername in wanted_layers and legend.isLayerVisible(layer) is False:
            turn_off.append(layer)
            legend.setLayerVisible(layer, True)
        if layername not in wanted_layers and legend.isLayerVisible(layer) is True:
            turn_on.append(layer)
            legend.setLayerVisible(layer, False)
        else:
            pass

    # Checks for required layers missing from map file
    for layer in wanted_layers:
        missing = []
        if layer not in all_layers:
            missing.append(layer)
        else:
            pass
    if not missing:
        pass
    else:
        QMessageBox.warning(self.iface.mainWindow(), "Missing layers", "Required layers are missing from your map file. Details: %s" % (str(missing)))
    return atlas_desktop

def quick_export(self, ref, stype, scale):

    # Add all layers in map canvas to render
    myMapRenderer = self.iface.mapCanvas().mapRenderer()

    # Load template from file
    myComposition = QgsComposition(myMapRenderer)
    myFile = os.path.join(os.path.dirname(__file__), 'MMR_Template.qpt')
    myTemplateFile = file(myFile, 'rt')
    myTemplateContent = myTemplateFile.read()
    myTemplateFile.close()
    myDocument = QDomDocument()
    myDocument.setContent(myTemplateContent)
    myComposition.loadFromTemplate(myDocument)

    # Get map composition and define scale
    myAtlasMap = myComposition.getComposerMapById(0)
    myAtlasMap.setNewScale(int(scale))

    # Setup Atlas
    myAtlas = QgsAtlasComposition(myComposition)
    myAtlas.setCoverageLayer(atlas_desktop) # Atlas run from desktop_search
    myAtlas.setComposerMap(myAtlasMap)
    myAtlas.setFixedScale(True)
    myAtlas.fixedScale()
    myAtlas.setHideCoverage(False)
    myAtlas.setFilterFeatures(True)
    myAtlas.setFeatureFilter("reference = '%s'" % (str(ref)))
    myAtlas.setFilterFeatures(True)

    # Generate atlas
    myAtlas.beginRender()
    for i in range(0, myAtlas.numFeatures()):
        myAtlas.prepareForFeature( i )
        jobs = r"\\MSUKSERVER\BusinessMan Docs\Jobs"
        job_fol = os.path.join(jobs, str(ref))
        output_jpeg = os.path.join(job_fol, ref + "_BMS_plan.jpg")
        myImage = myComposition.printPageAsRaster(0)
        myImage.save(output_jpeg)
    myAtlas.endRender()

def return_toc(self):

    # Revert layers back to pre-script state (on/off)
    legend = self.iface.legendInterface()
    for wanted in turn_on:
        legend.setLayerVisible(wanted, True)
    for unwanted in turn_off:
        legend.setLayerVisible(unwanted, False)

Können Sie Verwendungsbeispiele für die verschiedenen von Ihnen erstellten Funktionen freigeben? Ist das alles in der QGIS Python Console?
Raphael

@raphael Ich habe dieses Plugin vor einiger Zeit erstellt, aber ich werde versuchen, ein Beispiel herauszufinden.
Matt

Vielen Dank, Matt, dass du das mit uns geteilt hast. Ist es möglich, ein Anwendungsbeispiel für diese Funktionen zu erhalten? Danke vielmals ! Grüße, Nathan
Nat Lebo

2

Vielleicht kann dies bei Ihnen funktionieren, um alle aktuellen Ebenen zu erhalten:

registry = QgsMapLayerRegistry.instance()
layers = registry.mapLayers().values()

Ah, Ihr Weg, um alle Ebenen zu bekommen, sollte tatsächlich funktionieren
Akbargumbira
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.