problema con fid durante "fusione attributi elemento" tra diverse geometrie

160 views
Skip to first unread message

Francesco Carbone

unread,
Sep 20, 2023, 2:15:45 AM9/20/23
to QGIS_Utenti_FVG
Buongiorno, sono Francesco Carbone dipendente del Comune di Udine
mi sono approcciato da circa 3 anni al mondo QGis provenendo da Geomedia
stiamo migrando il PRGC da Geomedia a QGis e per copiare gli attributi di tutte le geometrie esistenti che presentano dei problemi di integrità topologica (zonizzazione spostata rispetto alla base catastale più recente) sto utilizzando la funzione di fusione degli attributi tra diverse geometrie; nello specifico selezionando e copiando le vecchie geometrie e fondendo gli attributi con le nuove. In questo modo conservo tutti i campi (posizione etichetta compresa) delle vecchie geometrie che vengono incollati sulle nuove
In fase di fusione, dopo aver selezionato la riga da prendere come esempio per la copia degli attributi, l'attributo fid non viene saltato automaticamente e crea problemi in fase di salvataggio del livello.
Questo comporta una serie di errori in fase di salvataggio e conseguente perdita del lavoro di editing
Unica soluzione: selezionare in alto in corrispondenza della colonna fid la voce "salta l'attributo". a quel punto l'fid viene mantenuto ed è possibile salvare il layer
Fin qui tutto regolare e verrebbe da pensare che basta fare il salta attributo alla colonna fid manualmente
Però non ho ben capito come mai sul PC della collega alla fusione il campo fid viene applicato automaticamente il "salta l'attributo" mentre nel mio no e devo selezionarlo a mano
Stessa versione 3.22. provato anche con 3.28 con stesso problema

I campi fid hanno formato (che cambia in funzione della versione di QGis con cui si apre lo stesso file): 
qlonglong nella 3.22
3.22.png
 intero 64 bit nella 3.28 
3.28.png

errore: Impossibile applicare le modifiche al vettore ZONE_OMOGENEE_Territorio

Errori: ERRORE: 1 modifica al valore attributo non applicato.

Errori della sorgente dati:

La modifica dell'identificativo elemento dell'elemento 2460 non è consentita.


Grazie a tutti


Daniele

unread,
Sep 21, 2023, 10:22:51 AM9/21/23
to QGIS_Utenti_FVG
Buongiorno Francesco,
mi fa piacere sapere che state migrando da una piattaforma GIS proprietaria ad una open-source e spero che ne apprezzerete ben presto i vantaggi.
Premesso che non mi ricordo di avere mai utilizzato la funzione di fusione degli attributi tra diverse geometrie, se puo esserti utile riporto di seguito alcune funzioni o strumenti che potrebbero fare al tuo caso:
- Barra degli strumenti di digitalizzazione avanzata ->  Icona Fondi gli attrinuti degli elementi selezionati
Riporto dal manuale di QGIS : "Lo strumento mergeFeatureAttributes Unire gli attributi degli elementi selezionati ti consente di applicare gli stessi attributi agli elementi senza fondere i loro confini. La finestra di dialogo è la stessa del precedente strumento Unisci gli elementi selezionati ma a differenza di quello strumento, gli oggetti selezionati vengono mantenuti con la loro geometria mentre alcuni dei loro attributi vengono resi identici."
Non ho trovato in rete altre informazioni di dettaglio su tale strumento.
- Processing -> Strumenti -> Aggrega 
Questo algoritmo prende un layer vettore o tabella e aggrega gli elementi basandosi su raggruppamento tramite un'espressione. Elementi per i quali l'espressione restituisce valori uguali sono raggruppati. È possible raggruppare tutti gli elementi sorgenti usando un valore costante come raggruppamento per parametro, ad esempio tutti quelli con valore: NULL. È possible raggruppare elementi sorgenti assieme usando la funzione Array, esempio: Array("Campo1", "Campo2"). Le geometrie (se presenti) sono combinate in una geometria multiparte per ogni gruppo, gli elementi in uscita sono calcolati in dipendenza di ogni definizione aggregativa data.
- Selezionare il layer -> Proprietà ->Join -> + 

