pyqgis 3: stampa pdf di piu pagine con mappe centrate sui singoli punti del layer evidenziati.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

pyqgis 3: stampa pdf di piu pagine con mappe centrate sui singoli punti del layer evidenziati.

Ely Parker
salve, vediamo se qualcuno mi può aiutare visto che non sono riuscito a
trovare molta documentazione in proposito

ho scritto uno script che forse potrebbe anche essere utile a qualcuno 
se non altro a chi si accinge a programmare in qgis 3

dato un layer vettoriale , per ogni record del layer stampa una pagina
in un pdf, le pagine di questo pdf saranno dunque costituite da una
scritta con  l'id del record e dalla rappresentazione mappale dello stesso.

il record sarà centrato nella mappa.

per evidenziare il record (feature) nelle proprietà dei simboli del
layers i può fissare la regola di cambiamento simbolo con la funzione
'is_selected', in questo modo il simbolo centrale apparirà diverso .

QUI nasce il problema che non sono riuscito a risolvere, infatti se
provate lo script con un layer con molti punti vi accorgerete che ci
saranno mappa che presentano piu punti "selezionati"

in pratica il simbolo e la mappa stessa viene renderizzato  al momento
della creazione del pdf  per cui se metto la rimozione della selezione
all'interno della funzione che crea la pagina non mi cambierà il simbolo
nella mappa. mentre  se come ora metto l'istruzione di rimozione 
selezione dopo l'export , ovviamente avrò più punti selezionati
contemporaneamente.


quindi sperando che sia qualcuno che mi voglia/possa aiutare le domande
sono:

 1. esiste un API che mi permette on the fly di  cambiare un singolo
    punto  in una mappa da stampare?
 2. qualora la risposta sia negativa alla prima domanda, c'è un modo per
    renderizzare (intendo dire fissare l'immagine in quell'istante) la
    mappa dell'oggetto quando creo creo la pagina e il simbolo è
    selezionato/cambiato (con il trucco della regola)?

saluti

segue script:

#esempio di stampa mappa dei singoli features del  livello vettoriale
attivo  in un singolo pdf  con QGIS 3, by SC
#se dalle proprieta del layer  qgis viene impostato un simbolo distinto
associato alla funzione 'is_selected()' il l'oggetto centrale nella
mappa pdf finale sarà con quel simbolo
import os

p=QgsProject().instance()
layout = QgsPrintLayout(p)

def pagina(c,o):
     page=QgsLayoutItemPage(c)
     page.setPageSize("A4", QgsLayoutItemPage.Orientation.Portrait )
     c.pageCollection().addPage(page)


     label = QgsLayoutItemLabel(c)
     label.setText("mappa dell'oggetto " + str(o.id()))
     label.adjustSizeToText()
     label.attemptMove(QgsLayoutPoint(20,20),page=c.ZPage)
     label.setFrameEnabled(True)
     c.addLayoutItem(label)
     print (c.ZPage)

     #seleziona la feature per evidenziarla se sono fissate le regole
     livello.select(o.id())

     mappa=QgsLayoutItemMap(c)
     mappa.setFrameEnabled(True)

     mappa.attemptResize(QgsLayoutSize(100, 100))
     mappa.attemptMove(QgsLayoutPoint(20,50),page=c.ZPage)
     mappa.setFrameEnabled(True)
     aream=QgsRectangle()
areaoggetto=aream.fromCenterAndSize(o.geometry().centroid().asPoint(),50,50)
     areaoggetto.scale(1)
     mappa.setExtent(areaoggetto)
     c.addLayoutItem(mappa)

     #incrementare il ZPage ci permette di usarlo compe parametro page
negli attemptmove
     c.ZPage=c.ZPage+1


livello = iface.activeLayer()
features = livello.getFeatures()

for feature in features:
     pagina(layout,feature)


pdf_path = os.path.join(QgsProject.instance().homePath(), "output.pdf")
exporter = QgsLayoutExporter(layout)
exporter.exportToPdf(pdf_path, QgsLayoutExporter.PdfExportSettings())
livello.removeSelection()

#apre il pdf con l'applicazione associata su windows
os.startfile(pdf_path)


_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
796 iscritti al 28/12/2017