[Gfoss] SpatiaLite e SnapAndSplit

Buongiorno,
fino a ieri per dividere delle MultiLineString 32632 con dei punti
utilizzavo, nel mio script SQL, due aggiornamenti della geometria:
1. per fare lo snap
2. per fare lo split

ho scoperto la funziona SnapAndSplit [0] che dovrebbe fare tutto in un
unico passaggio, sembra funzionare ma da vari test l'uso di SnapAndSplit mi
genera un output con una riga in più rispetto al caso diviso (prima snap e
poi split).

Esiste un motivo teorico oppure devo indagare sulla geometria di input?

primo caso con Snap e Split separati:

-- aggiorna la geometria aggiungendo i vertici X
UPDATE route_X SET geom=
        CastToMulti(
                RemoveRepeatedPoints(
                                    ST_Snap(
                                            route_X.geom,
                                            (SELECT
CastToMultipoint(st_collect(b.geom))
                                            FROM X as b
                                            WHERE b.id = route_X.id
                                            GROUP BY b.id) , 0.001
                                            ), 0.001
                                    )
        )
WHERE EXISTS(
            SELECT 1 FROM X as b
            WHERE b.id = route_X.id limit 1
            );

-- aggiorna la geometria splittando nei punti X
UPDATE route_X SET geom=
    CastToMulti(
                ST_Split(
                        route_X.geom,
                        (SELECT CastToMultiPoint(st_collect(b.geom))
                        FROM X as b
                        WHERE b.id = route_X.id
                        GROUP BY b.id)
                        )
                )
WHERE EXISTS(
            SELECT 1 FROM X as b
            WHERE b.id = route_X.id limit 1
            );

caso con SnapAndSplit

-- aggiorna la geometria aggiungendo i vertici T e splittando, precisione 1
millimetro 4 sec
UPDATE route_T SET geom=
        CastToMulti(
                RemoveRepeatedPoints(
                                    SnapAndSplit(
                                            route_T.geom,
                                            (SELECT
CastToMultipoint(st_collect(b.geom))
                                            FROM T2 as b
                                            WHERE b.id2 = route_T.id
                                            GROUP BY b.id2) , 0.001
                                            ), 0.001
                                    )
        )
WHERE EXISTS(
            SELECT 1 FROM T2 as b
            WHERE b.id2 = route_T.id limit 1
            );

[0] SpatiaLite SQL functions reference list

grazie
saluti Totò

--
*Ing. Salvatore Fiandaca*
*mobile*.:+39 327.493.8955
*m*: *pigrecoinfinito@gmail.com <pigrecoinfinito@gmail.com>*
*C.F*.: FNDSVT71E29Z103G
*P.IVA*: 06597870820
*membro QGIS Italia - http://qgis.it/*
*socio GFOSS.it - *http://gfoss.it/
*blog:*
* https://pigrecoinfinito.com/ FB: Co-admin
- QGIS Italia**
<https://www.facebook.com/qgis.it/&gt; *
*TW: <http://goog_95411464>**https://twitter.com/totofiandaca
<https://twitter.com/totofiandaca&gt;\*

43°51'0.54"N 10°34'27.62"E - EPSG:4326

“Se la conoscenza deve essere aperta a tutti,
perchè mai limitarne l’accesso?”
R. Stallman

Questo documento, allegati inclusi, contiene informazioni di proprietà di
FIANDACA SALVATORE e deve essere utilizzato esclusivamente dal destinatario
in relazione alle finalità per le quali è stato ricevuto. E' vietata
qualsiasi forma di riproduzione o divulgazione senza l'esplicito consenso
di FIANDACA SALVATORE. Qualora fosse stato ricevuto per errore si prega di
informare tempestivamente il mittente e distruggere la copia in proprio
possesso.

On Sun, 13 Jun 2021 10:19:27 +0200, Totò Fiandaca wrote:

Buongiorno,
fino a ieri per dividere delle MultiLineString 32632 con dei punti
utilizzavo, nel mio script SQL, due aggiornamenti della geometria:
1. per fare lo snap
2. per fare lo split

ho scoperto la funziona SnapAndSplit [0] che dovrebbe fare tutto in un
unico passaggio, sembra funzionare ma da vari test l'uso di SnapAndSplit mi
genera un output con una riga in più rispetto al caso diviso (prima snap e
poi split).