Il comportamento diverso di "Salta attributo" tra due PC potrebbe dipendere da qualche errore presente nel profilo utente, per cui prova a cancellare quello sul PC problematico e a creare uno nuovo e vedi se il difetto si ripresenta.
Un'altro aspetto da considerare è il formato vettoriale utilizzato per i layer, shapefile, geopackage o altro, in quanto mi pare che nei geopackage i campi FID sono riservati alla chiave primaria (come mi pare in tutti i database basati su SQLite) per cui andrebbero gestiti con i comandi SQL, ma posso sbagliarmi :-)

Francesco Carbone

unread,
Sep 21, 2023, 11:00:13 AM9/21/23
to QGIS_Utenti_FVG
Buongiorno Daniele, ti ringrazio per le segnalazioni
ho provato a creare un nuovo profilo e operare da quello, ma il salto attributo fid "automatico" non viene applicato neanche così. probabilmente è un errore di installazione. Mi sto abituando a farlo manualmente... 
L'operazione che stiamo facendo consiste nel prendere le geometrie dal catastale, unirle e spezzarle per ottenere geometrie analoghe al PRGC vigente, e in ultimo prenderne gli attributi alla geometria precedente con un copia e incolla da layer diversi e successivamente con l'unione degli attributi. Un grande lavoro ma necessario a ottenere delle geometrie topologicamente allineate alla nuova base catastale.
Il grosso del lavoro consiste nel recuperare le geometrie dal nuovo catastale e replicarne la zonizzazione dal vigente, e purtroppo non credo si riesca ad automatizzarla più di tanto
Già il copia e incolla da diversi layer, che non esisteva in Geomedia, mi sta aiutando moltissimo
Ora studio e verifico se riesco a semplificare la fase dell'unione degli attributi con i metodi che mi hai segnalato

Ti ringrazio infinitamente
Saluti

Pietro Rossin

unread,
Sep 21, 2023, 11:31:47 AM9/21/23
to Francesco Carbone, QGIS_Utenti_FVG
Scusa Francesco, su che tipo di dato stai lavorando? Shp, geopackage, geodb, altro?

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "QGIS_Utenti_FVG" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a qgis_utenti_f...@googlegroups.com.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/qgis_utenti_fvg/c3843f9a-63d3-42c6-89a1-40d01c281f3an%40googlegroups.com.

Francesco Carbone

unread,
Sep 21, 2023, 11:40:58 AM9/21/23
to QGIS_Utenti_FVG
geopackage

Francesco Carbone

unread,
Sep 21, 2023, 11:41:53 AM9/21/23
to QGIS_Utenti_FVG
credo di avere un problema sul fid perchè mi da errore anche con la funzione "unisci attributo per posizione"....

Francesco Carbone

unread,
Sep 21, 2023, 11:45:10 AM9/21/23
to QGIS_Utenti_FVG
mi restituisce questo errore

l'attributo "fid": Valore "Genera automaticamente" non è un numero

Impossibile scrivere l'elemento


Pietro Rossin

unread,
Sep 21, 2023, 11:58:49 AM9/21/23
to Francesco Carbone, QGIS_Utenti_FVG
Mhh..
Non conosco bene gpkg ma mi sembra non abbia molte funzioni geospaziali.
Non ti converrebbe utilizzare un geodb più carrozzato?
Ottimo sarebbe postgis ma forse ce la fai anche con spatialite (cambia la sintassi SQL).
Carichi il nuovo layer (n) e quello precedente (p) e usi delle query di update utilizzando come collegamento tra i due layer delle relazioni che si basano su funzioni tipo st_contains(n.geom, p.geom)
Magari con un layer poligonale (n) che contiene i centroidi del secondo layer(p)  con una sintassi tipo
st_contains(n.geom, st_centroid(p.geom)).
O altre funzioni di prossimità tra quelle che trovi al capitolo 7.11.1. Topological Relationships del manuale di postgis (o equivalente di altri geodb equivalenti)..
Pietro

