spatialite

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

spatialite

pigreco
Buona domenica a tutti,
ho un problema che non riesco a risolvere, utilizzo spatialite 4.5 tramite
spatialite_gui 2.1.0 devel su macchina win10 64b

allego il database db_03.sqlite [0] con due geotabelle:
- nodes_all : tabella con geometria POINT 3045 XY
- strade: tabella con geometria LINESTRING 3045 XY

il mio obiettivo è quello di dividere le strade in corrispondenza dei punti,
cosa che riesco a fare per numero di punti e linee limitato, per questo db
non riesco e vorrei capire perché lo script, da me realizzato, non funziona
in particolare lo step4  (script.sql [0]) che ritorna (facendo il Check
geometry) due tipologie di geometria (linestring e multilinestring) e quindi
lo step5 non genera nessuna geometria.

--step4
CREATE TABLE "lines_split" AS
SELECT a.pk AS id,
ST_LinesCutAtNodes(st_segmentize(a.geom,6),ST_Union(b.geom)) AS geom
FROM "strade" a, "points_snapped" b
GROUP BY a.pk,a.geom;
SELECT
RecoverGeometryColumn('lines_split','geom',3045,'MULTILINESTRING','XY');

PS: lo step1 dura parecchio, circa 12 minuti (perdonatemi!)

Grazie

[0] https://mega.nz/#!VcAnzIzI!SVJUVxoB_rGHrUPtMgpxC5WZDpf0so2CawCRlEchtxU