Esiste un motivo teorico oppure devo indagare sulla geometria di input?

Toto',

la SnapAndSplit() si limita semplicemente a chiamare in sequenza
prima la Snap e poi la Split, non fa altro.

vedo pero' che nel tuo SQL c'e' una sottilissima differenza;
tu parti col la Snap, poi applichi la RemoveRepeatedPoints()
ed infine chiami la Split.

nell'altra versione chiami la SnapAndSplit() e poi la
RemoveRepeatedPoints(); non e' la stessa cosa, perche'
nel primo caso elimini i punti doppi _PRIMA_ della Split,
mentre nel secondo casi li elimini _DOPO_ la Split.

per evitare di confrontare le mele con le banane dovesti
provare a chiamare la RemoveRepeatedPoints() sempre come
ultimissimo passaggio.
cosi' a lume di naso potrebbe essere proprio quel passaggio
a fare la differenza, altrimenti trovo difficile spiegare
come facciano a venire fuori due risultati diversi.

domanda: ma non e' che per caso il tuo dataset e'
"sporco" e contiene gia' in partenza punti doppi ?
perche' allora parrebbe piu' saggio iniziare chiamando
la RemoveRepeatedPoints() al primissimo passaggio prima
ancora di procedere con Snap e Split.

ciao Sandro

Totò,
a cosa stai lavorando?
Piano piano stai scoprendo tutte le ultime meraviglie di Spatialite!!!!

Poi scoprirai la topologia.....

Spatialite è il DBMS spaziale più interessante del momento.

Ciao,
Grazie,
Maurizio

Il dom 13 giu 2021, 11:27 <a.furieri@lqt.it> ha scritto:

On Sun, 13 Jun 2021 10:19:27 +0200, Totò Fiandaca wrote:
> Buongiorno,
> fino a ieri per dividere delle MultiLineString 32632 con dei punti
> utilizzavo, nel mio script SQL, due aggiornamenti della geometria:
> 1. per fare lo snap
> 2. per fare lo split
>
> ho scoperto la funziona SnapAndSplit [0] che dovrebbe fare tutto in
> un
> unico passaggio, sembra funzionare ma da vari test l'uso di
> SnapAndSplit mi
> genera un output con una riga in più rispetto al caso diviso (prima
> snap e
> poi split).
>
> Esiste un motivo teorico oppure devo indagare sulla geometria di
> input?
>

Toto',

la SnapAndSplit() si limita semplicemente a chiamare in sequenza
prima la Snap e poi la Split, non fa altro.

vedo pero' che nel tuo SQL c'e' una sottilissima differenza;
tu parti col la Snap, poi applichi la RemoveRepeatedPoints()
ed infine chiami la Split.

nell'altra versione chiami la SnapAndSplit() e poi la
RemoveRepeatedPoints(); non e' la stessa cosa, perche'
nel primo caso elimini i punti doppi _PRIMA_ della Split,
mentre nel secondo casi li elimini _DOPO_ la Split.

per evitare di confrontare le mele con le banane dovesti
provare a chiamare la RemoveRepeatedPoints() sempre come
ultimissimo passaggio.
cosi' a lume di naso potrebbe essere proprio quel passaggio
a fare la differenza, altrimenti trovo difficile spiegare
come facciano a venire fuori due risultati diversi.

domanda: ma non e' che per caso il tuo dataset e'
"sporco" e contiene gia' in partenza punti doppi ?
perche' allora parrebbe piu' saggio iniziare chiamando
la RemoveRepeatedPoints() al primissimo passaggio prima
ancora di procedere con Snap e Split.

ciao Sandro

_______________________________________________
Gfoss@lists.gfoss.it
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.
764 iscritti al 23/08/2019

Maurizio, sto lavorando con dataset enormi (almeno per me) con quasi 3 M di
righe (MultiLineString),
devo fare una cosa apparentemente semplice, *split line with line* usando
la stessa tabella e dividere le linee nei casi X e T (con nodo e senza nodo)

Per semplificare faccio test con un sottoinsieme della tabella originale,
con una tabella di circa 120k righe,
il mio vecchio laptop impiega circa 3 minuti utilizzando spatialIndex e
variabili (stored procedure);
oltre ad acchiappare i casi X (crosses) e i casi T (che risolvo estraendo i
vertici e filtrando per distanza) il mio compito è di ottimizzazione,
perché su milioni di righe potrebbe impiegare molto tempo.