Francesco Carbone

unread,
Sep 22, 2023, 1:59:04 AM9/22/23
to QGIS_Utenti_FVG
Grazie Pietro
la mia conoscenza di postgis è molto limitata, così come il linguaggio di programmazione 
a breve frequenterò un corso su postgis e sarà l'occasione giusta per approfondire
Seguo la tua proposta ma fatico a realizzare la sintassi perché mi mancano le basi....
saluti

Rossin Pietro

unread,
Sep 22, 2023, 4:11:30 AM9/22/23
to Francesco Carbone, QGIS_Utenti_FVG

Ciao

Postgis è uno strumento molto potente, il linguaggio è un dialetto SQL (postgresql) con funzioni tipiche introdotte da postgis.

A me ha completamente cambiato il modo di lavorare in GIS, velocizzando brutalmente alcune attività di codifica che prima potevano essere macchinose e spesso portavano a crash di qgis soprattutto se lavoravo su grosse moli dati..

 

Le “Topological Relationships” di Postgis sono l’omologo delle funzioni del “seleziona per posizione” di qgis, solo che dal mio punto di vista sono molto più customizzabili, ti permettono di lavorare su moli enormi di dati in un colpo e ti evitano di generare una pletora di file temporanei che sono error-prone.

 

Ti faccio un esempio che potrebbe adattarsi ai “fid” del tuo caso.

 

Hai una serie di poligoni in una tabella di geodb postgis (per comodità postgis dato che è quello che conosco di più) ed una serie di altri poligoni in una tabella sempre postgis.

La prima serie è una tabella “nuova” del geodb con la colonna geom (geometria) ed un campo vuoto, chiamiamolo “fid_nuovo”, la seconda “vecchia” è sempre una tabella di geometrie, con colonna geom (diversa da quella della tabella nuova) e campo “fid_vecchio”. Mettiamo per comodità che le geometrie delle due tabelle siano con lo stesso SRID.

 

Tu vuoi popolare il campo “fid_nuovo” coi valori presi dal campo “fid_vecchio” usando una funzione topologica di contenimento, meglio se fatta su centroide della geometria “vecchia”, ma puoi fare viceversa, vedi tu.

 

In postgis la funzione che ti lega spazialmente per contenimento le due tabelle è st_contains(geom-a, geom-b)

https://postgis.net/docs/ST_Contains.html

ovvero la condizione topologica che verifica il legame è “geometria-a contiene geometria-b”

 

la funzione che data una geometria ti ritorna il relativo centroide è st_centroid(geom)

https://postgis.net/docs/ST_Centroid.html

 

una possibile sintassi in postgis (ve ne sono tante differenti) che mette in relazione le due tabelle rispetto alle posizioni reciproche delle geometrie è

 

SELECT vecchia. fid_vecchio, nuova. fid_nuovo

FROM

vecchia, nuova

WHERE

St_contains(nuova.geom, st_centroid(vecchia.geom))

 

Ovvero

Seleziona il campo fid_vecchio dalla tabella vecchia, seleziona il campo fid_nuovo dalla tabella nuova

Nei casi in cui

La geometria nella tabella vecchia contiene la geometria della tabella nuova (trasformata al volo in centroide).

 

Ti uscirà un listato di fid_nuovi senza valore con di fianco i corrispettivi fid_vecchi (si spera in rapporto 1:1 ma non è detto, dato che un centroide di una feature non necessariamente cade dentro la feature omologa/adiacente… puoi provare a ricorrere ad altre funzioni di trasformazione, come

https://postgis.net/docs/ST_PointOnSurface.html

https://postgis.net/docs/ST_GeometricMedian.html

ecc ecc)

 

A questo punto se il rapporto è 1:1 puoi fare

 

