[Gfoss] spatialite

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] MEGA

-----

--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/

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<pigrecoinfinito@gmail.com> 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/
_______________________________________________
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.
796 iscritti al 28/12/2017

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/

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

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/

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

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/

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