[Gfoss] Punti random nel poligono soluzione SpatiaLite Help

Andrea Peri aperi2007 a gmail.com
Mar 21 Maggio 2019 20:59:21 CEST


Ottima spiegazione Alessandro.

Il mar 21 mag 2019, 18:49 <a.furieri a lqt.it> ha scritto:

> 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
> _______________________________________________
> Gfoss a 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


Maggiori informazioni sulla lista Gfoss