Per lavoro ho avuto la necessità di estrarre i vertici di un vettore lineare e per fare questa semplice operazione ho seguito due vie diverse, vediamo quale è più performante usando SpatiaLite 5.0 Beta1:
La rete è caratterizzata da oltre 14.000 archi:

La prima query a cui ho pensato è stata la seguente:
-- crea geotabella vuota "vertici_rete"
SELECT DropGeoTable( "vertici_rete");
CREATE TABLE "vertici_rete" (
"pk_uid" INTEGER PRIMARY KEY AUTOINCREMENT,
"name" INTEGER);
SELECT AddGeometryColumn ('vertici_rete','geom',4326,'POINT','XY');
-- popola la geotabella "vertici_rete"
-- con il primo e ultimo vertice della rete
INSERT INTO "vertici_rete"
SELECT NULL, "name", ST_PointN(geom,1) as geom
FROM "roads"
UNION ALL
SELECT NULL, "name", ST_PointN(geom,-1) as geom
FROM "roads";
SELECT RecoverGeometryColumn('vertici_rete','geom',4326,'POINT','XY')
la query impiega 1,875 secondi
generando:

La seconda query è la seguente:
-- crea geotabella vertici_rete2
SELECT DropGeoTable( "vertici_rete1");
CREATE TABLE "vertici_rete1" AS
SELECT "name", ST_Boundary(geom) as geom
FROM "roads" ;
SELECT RecoverGeometryColumn('vertici_rete1','geom',4326,'MULTIPOINT','XY');
-- crea geotabella vertici2
SELECT DropGeoTable( "vertici_rete2");
SELECT ElementaryGeometries( 'vertici_rete1' ,
'geom' ,
'vertici_rete2' ,
'out_pk' ,
'out_multi_id', 1 ) as num,
'point splitted' as label;
-- cancella la geotabella non più utile
SELECT DropGeoTable( "vertici_rete1");
questa query impiega: 2,012 secondi
generando:

Lascio a voi ulteriori analisi e conclusioni. (Secondo voi quale delle due ho utilizzato??, oppure esiste altra via usando sempre SQL??)
Riferimenti:
- La rete è quella di OSM: http://download.geofabrik.de/europe/italy.html
- QGIS: https://qgis.org/it/site/
- SpatiaLite: https://www.gaia-gis.it/fossil/libspatialite/index
- PicPick: per gli screenshot: https://picpick.app/it/
Se il blog post vi è piaciuto cliccate su ‘Mi piace’, grazie!!!
if you liked the blog post click on ‘Like’, thank you !!!
Se il post vi è stato utile contribuite a mantenerlo aggiornato PayPal




Innanzitutto grazie per i suoi video e tutorial, ormai ho capito che in ambito GIS dati geografici SQL è necessario, le mie domande sono ma se io volessi fare all’incontrario ovvero partendo da dei punti tracciare dei tratti creando una rete sarebbe possibile o sarei sempre vincolato a dover duplicare alcuni vertici che sono la fine di un tratto ed inizio del seguente?
Altra domanda il layer vettoriale lineare di partenza deve necessariamente essere un linea oppure anche MULTILINE? guardando sue immagini dice LINESTRING ed ho questo dubbio sul formato vettoriale.
Grazie ancora per tempo ed attenzione datami
"Mi piace""Mi piace"
Ciao Luca,
Sì, è possibile. Se hai una serie di punti puoi collegarli e creare una linea.
Se devi lavorare con reti stradali e fare analisi di routing è meglio usare Linestring.
"Mi piace""Mi piace"