-----
https://pigrecoinfinito.wordpress.com/
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/
_______________________________________________
[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.
796 iscritti al 28/12/2017
Reply | Threaded
Open this post in threaded view
|

Re: spatialite

Maurizio Trevisani
Non l'ho testato e potrebbe essermi sfuggito qualche errore:

prova un po'


-------------------------

select 'Creazione indice spaziale su ', 'nodes_all','geom',
coalesce(checkspatialindex('nodes_all','geom'),CreateSpatialIndex('nodes_all','geom'));

select dropgeotable('_templines');
create table _templines(pk_uid integer primary key autoincrement, id integer);
select addgeometrycolumn('_templines','geom',(SELECT cast(srid as
integer) FROM geometry_columns WHERE lower(f_table_name) =
lower('strade') AND lower(f_geometry_column) = lower('geom')),
'multilinestring', 'xy');

insert into _templines (id, geom)
SELECT a.pk AS id,
casttomulti(ST_Split( a.geom, (select
casttomultipoint(st_collect(b.geom)) from "points_snapped" as b where
b.rowid in (select rowid from spatialindex where f_table_name =
'points_snapped' and f_geometry_column = 'geom' and search_frame =
a.geom)))) as geom
from "strade" a;

select dropgeotable('lines_split');
select ElementaryGeometries( '_templines' , 'geom' , 'lines_split' ,
'out_pk' , 'out_multi_id' ,  1, ) as num, ' lines splitted' as label;
select createspatialindex('lines_split','geom');
select dropgeotable('_templines');

select UpdateLayerStatistics('lines_split');

-------------------------


Ciao,
Maurizio

Il 27/05/18, pigreco<[hidden email]> ha scritto:

> Buona domenica a tutti,
> ho un problema che non riesco a risolvere, utilizzo spatialite 4.5 tramite
> spatialite_gui 2.1.0 devel su macchina win10 64b
>
> allego il database db_03.sqlite [0] con due geotabelle:
> - nodes_all : tabella con geometria POINT 3045 XY
> - strade: tabella con geometria LINESTRING 3045 XY
>
> il mio obiettivo è quello di dividere le strade in corrispondenza dei punti,
> cosa che riesco a fare per numero di punti e linee limitato, per questo db
> non riesco e vorrei capire perché lo script, da me realizzato, non funziona
> in particolare lo step4  (script.sql [0]) che ritorna (facendo il Check
> geometry) due tipologie di geometria (linestring e multilinestring) e quindi
> lo step5 non genera nessuna geometria.
>
> --step4
> CREATE TABLE "lines_split" AS
> SELECT a.pk AS id,
> ST_LinesCutAtNodes(st_segmentize(a.geom,6),ST_Union(b.geom)) AS geom
> FROM "strade" a, "points_snapped" b
> GROUP BY a.pk,a.geom;
> SELECT
> RecoverGeometryColumn('lines_split','geom',3045,'MULTILINESTRING','XY');
>
> PS: lo step1 dura parecchio, circa 12 minuti (perdonatemi!)
>
> Grazie
>
> [0] https://mega.nz/#!VcAnzIzI!SVJUVxoB_rGHrUPtMgpxC5WZDpf0so2CawCRlEchtxU
>
> -----
> https://pigrecoinfinito.wordpress.com/
> --
> Sent from:
> http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/
> _______________________________________________
> [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.
> 796 iscritti al 28/12/2017
_______________________________________________
[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.
796 iscritti al 28/12/2017
Reply | Threaded
Open this post in threaded view
|

Re: spatialite

pigreco
Maurizio Trevisani wrote

> Non l'ho testato e potrebbe essermi sfuggito qualche errore:
>
> prova un po'
>
> -------------------------
>
> select 'Creazione indice spaziale su ', 'nodes_all','geom',
> coalesce(checkspatialindex('nodes_all','geom'),CreateSpatialIndex('nodes_all','geom'));
>
> select dropgeotable('_templines');
> create table _templines(pk_uid integer primary key autoincrement, id
> integer);
> select addgeometrycolumn('_templines','geom',(SELECT cast(srid as
> integer) FROM geometry_columns WHERE lower(f_table_name) =
> lower('strade') AND lower(f_geometry_column) = lower('geom')),
> 'multilinestring', 'xy');
>
> insert into _templines (id, geom)
> SELECT a.pk AS id,
> casttomulti(ST_Split( a.geom, (select
> casttomultipoint(st_collect(b.geom)) from "points_snapped" as b where
> b.rowid in (select rowid from spatialindex where f_table_name =
> 'points_snapped' and f_geometry_column = 'geom' and search_frame =
> a.geom)))) as geom
> from "strade" a;
>
> select dropgeotable('lines_split');
> select ElementaryGeometries( '_templines' , 'geom' , 'lines_split' ,
> 'out_pk' , 'out_multi_id' ,  1, ) as num, ' lines splitted' as label;
> select createspatialindex('lines_split','geom');
> select dropgeotable('_templines');
>
> select UpdateLayerStatistics('lines_split');
>
> -------------------------
> Ciao,
> Maurizio

Ciao e grazie.

Ho appena provato lo script [0] e ottengo la geotabella 'lines_split' ma
lanciando il check geometry:
count(*)|Geometry Type("geom")|Srid("geom")|CoordDimensio("geom")
849       |Null                             | Null            |Null

quindi come posso proseguire?

[0]  https://gist.github.com/pigreco/a00164ded1a67e4b067b3a8c167a80fa


-----
https://pigrecoinfinito.wordpress.com/
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/
_______________________________________________
[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.
796 iscritti al 28/12/2017
Reply | Threaded
Open this post in threaded view
|

Re: spatialite

a.furieri
In reply to this post by pigreco
On Sun, 27 May 2018 02:18:45 -0700 (MST), pigreco wrote:

> in particolare lo step4  (script.sql [0]) che ritorna (facendo il
> Check
> geometry) due tipologie di geometria (linestring e multilinestring) e
> quindi
> lo step5 non genera nessuna geometria.
>
> --step4
> CREATE TABLE "lines_split" AS
> SELECT a.pk AS id,
> ST_LinesCutAtNodes(st_segmentize(a.geom,6),ST_Union(b.geom)) AS geom
> FROM "strade" a, "points_snapped" b
> GROUP BY a.pk,a.geom;
> SELECT
>
> RecoverGeometryColumn('lines_split','geom',3045,'MULTILINESTRING','XY');
>

su PostGis una colonna MultiQualcosa puo' contenere indifferentemente
sia le geometrie MultiPart che le geometrie SinglePart dello stesso
tipo, ma SpatiaLite impone vincoli piu' stringenti: o sono tutte
MultiPart o sono tutte SinglePart.

quando, come nel tuo caso, c'e' di mezzo una funzione che puo' tornare
entrambi i tipi c'e' un modo facilissimo per risolvere il problema;
basta chiamare l'appropriato operatore di Cast [1] per trasformare
tutti i SingleQualcosa nel corrispondente MultiQualcosa.
quindi nel tuo caso specifico:

SELECT a.pk AS id, CastToMultiLinestring(
ST_LinesCutAtNodes(st_segmentize(a.geom,6),ST_Union(b.geom))) AS geom
FROM "strade" a, "points_snapped" b
GROUP BY a.pk,a.geom;

vedrai che a questo punto tornera' tutti MultiLinestring, e quindi la
successiva AddGeometryColumn() avra' successo.

ciao Sandro

[1] http://www.gaia-gis.it/gaia-sins/spatialite-sql-latest.html#cast
_______________________________________________
[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.
796 iscritti al 28/12/2017
Reply | Threaded
Open this post in threaded view
|

Re: spatialite

pigreco
a.furieri wrote

> quando, come nel tuo caso, c'e' di mezzo una funzione che puo' tornare
> entrambi i tipi c'e' un modo facilissimo per risolvere il problema;
> basta chiamare l'appropriato operatore di Cast [1] per trasformare
> tutti i SingleQualcosa nel corrispondente MultiQualcosa.
> quindi nel tuo caso specifico:
>
> SELECT a.pk AS id, CastToMultiLinestring(
> ST_LinesCutAtNodes(st_segmentize(a.geom,6),ST_Union(b.geom))) AS geom
> FROM "strade" a, "points_snapped" b
> GROUP BY a.pk,a.geom;
>
> vedrai che a questo punto tornera' tutti MultiLinestring, e quindi la
> successiva AddGeometryColumn() avra' successo.
>
> ciao Sandro

Ho fatto tante prove e tra queste ho utilizzato anche il casting con esito
negativo,
in questo caso e con questo database funziona bene. grazie

deduco che il dataset di partenza può far cambiare l'esito del casting.

grazie

-----
https://pigrecoinfinito.wordpress.com/
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/
_______________________________________________
[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.
796 iscritti al 28/12/2017
Reply | Threaded
Open this post in threaded view
|

Re: spatialite

a.furieri
On Mon, 28 May 2018 00:09:47 -0700 (MST), pigreco wrote:
> Ho fatto tante prove e tra queste ho utilizzato anche il casting con
> esito
> negativo,
>

negativo in che senso ? che ti tornava dei NULL ?
puoi essere piu' preciso ?


> in questo caso e con questo database funziona bene. grazie
>
> deduco che il dataset di partenza può far cambiare l'esito del
> casting.
>

assolutamente no; il database di partenza non puo' avere nessuna
influenza.
le funzioni di Casting lavorano in memoria; prendono un geometry-blob,
verificano se e' valido e di tipo coerente con il casting richiesto,
dopo
di che ritornano un nuovo geometry-blob al cui interno e' stato
cambiato
il valore del GeometryType conformemente alla richiesta.

naturalmente alcune operazioni di casting sono sempre proibite; non
puoi
p.es. trasformare un Point in un Linestring o un Linestring in un
Polygon,
perche' i due tipi non sono coerenti. e le operazioni di casting
proibite
ritornano sempre un NULL.

puoi invece trasformare qualunque SinglePart nel corrispondente
MultiPart,
cosi' come puoi trasformare qualsiasi roba in una GeometryCollection.
puoi anche provare a trasformare un MultiPart (o una Collection) in
un SinglePart, ma solo ed esclusivamente se contiene al suo interno
una singola geometria elementare del tipo indicato.

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.
796 iscritti al 28/12/2017
Reply | Threaded
Open this post in threaded view
|

Re: spatialite

pigreco
a.furieri wrote

> On Mon, 28 May 2018 00:09:47 -0700 (MST), pigreco wrote:
>> Ho fatto tante prove e tra queste ho utilizzato anche il casting con
>> esito
>> negativo,
>>
>
> negativo in che senso ? che ti tornava dei NULL ?
> puoi essere piu' preciso ?
>
>
>> in questo caso e con questo database funziona bene. grazie
>>
>> deduco che il dataset di partenza può far cambiare l'esito del
>> casting.
>>
>
> assolutamente no; il database di partenza non puo' avere nessuna
> influenza.
> le funzioni di Casting lavorano in memoria; prendono un geometry-blob,
> verificano se e' valido e di tipo coerente con il casting richiesto,
> dopo
> di che ritornano un nuovo geometry-blob al cui interno e' stato
> cambiato
> il valore del GeometryType conformemente alla richiesta.

Purtroppo non riesco più a riprodurre il problema che era il seguente:
- senza l'uso del casting ottenevo, dal check geometries, linestring e
multilinestring
- usando il casting (ora non ricordo bene quale delle due tipologie) creava
la geometry multilinestring prendendo SOLO una delle due tipologie; cioè
visualizzando il dato mancavano le features.

se riesco a riprodurlo condividerò il database.

per adesso grazie infinite per le spiegazioni e soprattutto per spatialite,
uno strumento che mi stà aiutando moltissimo e mi piacerebbe poter
contribuire.

PS: per favore, da dove posso scaricare spatialite 4.5 e magari il 5? per
adesso utilizzo il 4.3 e il 4.5 ma di quest'ultimo non trovo più il link per
scaricarlo.

saluti

-----
https://pigrecoinfinito.wordpress.com/
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/
_______________________________________________
[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.
796 iscritti al 28/12/2017
Reply | Threaded
Open this post in threaded view
|

Re: spatialite

a.furieri
On Mon, 28 May 2018 03:22:48 -0700 (MST), pigreco wrote:
> PS: per favore, da dove posso scaricare spatialite 4.5 e magari il 5?
> per
> adesso utilizzo il 4.3 e il 4.5 ma di quest'ultimo non trovo più il
> link per
> scaricarlo.
>

regola sempre valida per tutte le versioni ancora in corso di sviluppo
e non ancora definitivamente pronte per un rilascio "stable":

1. per ovvi motivi non esistono distro di binari eseguibili (anche se a
volte
    possono essere rilasciati degli snapshots "usa e getta" giusto per
promuovere
    un pizzico di testing "sperimentale" quando serve allo sviluppo).
2. chi usa Linux non dovrebbe incontrare nessun problema particolare
nel
    farsi la propria build a partire dall'ultima versione dei sorgenti
    che e' sempre scaricabile dal repository Fossil [1],[2]
3. chi usa Windows puo' sempre provare a farsi la sua build dai
sorgenti,
    con l'avvertenza pero' che su Windows tutto diventa mostruosamente
piu'
    difficile di quanto sia su Linux.
    (diceva mia nonna: "l'hai voluta la bicicletta ? allora pedala !!!")
    ad ogni modo, esistono due guide how-to [3],[4] a supporto dei
coraggiosi
    impavidi che se la sentono di avventurarsi in una build per Win32 o
Win64
    (in diversi ci sono riusciti, anche tra chi bazziaca questa ML).

ciao Sandro

[1] https://www.gaia-gis.it/fossil/libspatialite
[2] http://www.gaia-gis.it/gaia-sins/about-fossil.html
[3] http://www.gaia-gis.it/gaia-sins/mingw32_how_to.html
[4] http://www.gaia-gis.it/gaia-sins/mingw64_how_to.html
_______________________________________________
[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.
796 iscritti al 28/12/2017