UPDATE nuova

SET

fid_nuovo= fid_vecchio

FROM

vecchia

WHERE

St_contains(nuova.geom, st_centroid(vecchia.geom))

 

Ovvero

Aggiorna la tabella nuova

Popola il campo fid_nuovo di modo che sia uguale a fid_vecchio

Preso dalla tabella vecchia

Solo nel caso in cui la geometria della tabella nuova contiene il centroide della geometria della tabella vecchia.

 

Naturalmente il tipo di dati del campo fid_nuovo deve poter contenere i dati del campo fid_vecchio

Esempio

Fid_nuovo è integer (intero), fid_vecchio ti sembra sia integer (contiene numeri interi) ma è memorizzato in un campo testo.

Postgis non ti permette di fare il travaso e darà errore (integer non può contenere testo)

 

In questo caso farò un “cast”

 

UPDATE nuova

SET

fid_nuovo= fid_vecchio::integer

FROM

vecchia

WHERE

St_contains(nuova.geom, st_centroid(vecchia.geom))

 

:: vuol dire “cosideralo come”

fid_vecchio::integer considera fid_vecchio come intero, anche se è in una colonna testo

 

https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-cast/

 

 

Metti il caso in cui gli SRID differiscano e che la tua tabella vecchia sia in 4326 (WGS84 lat/long) e la tua tabella nuova sia in 32633 (UTM33N/WGS84),

si possono riproiettare al volo le geometrie con la funzione st_transform(geom, srid)

https://postgis.net/docs/ST_Transform.html

 

la sintassi sarà

 

UPDATE nuova

SET

fid_nuovo= fid_vecchio::integer

FROM

vecchia

WHERE

St_contains(nuova.geom, st_transform(st_centroid(vecchia.geom),32633))

 

Ovvero

Aggiorna la tabella nuova

Fai sì che fid_nuovo sia uguale a fid_vecchio (considerato come intero)

Preso da vecchia

Nel caso in cui

La geometria nuova (32633) contiene il centroide della geometria vecchia (4326) riproiettato al volo in 32633

Conviene riproiettare il centroide e non il poligono per questioni di uso di risorse computazionali (riproiettare 1 punto “costa meno” che riproiettare n vertici)

 

Puoi lavorare per sottoinsiemi.

Metti che un centroide della tabella vecchia sia contenuto in più di un poligono della nuova, il fid_vecchio sarà presente “n” volte nel primo listato

 

Puoi fare una sottoquery (o query annidata) che seleziona solamente i fid_vecchi che sono presenti una sola volta (rapporto 1:1)

 

Select fid_vecchio FROM (

SELECT vecchia. fid_vecchio, count(vecchia. fid_vecchio) as conteggio_vecchi

FROM

vecchia, nuova

WHERE

St_contains(nuova.geom, st_centroid(vecchia.geom))

GROUP BY vecchia. fid_vecchio

) as sottoquery

Where conteggio_vecchi=1

 

Ovvero seleziona la lista dei fid_vecchi contati una sola volta quando rapportati alle geometrie nuove.

 

Questa la usi come sottoquery nella query di aggiornamento

 

UPDATE nuova

SET

fid_nuovo= fid_vecchio::integer

FROM

vecchia

WHERE

-- condizione 1, sottoquery

fid_vecchio in(

Select fid_vecchio FROM (

SELECT vecchia. fid_vecchio, count(vecchia. fid_vecchio) as conteggio_vecchi

FROM

vecchia, nuova

WHERE

St_contains(nuova.geom, st_centroid(vecchia.geom))

GROUP BY vecchia. fid_vecchio

) as sottoquery

Where conteggio_vecchi=1

)

AND

-- Condizione 2, contenimento

St_contains(nuova.geom, st_centroid(vecchia.geom))

 

Ovvero mi aggiorni come sopra usando due condizioni:

1: I fid_vecchi sono compresi in un insieme di fid_vecchi contati una sola volta (sottoquery)

E