saluti

Il giorno dom 13 giu 2021 alle ore 12:39 Maurizio Trevisani <
maurizio.trevisani@gmail.com> ha scritto:

Totò,
a cosa stai lavorando?
Piano piano stai scoprendo tutte le ultime meraviglie di Spatialite!!!!

Poi scoprirai la topologia.....

Spatialite è il DBMS spaziale più interessante del momento.

Ciao,
Grazie,
Maurizio

Il dom 13 giu 2021, 11:27 <a.furieri@lqt.it> ha scritto:

> On Sun, 13 Jun 2021 10:19:27 +0200, Totò Fiandaca wrote:
> > Buongiorno,
> > fino a ieri per dividere delle MultiLineString 32632 con dei punti
> > utilizzavo, nel mio script SQL, due aggiornamenti della geometria:
> > 1. per fare lo snap
> > 2. per fare lo split
> >
> > ho scoperto la funziona SnapAndSplit [0] che dovrebbe fare tutto in
> > un
> > unico passaggio, sembra funzionare ma da vari test l'uso di
> > SnapAndSplit mi
> > genera un output con una riga in più rispetto al caso diviso (prima
> > snap e
> > poi split).
> >
> > Esiste un motivo teorico oppure devo indagare sulla geometria di
> > input?
> >
>
> Toto',
>
> la SnapAndSplit() si limita semplicemente a chiamare in sequenza
> prima la Snap e poi la Split, non fa altro.
>
> vedo pero' che nel tuo SQL c'e' una sottilissima differenza;
> tu parti col la Snap, poi applichi la RemoveRepeatedPoints()
> ed infine chiami la Split.
>
> nell'altra versione chiami la SnapAndSplit() e poi la
> RemoveRepeatedPoints(); non e' la stessa cosa, perche'
> nel primo caso elimini i punti doppi _PRIMA_ della Split,
> mentre nel secondo casi li elimini _DOPO_ la Split.
>
> per evitare di confrontare le mele con le banane dovesti
> provare a chiamare la RemoveRepeatedPoints() sempre come
> ultimissimo passaggio.
> cosi' a lume di naso potrebbe essere proprio quel passaggio
> a fare la differenza, altrimenti trovo difficile spiegare
> come facciano a venire fuori due risultati diversi.
>
> domanda: ma non e' che per caso il tuo dataset e'
> "sporco" e contiene gia' in partenza punti doppi ?
> perche' allora parrebbe piu' saggio iniziare chiamando
> la RemoveRepeatedPoints() al primissimo passaggio prima
> ancora di procedere con Snap e Split.
>
> ciao Sandro
>
>
> _______________________________________________
> Gfoss@lists.gfoss.it
> 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.
> 764 iscritti al 23/08/2019
_______________________________________________
Gfoss@lists.gfoss.it
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.
764 iscritti al 23/08/2019

--
*Ing. Salvatore Fiandaca*
*mobile*.:+39 327.493.8955
*m*: *pigrecoinfinito@gmail.com <pigrecoinfinito@gmail.com>*
*C.F*.: FNDSVT71E29Z103G
*P.IVA*: 06597870820
*membro QGIS Italia - http://qgis.it/*
*socio GFOSS.it - *http://gfoss.it/
*blog:*
* https://pigrecoinfinito.com/ FB: Co-admin
- https://www.facebook.com/qgis.it/**
<https://www.facebook.com/qgis.it/&gt; *
*TW: <http://goog_95411464>**https://twitter.com/totofiandaca
<https://twitter.com/totofiandaca&gt;\*

43°51'0.54"N 10°34'27.62"E - EPSG:4326

“Se la conoscenza deve essere aperta a tutti,
perchè mai limitarne l’accesso?”
R. Stallman

Questo documento, allegati inclusi, contiene informazioni di proprietà di
FIANDACA SALVATORE e deve essere utilizzato esclusivamente dal destinatario
in relazione alle finalità per le quali è stato ricevuto. E' vietata
qualsiasi forma di riproduzione o divulgazione senza l'esplicito consenso
di FIANDACA SALVATORE. Qualora fosse stato ricevuto per errore si prega di
informare tempestivamente il mittente e distruggere la copia in proprio
possesso.