[Gfoss] Punti random nel poligono soluzione SpatiaLite Help

a.furieri a lqt.it a.furieri a lqt.it
Mar 21 Maggio 2019 18:49:16 CEST


On Wed, 15 May 2019 12:16:48 -0700 (MST), pigreco wrote:
> 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?
>

chiaramente la strada piu' liscia, semplice e veloce e' quella di 
scrivere
un banale programmicchio in C, C++, Java, Python o qualsiasi altro 
linguaggio
di programmazione che supporti i loops.

SQL e' un linguaggio meraviglioso, ma e' comunque un linguaggio basato 
sul
paradigma dichiarativo; tutti gli altri (C, Java etc) sono invece 
linguaggi
basati sul paradigma imperativo.
nei linguaggi dichiarativi va specificato quale risultato finale si 
intende
ottenere, dopo di che ci pensera' il linguaggio stesso ad identificare 
in
modo ottimale tutte le azioni necessarie per arrivare a quel risultato.
tutto l'opposto avviene nei linguaggi imperativi, in cui e' il 
programmatore
a dovere specificare minuziosamente tutte le azioni necessarie per 
arrivare
al risultato finale.

non e' che un paradigma sia superiore all'altro; sono profondamente 
diversi,
e ciascuno di essi e' piu' adatto ad alcuni problemi piuttosto che ad 
altri.
e' un po' come avere a disposizione un coltello da cucina ed un'ascia; 
se devi
affettare del pane l'ascia sara' decisamente poco pratica, esattamente 
come
il coltello da cucina si rivelera' inadeguato per abbattere una 
quercia.

venendo allo specifico del tuo problema, lo possiamo sintetizzare in
questo pseudo-algoritmo:

0. inizializzazione: definisci il poligoo ed azzeri il contatore
1. se il contatore ha raggiunto il valore massimo vai al punto 4)
    altrimenti procedi al punto successivo.
2. calcola un punto random all'interno del BBOX del poligono
3. verifica se il  punto cade realmente all'interno della superficie
    del poligono
    3-A) si: inseriscilo nella tavola, incrementa il contatore e torna
         al punto 1)
    3-B) no: torna al punto 1) senza incrementare il contatore
4. fine

questo e' un classico loop, e tutti i linguaggi di programmazione
imperativi sono fatti apposta per rendere semplice l'esecuzione
dei loops.
SQL invece segue tutt'altra logica, ed offre solo la WITH RECURSIVE
per mettere in piedi (in modo abbastanza macchinoso e contorto)
qualcosa che assomiglia ad un loop.
conclusione: quando usare un loop e' assolutamente critico (come
nel tuo caso, visto che non puoi sapere in anticipo se/quanti
punti random cadranno effettivamente dentro al poligono)
pretendere di usare solo SQL puro non e' la scelta ottimale.
e' un po' come cercare di affettare pane e salame con l'ascia;
se usi invece il coltello da cucina fatichi molto meno.

ciao Sandro


Maggiori informazioni sulla lista Gfoss