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

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)

Io metterei sia l’export in pdf che la rimozione selezione all’interno della funzione pagina(c,o). Ovviamente così si crea un file pdf per ogni record, quindi poi serve un programma esterno per unirli tutti in un unico pdf (o magari si può fare anche con python ma non saprei come).

···

Il 18/07/2019 17:36, SC ha scritto:

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)

_______________________________________________
QGIS-it-user mailing list
[QGIS-it-user@lists.osgeo.org](mailto:QGIS-it-user@lists.osgeo.org)
[https://lists.osgeo.org/mailman/listinfo/qgis-it-user](https://lists.osgeo.org/mailman/listinfo/qgis-it-user)


Alessandro Perego www.alspergis.altervista.org

no ,mi sembra un po poco elegante si perde in portatilità e in modularità ,certo messi alle strette si può fare in quel modo

però mi sembra strano che non ci sia una soluzione a livello di api

···

Il 18/07/2019 20:13, Alessandro Perego ha scritto:

Io metterei sia l’export in pdf che la rimozione selezione all’interno della funzione pagina(c,o). Ovviamente così si crea un file pdf per ogni record, quindi poi serve un programma esterno per unirli tutti in un unico pdf (o magari si può fare anche con python ma non saprei come).

Il 18/07/2019 17:36, SC ha scritto:

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)

_______________________________________________
QGIS-it-user mailing list
[QGIS-it-user@lists.osgeo.org](mailto:QGIS-it-user@lists.osgeo.org)
[https://lists.osgeo.org/mailman/listinfo/qgis-it-user](https://lists.osgeo.org/mailman/listinfo/qgis-it-user)


Alessandro Perego www.alspergis.altervista.org

_______________________________________________
QGIS-it-user mailing list
[QGIS-it-user@lists.osgeo.org](mailto:QGIS-it-user@lists.osgeo.org)
[https://lists.osgeo.org/mailman/listinfo/qgis-it-user](https://lists.osgeo.org/mailman/listinfo/qgis-it-user)

Scusate, ma usare l’atlante?

···

Il 18/07/2019 20:13, Alessandro Perego ha scritto:

Io metterei sia l’export in pdf che la rimozione selezione all’interno della funzione pagina(c,o). Ovviamente così si crea un file pdf per ogni record, quindi poi serve un programma esterno per unirli tutti in un unico pdf (o magari si può fare anche con python ma non saprei come).

Il 18/07/2019 17:36, SC ha scritto:

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)

_______________________________________________
QGIS-it-user mailing list
[QGIS-it-user@lists.osgeo.org](mailto:QGIS-it-user@lists.osgeo.org)
[https://lists.osgeo.org/mailman/listinfo/qgis-it-user](https://lists.osgeo.org/mailman/listinfo/qgis-it-user)


Alessandro Perego www.alspergis.altervista.org

_______________________________________________
QGIS-it-user mailing list
[QGIS-it-user@lists.osgeo.org](mailto:QGIS-it-user@lists.osgeo.org)
[https://lists.osgeo.org/mailman/listinfo/qgis-it-user](https://lists.osgeo.org/mailman/listinfo/qgis-it-user)

in che senso ? dici che si possono usare le api python per la gestione atlante? onestamente mai usate

Il 18/07/2019 20:33, Giuseppe Scardino ha scritto:

Scusate, ma usare l’atlante?

Il giorno 18 lug 2019, alle ore 20:32, SC <elyparker1@gmail.com <mailto:elyparker1@gmail.com>> ha scritto:

no ,mi sembra un po poco elegante si perde in portatilità e in modularità ,certo messi alle strette si può fare in quel modo

però mi sembra strano che non ci sia una soluzione a livello di api

Il 18/07/2019 20:13, Alessandro Perego ha scritto:

Io metterei sia l'export in pdf che la rimozione selezione all'interno della funzione pagina(c,o). Ovviamente così si crea un file pdf per ogni record, quindi poi serve un programma esterno per unirli tutti in un unico pdf (o magari si può fare anche con python ma non saprei come).

Buongiorno SC/elyparker1

concordo con Giuseppe Scardino, tutto questo si può fare con le funzioni ordinarie dell’atlante,…

  1. Layer vettoriale di punti => vettore di copertura
  2. stampare l’ID del record = label con espressione (in genere uso il campo id per assegnare il nome alla pagina e nella label stampo il nome pagina)
  3. evidenziare il record corrente = mi pare ci sia una nella scheda atlante, io in genere uso uno stile tramite regole impostando $feature = $atlas_feature

Ad ogni modo volendo usare pyqgis per pilotare l’atlas mi pare che documentazione ce ne sia a sufficienza
https://qgis.org/pyqgis/3.4/core/QgsLayoutAtlas.html?highlight=atlas#module-QgsLayoutAtlas

Amedeo Fadini

Il giorno gio 18 lug 2019 alle ore 21:57 SC <elyparker1@gmail.com> ha scritto:

in che senso ? dici che si possono usare le api python per la gestione atlante? onestamente mai usate

Il 18/07/2019 20:33, Giuseppe Scardino ha scritto:

Scusate, ma usare l’atlante?

Il giorno 18 lug 2019, alle ore 20:32, SC <elyparker1@gmail.com> ha scritto:

no ,mi sembra un po poco elegante si perde in portatilità e in modularità ,certo messi alle strette si può fare in quel modo

però mi sembra strano che non ci sia una soluzione a livello di api

Il 18/07/2019 20:13, Alessandro Perego ha scritto:

Io metterei sia l’export in pdf che la rimozione selezione all’interno della funzione pagina(c,o). Ovviamente così si crea un file pdf per ogni record, quindi poi serve un programma esterno per unirli tutti in un unico pdf (o magari si può fare anche con python ma non saprei come).


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

scusate forse ci stiamo equivocando, la mia intenzione non è quella di usare l'interfaccia , ma di risolvere un problema di programmazione per poi utilizzare il codice come voglio io eventualmente in un plugin etc

comunque usare la api di atlas può essere una buona idea
grazie del link

Il 19/07/2019 10:00, Amedeo Fadini ha scritto:

Buongiorno SC/elyparker1

concordo con Giuseppe Scardino, tutto questo si può fare con le funzioni ordinarie dell'atlante,...

1) Layer vettoriale di punti => vettore di copertura
2) stampare l'ID del record = label con espressione (in genere uso il campo id per assegnare il nome alla pagina e nella label stampo il nome pagina)
3) evidenziare il record corrente = mi pare ci sia una nella scheda atlante, io in genere uso uno stile tramite regole impostando $feature = $atlas_feature

