SpatiaLite: generare punti casuali in un Bounding Box di un poligono

SpatiaLite è il modulo spaziale di SQLite e quindi supporta tutti le funzioni di quest’ultimo. La funzione random utilizzata da SQLite è random() che
restituisce un intero pseudo-casuale compreso tra -9223372036854775808 e +9223372036854775807 cioè tra una minimo e massimo.

Per ottenere un numero compreso tra -1 e 1, occorre dividere il valore restituito per il massimo= 9223372036854775808 e se volessimo un numero compreso tra 0 e 1 occorre dividere per (2*massimo) e sommare 0,5 cioè:

(0.5 - RANDOM() / CAST(-9223372036854775808 AS REAL) / 2)

ottenuto il range (0 1) per generare un intervallo di valori compreso tra un max e un min occorre usare la seguente espressione:

(0.5 - RANDOM()/CAST(-9223372036854775808 AS REAL)/2) * (max - min) + min

i valori max e min sono quelli del Bounding Box di un poligono generico (x: 13.452028 – 13.243295; y:38.224614 – 38.049991)

SpatiaLite_GUI 2.10

Se volessimo generare 1000 random point lo script SQL utilizzato è:

-- creo una tabella vuota che conterrà i random point
CREATE TABLE point_bb
(id INTEGER PRIMARY KEY AUTOINCREMENT,cir_id INTEGER);
-- popolo ID tabella
INSERT INTO point_bb
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_bb','geom',4326,'POINT','XY');
UPDATE point_bb 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_bb.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_bb.id AND table_name = 'poly') AS REAL), 4326) WHERE id=point_bb.id);
BoundingBox, Poligono e punti random

Riferimenti:

Ringraziamenti:

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

This site uses Akismet to reduce spam. Learn how your comment data is processed.