[Gfoss] inividuare record doppioni

a.furieri a lqt.it a.furieri a lqt.it
Lun 4 Nov 2013 09:49:33 CET


On Sun, 3 Nov 2013 23:06:11 -0800 (PST), Novarese wrote:
> Geo DrinX wrote/
>> SpatiaLite rimuove i duplicati come attributi alfanumerici
> /
>
>
> Ho capito, ma casualmente o sulla base di un qualche criterio?
>

Ciao Novarese,

l'idea di sviluppare tutta una nuova generazione di tools sw
interamente basati su criteri stocastici e' decisamente molto
interessante ... purtroppo per ora SpatiaLite ha un orizzonte
di riferimento molto  piu' angusto di tipo tradizionale, e
quindi le versioni attuali supportano esclusivamente algoritmi
rigidamente deterministici :-D


> Gentilmente provalo col seguente mini-shapefile, e facci sapere, 
> grazie:
> http://novarese.t15.org/gfoss/isole.zip
>

il tuo SHP contiene due features geometriche (sicilia e sardegna),
con un unico attributo informativo associato di tipo alfanumerico
che assume in entrambi i casi il medesimo valore = "isola".

dato che l'algoritmo "ammazza-doppioni" di splite confronta *tutti*
i valori-colonna (eccetto quelli che appartengono ad una eventuale
Primary Key), ne consegue che le due righe sono sicuramente diverse
tra di loro, e quindi il verdetto e' che non esiste nessuna feature
duplicata all'interno del dataset "isole".

short recall:
SpatiaLite e' semplicemente un'implementazione conforme degli standard
internazionali OFC/SFS ed ISO SQL/MM che dettano le linee guida di
implementazione per gli Spatial DBMS e per lo Spatial SQL.
cioe' sostanzialmente e' uno strumento che supporta esattamente le
medesime capacita' di Spatial Processing offerte da PostGIS e/o
altri blasonati (e ben costosi) Spatial DBMS proprietari; con
l'unica differenza che SpatiaLite e' di una semplicita' assolutamente
elementare, e' sorprendentemente compatto e non richiede nessun tipo
di installazione e configurazione.
ed offre il bonus aggiuntivo che consente di importare ed esportare
in modo assai semplice anche i vetustissimi ed obsoleti Shapefiles.

SQL e' notoriamente un linguaggio standard progettato apposta per
elaborare in modo efficiente datasets anche di enormi dimensioni
(svariate decine di milioni di features, e pure oltre).

ergo, ragionando in termini di puro SQL il problema di identificare
tutti i duplicati presenti all'interno di un dataset diventa una banale
query SQL estremamente compatta basata sui criteri di aggregazione
(N.B. il bello di Spatial SQL e' che anche le geometrie diventano
finalmente "dati normali", piu' o meno proprio come gli altri):

SELECT Count(*) AS dupl_cnt, colonna1, colonna2, ...., colonnaN
FROM tavola
GROUP BY colonna1, colonna2, ..., colonnaN
HAVING dupl_cnt > 1;

e questo e' esattamente cio' che fa il tool "ammazza-doppioni" di
SpatiaLite; una volta identificati i "doppioni" puo' opzionalmente
procedere eliminando tutte le occorrenze ridondanti eccetto la prima.
il valore aggiunto consiste banalmente nel fatto che e' direttamente
il tool che si auto-scrive la query caso per caso previa ispezione
delle meta-tavole di sistema del DB per generare l'elenco di tutte
le colonne (comprese le eventuali geometrie) che appartengono alla
tavola bersaglio.

stop: nulla di piu' e nulla di meno.
come vedi, non c'e' proprio nulla di "casuale", e' tutto
rigorosamente deterministico e facilmente riproducibile
dall'A alla Z. ;-)

nel "caso speciale" che ho visto citare in alcuni dei post
precedenti (valutare i doppioni solo in base ai valori degli
attributi ignorando le geometrie, o viceversa valutare solo
le geometrie ignorando gli attributi, oppure valutare solo
i valori di alcuni attributi ignorandone altri) il percorso
diventa un pelino piu' complesso ma niente affatto proibitivo:
- prima occorre derivare una tavola intermedia che contenga
   solo i valori che si vogliono prendere in considerazione
- poi si usera' l'"ammazza-doppioni" su questa tavola
- ed infine si potra' ricostruire il dataset complessivo
   finale eseguendo una banale JOIN tra le due tavole.
- ovviamente in questo caso occorrera' sempre prestare la
   massima attenzione a preservare fedelmente tutti i valori
   delle Primary Keys durante le varie fasi del processo.

ciao Sandro


Maggiori informazioni sulla lista Gfoss