Ad ogni modo volendo usare pyqgis per pilotare l'atlas mi pare che documentazione ce ne sia a sufficienza
https://qgis.org/pyqgis/3.4/core/QgsLayoutAtlas.html?highlight=atlas#module-QgsLayoutAtlas

Amedeo Fadini

Il giorno gio 18 lug 2019 alle ore 21:57 SC <elyparker1@gmail.com <mailto:elyparker1@gmail.com>> ha scritto:

    in che senso ? dici che si possono usare le api python per la
    gestione atlante? onestamente mai usate

    Il 18/07/2019 20:33, Giuseppe Scardino ha scritto:

    Scusate, ma usare l’atlante?

    Il giorno 18 lug 2019, alle ore 20:32, SC <elyparker1@gmail.com
    <mailto:elyparker1@gmail.com>> ha scritto:

    no ,mi sembra un po poco elegante si perde in portatilità e in
    modularità ,certo messi alle strette si può fare in quel modo

    però mi sembra strano che non ci sia una soluzione a livello di api

    Il 18/07/2019 20:13, Alessandro Perego ha scritto:

    Io metterei sia l'export in pdf che la rimozione selezione
    all'interno della funzione pagina(c,o). Ovviamente così si crea
    un file pdf per ogni record, quindi poi serve un programma
    esterno per unirli tutti in un unico pdf (o magari si può fare
    anche con python ma non saprei come).

    _______________________________________________
    QGIS-it-user mailing list
    QGIS-it-user@lists.osgeo.org <mailto:QGIS-it-user@lists.osgeo.org>
    https://lists.osgeo.org/mailman/listinfo/qgis-it-user