Mer

Skriv ut komponistkart med tabell ved hjelp av PyQGIS


Jeg leter etter en måte å skrive ut et egendefinert funksjonsskjema opprettet i PyQt Designer for QGIS 2.4 ved hjelp av PyQGIS. Målet mitt er å skrive ut/lagre bildet som gjeldende omfang av kartet med den valgte funksjonens attributter av interesse på samme side.

Jeg eksperimenterer med to forskjellige måter:

Først er det å bruke QgsComposition og QPrinter for å legge til og skrive ut elementer til en pdf: inkludert kart, forklaring og attributter. Problemet mitt her er å få de eneste ønskede attributtene til å vise dynamisk endring avhengig av det aktive laget. Hvis jeg kunne legge til funksjonsskjemaet mitt som et kartelement, ville jeg vise attributtene som er lagt til i det egendefinerte skjemaet.

OPPDATERING: Følgende kode kan kanskje vise kartet mitt med en forklaring og en selektiv tabell, men jeg har fortsatt mange problemer med kartelementene (ingen tekst i tabellen, posisjonering, kan ikke bare inkludere ønsket lag i forklaring). Jeg har tatt med all koden som er knyttet til denne utskriftskomponisten:

layer = qgis.utils.iface.activeLayer () qgis.utils.iface.actionZoomToSelected (). trigger () qgis.utils.iface.mapCanvas (). zoomScale (1000) mapRenderer = iface.mapCanvas (). mapRenderer () c = QgsComposition (mapRenderer) c.setPlotStyle (QgsComposition.Print) x, y = 0, 0 w, h = c.paperWidth (), c.paperHeight () composerMap = QgsComposerMap (c, x, y, w*.75, h) c.addItem (composerMap) legend = QgsComposerLegend (c) c.addComposerLegend (legend) legend.model (). setLayerSet (mapRenderer.layerSet ()) legend.setTitle (") legendModel = QgsLegendModel (c) legendModel.setLayer [layer.id ()]) legend.updateLegend () selected_ids = [f.id () for f i layer.selectedFeatures ()] filter_id_string = ','. join ([str (id) for id i select_ids]) tabell = QgsComposerAttributeTable (c) table.setVectorLayer (layer) table.setMaximumNumberOfFeatures (20) table.setFeatureFilter ("id in (" + filter_id_string + ")") table.setFilterFeatures (True) table.setItemPosition (x + 50, y + 50 ) table.applyDefaultSize () col1 = QgsComposerTableColumn () col1.setAt tribute ('Diametre') col2 = QgsComposerTableColumn () col2.setAttribute ('Nature') table.setColumns ([col1, col2]) c.addItem (tabell) skriver = QPrinter () printer.setOutputFormat (QPrinter.PdfFormat) skriver. setOutputFileName ('out.pdf') printer.setPaperSize (QSizeF (c.paperWidth (), c.paperHeight ()), QPrinter.Millimeter) printer.setFullPage (True) printer.setColorMode (QPrinter.Color) printer.setResolution (c) .printResolution ()) pdfPainter = QPainter (skriver) paperRectMM = printer.pageRect (QPrinter.Millimeter) paperRectPixel = printer.pageRect (QPrinter.DevicePixel) c.render (pdfPainter, paperRectPixel, paperRectMM) pdfPainter.

For det andre er å legge inn et bilde av gjeldende omfang (ved hjelp av mapCanvas (). SaveasImage ()) ved hjelp av et dynamisk QPixMap -element på det egendefinerte skjemaet. Dette bringer meg tilbake til det samme spørsmålet om hvorvidt det egendefinerte funksjonsskjemaet kan skrives ut (til pdf og til slutt papir).


Hvilken versjon av QGIS bruker du? Hvis det er 2,4, kan du angi kolonnene som vises i en QgsComposerAttributeTable ved å bruke setColumns -metoden. Denne metoden tar en liste over QgsComposerTableColumn. Her er et eksempel

#create en komposisjon og komponistattributtabelsammensetning = QgsComposition (iface.mapCanvas (). mapSettings ()) tabell = QgsComposerAttributeTable (komposisjon) #create columns for the table col1 = QgsComposerTableColumn () col1.setAttribute ('feature_id') col2 = QgsComposerT () col2.setAttribute ('feature_name') #set tabellkolonner table.setColumns ([col1, col2])

Det er en haug med andre ting du kan angi for kolonner, for eksempel overskrift, justering og sorteringsrekkefølge (se api -dokumenter her). Du kan til og med angi et uttrykk for en kolonne i stedet for attributtet for ekstra fleksibilitet.

edit: For å vise bare visse funksjoner kan du sette et filter på bordet:

table.setFeatureFilter ("id in (1,2,3)") table.setFilterFeatures (True)

Så for å filtrere en tabell til bare utvalgte funksjoner:

#get current layer current_layer = qgis.utils.iface.mapCanvas (). currentLayer () #get liste over utvalgte funksjons -IDer select_ids = [f.id () for f i current_layer.selectedFeatures ()] #konverter liste til streng filter_id_string = ','. join ([str (id) for id in selected_ids]) #filter table table.setFeatureFilter ("$ id in (" + filter_id_string + ")") table.setFilterFeatures (True)

oppdatering: Jeg savnet et tegn i filteruttrykket. Det burde ha vært "$ id in (...". Her er en komplett, fungerende versjon av koden du la ut. Det var noen få enkle feil (konstruktøren for QgsLegendModel tar ingen argumenter, det er ingen applyDefaultSize -metode for attributtabeller, og jeg ' ve har også flyttet attributtabellen setItemPosition line):

fra PyQt4.QtCore import * fra PyQt4.QtGui import * lag = qgis.utils.iface.activeLayer () qgis.utils.iface.actionZoomToSelected (). trigger () qgis.utils.iface.mapCanvas (). zoomScale (1000) mapRenderer = iface.mapCanvas (). mapRenderer () c = QgsComposition (mapRenderer) c.setPlotStyle (QgsComposition.Print) x, y = 0, 0 w, h = c.paperWidth (), c.paperHeight () composerMap = QgsComposerMap (c, x, y, w*.75, h) c.addItem (composerMap) legend = QgsComposerLegend (c) c.addComposerLegend (legend) legend.model (). setLayerSet (mapRenderer.layerSet ()) legend.setTitle ( ") legendModel = QgsLegendModel () legendModel.setLayerSet ([layer.id ()]) legend.updateLegend () selected_ids = [f.id () for f in layer.selectedFeatures ()] filter_id_string = ','. join ([ str (id) for id i selected_ids]) tabell = QgsComposerAttributeTable (c) table.setItemPosition (x+50, y+50) table.setVectorLayer (lag) table.setMaximumNumberOfFeatures (20) table.setFeatureFilter ("$ id in (" + filter_id_string + ")") table.setFilterFeatures (True) col1 = QgsComp oserTableColumn () col1.setAttribute ('Diametre') col1.setHeading ("Diametre") col2 = QgsComposerTableColumn () col2.setAttribute ('Nature') col2.setHeading ("Nature") table.setColumns ([col1, col2]) c.addItem (tabell) skriver = QPrinter () printer.setOutputFormat (QPrinter.PdfFormat) printer.setOutputFileName ('out.pdf') printer.setPaperSize (QSizeF (c.paperWidth (), c.paperHeight ()), QPrinter. Millimeter) printer.setFullPage (True) printer.setColorMode (QPrinter.Color) printer.setResolution (c.printResolution ()) pdfPainter = QPainter (skriver) paperRectMM = printer.pageRect (QPrinter.Millimeter) paperRectPixel = printer.pageRect (QP. DevicePixel) c.render (pdfPainter, paperRectPixel, paperRectMM) pdfPainter.end ()


Se videoen: QGIS Python PyQGIS - Calculate Field Values Field Calculator (September 2021).