SpatiaLite e SnapAndSplit

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

SpatiaLite e SnapAndSplit

pigreco
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] https://www.gaia-gis.it/gaia-sins/spatialite-sql-latest.html

grazie
saluti Totò

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

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.
_______________________________________________
[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.
764 iscritti al 23/08/2019
Reply | Threaded
Open this post in threaded view
|

Re: SpatiaLite e SnapAndSplit

a.furieri
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


_______________________________________________
[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.
764 iscritti al 23/08/2019
Reply | Threaded
Open this post in threaded view
|

Re: SpatiaLite e SnapAndSplit

Maurizio Trevisani
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 <[hidden email]> 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
>
>
> _______________________________________________
> [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.
> 764 iscritti al 23/08/2019
_______________________________________________
[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.
764 iscritti al 23/08/2019
Reply | Threaded
Open this post in threaded view
|

Re: SpatiaLite e SnapAndSplit

pigreco
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 <
[hidden email]> 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 <[hidden email]> 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
> >
> >
> > _______________________________________________
> > [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.
> > 764 iscritti al 23/08/2019
> _______________________________________________
> [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.
> 764 iscritti al 23/08/2019



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

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.
_______________________________________________
[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.
764 iscritti al 23/08/2019