2: le geometrie vecchie (intese come centroide) sono contenute nei poligoni delle geometrie nuove

 

Fatto l’update ti potranno rimanere tot geometrie nuove senza fid_nuovo popolato, ti concentrerai solo su queste per vedere come fare a ricavare i corrispettivi fid_vecchi.

Potrai ad esempio traslare i centroidi delle geometrie vecchie di tot se vedi che lo spostamento del centroide del vecchio è costante rispetto ai poligoni nuovi.

 

Ad esempio con ST_Translate(geometry g1, float deltax, float deltay)

https://postgis.net/docs/ST_Translate.html

 

Metti che le differenze siano di 50m in x e 100 in Y costanti

 

UPDATE nuova

SET

fid_nuovo= fid_vecchio

FROM

vecchia

WHERE

fid_nuovo is NULL

AND

St_contains(nuova.geom, st_translate(st_centroid(vecchia.geom)), 50, 100)

 

Ovvero

Aggiorna fid_nuovo della tabella nuova copiando i valori del fid_vecchio della tabella vecchia

Solo nel caso in cui fid_nuovo non sia già stato popolato precedentemente (fid_nuovo is NULL)

E

La geometria del nuovo contiene il centroide della geometria vecchia spostato di 50m in X e 100 in Y

 

Anyway, questi sono esempi base sulle potenzialità dello strumento, le ho messe lì per far venire un po’ di gola ;)

Due tabelle postgis, nuova e vecchia, nessun passaggio intermedio, fine delle tabelle/shp file temporanei in giro per i dischi.

Aggiornamento di N campi al volo, nell’esempio uno solo ma puoi usarne quanti vuoi

SET nuovo_1= vecchio_1, nuovo_2= vecchio_2, nuovo_n= vecchio_n

Eseguibili su moli di dati enormi

Stratificabili per area (metti ad esempio di introdurre un’ulteriore sottoquery che restringe le operazioni a singoli comuni, presenti in una terza tabella postgis) o per tipologia di copertura del suolo (sottoquery sul Corine Land Cover) ecc ecc

Query di testo salvabili e ripetibili secondo necessità..

Per me Game Changer

 

Buon corso ;)

Pietro

P.S.

L’SQL qui sopra può aver errori, non l’ho eseguito quindi non so se c’è qualche refuso, ma indicativamente dovrebbe essere corretto

 

 

 

Da: qgis_ut...@googlegroups.com <qgis_ut...@googlegroups.com> Per conto di Francesco Carbone
Inviato: venerdì 22 settembre 2023 07:59
A: QGIS_Utenti_FVG <qgis_ut...@googlegroups.com>
Oggetto: Re: [qgis_utenti_fvg:578] Re: problema con fid durante "fusione attributi elemento" tra diverse geometrie


AVVISO DI RISERVATEZZA Informazioni riservate possono essere contenute nel messaggio o nei suoi allegati. Se non siete i destinatari indicati nel messaggio, o responsabili per la sua consegna alla persona, o se avete ricevuto il messaggio per errore, siete pregati di non trascriverlo, copiarlo o inviarlo ad alcuno. In tal caso vi invitiamo a cancellare il messaggio ed i suoi allegati. Grazie.
CONFIDENTIALITY NOTICE Confidential information may be contained in this message or in its attachments. If you are not the addressee indicated in this message, or responsible for message delivering to that person, or if you have received this message in error, you may not transcribe, copy or deliver this message to anyone. In that case, you should delete this message and its attachments. Thank you.

Francesco Carbone

unread,
Sep 22, 2023, 5:38:16 AM9/22/23
to QGIS_Utenti_FVG
Super, se lo scopo era quello di farmi venire gola di postgis lo hai raggiunto alla grande....
ora devo solo studiare
in effetti le potenzialità sono infinite, ci vuole solo conoscenza e fantasia
Grazie per tutti i preziosissimi suggerimenti
saluti
Reply all
Reply to author
Forward
0 new messages