[Gfoss] Punti random nel poligono soluzione SpatiaLite Help

pigreco pigrecoinfinito a gmail.com
Mer 15 Maggio 2019 21:16:48 CEST


Ciao,
ho creato questo script SQL per sqlite/spatialite con cui genero dei punti
random all'interno del bounding box di un layer poligonale.
Ne genero ad esempio 1000 random, e poi all'interno del suo perimetro ne
ricadono 478.

-- creo una tabella vuota che conterrà i random point
CREATE TABLE point_01
(id INTEGER PRIMARY KEY AUTOINCREMENT,cir_id INTEGER);
-- popolo ID tabella
INSERT INTO point_01
WITH RECURSIVE
  cnt(id) AS ( SELECT 1 UNION ALL SELECT id + 1 FROM cnt LIMIT 1000)
SELECT id,0 FROM cnt;
-- aggiorno tabella con i punti casuali usando bounding box del poligono
SELECT AddGeometryColumn ('point_01','geom',4326,'POINT','XY');
UPDATE point_01 SET
geom = (SELECT makepoint (
CAST ((select (0.5 - RANDOM()/CAST(-9223372036854775808 AS REAL)/
2)*(extent_max_x - extent_min_x) + extent_min_x
FROM "vector_layers_statistics" WHERE id=point_01.id AND table_name =
'poly') AS REAL),
CAST ((select (0.5 - RANDOM()/CAST(-9223372036854775808 AS REAL)/
2)*(extent_max_y - extent_min_y) + extent_min_y
FROM "vector_layers_statistics" WHERE id=point_01.id AND table_name =
'poly') AS REAL), 4326) WHERE id=point_01.id);
SELECT 'Creazione indice spaziale su ', 'point_01','geom',
coalesce(checkspatialindex('point_01','geom'),CreateSpatialIndex('point_01','geom'));

Allego il file Spatialite su cui è possibile eseguire la query di sopra.
https://bit.ly/2HlvAoQ

Vorrei una mano per fare un passo in avanti nella logica dello script. Il
mio goal: dato un poligono, voglio generarne 1000 punti nel suo perimetro.
Quindi potrei:

1. generarne più di 1000, poi conteggiarne (vedi script sotto) quanti ne
ricadono all'interno del perimetro, e 
  a. se sono più di 1000, eseguo un SELECT con LIMIT 1000 e ho finito.
  b. se sono meno di 1000, ne genero in aggiunga ai precedenti altri XXX,
faccio il check e
      - se sono più di 1000 torno ad a.;
      - se sono meno di 1000 torno a b..
    
So di soluzioni in QGIS, PostGIS, geo Python, ma vorrei stare nel contesto
spatialite.

C'è qualche suggerimento didattico su come risolvere tutto in una logica SQL
(in sqlite) o la strada preferenziale è fare dialogare spatialite con Python
(o altro) e qualche while loop?


-- associo cir_id ad ogni punto
UPDATE point_01 SET
cir_id = (SELECT pl.cir_id
FROM poly pl, point_01 pt
WHERE id=point_01.id AND pt.rowid IN (SELECT rowid FROM SpatialIndex 
			WHERE f_table_name = 'point_01' AND search_frame = pl.geom)
                  and ST_Intersects (pl.geom, pt.geom) = 1);
-- cancello i punti fuori poligono
DELETE FROM point_01 WHERE CIR_ID IS NULL;
-- conteggio punti
SELECT count(*) FROM point_01;

Grazie

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


Maggiori informazioni sulla lista Gfoss