[Gfoss] verifica senso digitalizzazione geometria

G. Allegri giohappy a gmail.com
Mer 15 Giu 2011 15:24:53 CEST


Il giorno 15 giugno 2011 15:21, Luca Sigfrido Percich
<sigfrido a tiscali.it>ha scritto:

>
> Ciao Giovanni,
>
> grazie, questa dell'area non la sapevo. ;)
>
> Tra l'altro come notavi giustamente il centroide può cadere fuori se il
> poligono è convoluto, a meno che l'API specifica non ti fornisca una
> funzione che garantisca la posizione del centroide nel poligono, quindi
> il metodo da me proposto è rischioso, si dovrebbe sostituire il
> centroide ad un qualunque punto sicuramente interno al poligono.
>
> Sono andato a ripescare una vecchia funzione MapInfo che scrissi per
> determinare il verso di rotazione delle coordinate di un linearring:
> data la matrice dei punti che lo costituiscono (1..n), e data una
> matrice di 4 elementi che contengono gli indici dei punti,
> rispettivamente:
> 1 - y = maxY
> 2 - x = maxX
> 3 - y = minY
> 4 - x = minX
>


non ho capito cosa contiene la matrice dei 4 indici....


>
> se gli indici contenuti in almeno 3 dei 4 elementi sono crescenti, la
> linestring ruota in senso orario.
>
> Forse computazionalmente meno intensivo (nessuna moltiplicazione) ma
> decisamente meno elegante :)
>
> Proverò a fare il porting in python
>
> Sig
>
>
> Il giorno mer, 15/06/2011 alle 15.08 +0200, G. Allegri ha scritto:
> > Più semplicemte si può usare il metodo dell'area. Se è positiva è
> > antiorario, e viceversa.
> >
> > Console Python di Qgis:
> >
> > def senso(p):
> >     area = 0
> >     p0 = p[0]
> >     for p1 in p[1:]:
> >         area += (p0[0] * p1[1]) - (p0[1] * p1[0]);
> >         p0 = p1
> >
> >     if area>0: # antiorario
> >         return 0
> >     else: #orario
> >         return 1
> >
> > sensi = {0:'antiorario',1:'orario'}
> > iface = qgis.utils.iface
> > lyr = iface.activeLayer()
> > prov = lyr.dataProvider()
> > attrlist = prov.attributeIndexes()
> > prov.select(attrlist)
> > feat = QgsFeature()
> > for i in range(lyr.featureCount()):
> >     prov.nextFeature(feat)
> >     geom = feat.geometry()
> >     wkbt = geom.wkbType()
> >     attributes = feat.attributeMap()
> >     print '->>> Feature GIS: %s' % attributes[0].toInt()[0]
> >     if wkbt==3:
> >         poly = geom.asPolygon()
> >         #seq_order(poly[0],attributes)
> >         s = senso(poly[0])
> >         print 'Poligono %s: %s' % (i,sensi[s])
> >     else:
> >         poly = geom.asMultiPolygon()
> >         for p in poly:
> >             #seq_order(p[0],attributes)
> >             s = senso(p[0])
> >             print 'Poligono %s: %s' % (i,sensi[s])
> >
> >
> >
> >
> > Il giorno 15 giugno 2011 14:58, Luca Sigfrido Percich
> > <sigfrido a tiscali.it> ha scritto:
> >
> >         Mah, in PostGIS ho trovato solo:
> >
> >         ST_LineCrossingDirection()
> >
> >         che accetta due linestring come parametro. La seconda va
> >         generata dal
> >         congiungendo il punto originale (mypoint) con la proiezione
> >         del punto
> >         sulla prima (mypline):
> >
> >         ST_LineCrossingDirection(
> >                mypline,
> >                st_makeline(
> >                        mypoint,
> >                        ST_Line_Interpolate_Point(
> >                                mypline,
> >                                ST_Line_Locate_Point(
> >                                        mypline,
> >                                        mypoint
> >                                )
> >                        )
> >                )
> >         )
> >
> >         Se restituisce -1, il punto è a sinistra; +1, il punto è a
> >         destra.
> >
> >         Mi pare strano non ci sia qualcosa di più alto livello.
> >
> >         Torno al lavoro, la pausa di divertimento è finita :))))
> >
> >         Sig
> >
> >         Il giorno mer, 15/06/2011 alle 14.36 +0200, Luca Sigfrido
> >         Percich ha
> >         scritto:
> >
> >         > Ciao a tutti,
> >         >
> >         > in teoria si fa così:
> >         >
> >         > - estraggo il linearring del poligono;
> >         > - ne genero il centroide
> >         > - determino la proiezione e la segmentazione del centroide
> >         sulla
> >         > polilinea che corrisponde al linearring.
> >         >
> >         > Se il centroide cade in "destra geometrica", allora l'arco è
> >         > digitalizzato in senso orario; altrimenti, in senso
> >         antiorario.
> >         >
> >         >
> >         > Per proiezione e segmentazione, intendo ad esempio le
> >         funzioni LRS di
> >         > PostGIS (ST_Line_Locate_Point() per la segmentazione, ma non
> >         trovo
> >         > quella che mi dà il lato). Ci sono funzioni analoghe in JTS,
> >         quindi in
> >         > GEOS e quindi in python. Secoli fa scrissi una classe Java
> >         per gestire
> >         > la segmentazione usando JTS, se ti serve te la spedisco, ma
> >         spero che
> >         > qualcuno abbia già implementato una funzione ad alto livello
> >         che dato un
> >         > punto e una polilinea mi dice a che distanza, da che lato e
> >         con che
> >         > proiezione questo cade su quella. Le funzioni JTS lavorano a
> >         livello di
> >         > punto e segmento (2 punti), quindi devi fare un ciclo per
> >         lavorare su
> >         > una linestring.
> >         >
> >         > Fammi sapere se trovi qualcosa, mi interessa molto
> >         (soprattutto mi piace
> >         > l'idea di non dover fare il porting di quanto già
> >         implementato anni fa e
> >         > potermi così dedicare a cose nuove)
> >         >
> >         > Sig
> >         >
> >         >
> >         > Il giorno mer, 15/06/2011 alle 13.00 +0200, marco zanieri ha
> >         scritto:
> >         > > ho provato con la tematizzazione delle coordinate e si
> >         riesce a
> >         > > comprendere l'orientamento...grazie mille Luca; credo
> >         comunque che
> >         > > possa risultare molto utile la possibilità di individuare
> >         la sequenza
> >         > > delle coordinate di una geometria e comunque una procedura
> >         automatica
> >         > > che possa riconoscere la presenza di eventuali isole
> >         (pieni e
> >         > > vuoti)...
> >         > > grazie a tutti
> >         > >
> >         > > Il giorno 15 giugno 2011 12:49, G. Allegri
> >         <giohappy a gmail.com> ha
> >         > > scritto:
> >         > >         Il test del centroide è un test del pirla,
> >         scusate, perché il
> >         > >         centroide può cadere anche fuori dalla
> >         geometria...
> >         > >         Posterò una domanda nell ml di sviluppo ma intanto
> >         lo chiedo
> >         > >         anche qua: come si può sapere l'orientamento di
> >         una geometria
> >         > >         tramite le api di Qgis?
> >         > >
> >         > >         giovanni
> >         > >
> >         > >         Il giorno 15 giugno 2011 12:36, G. Allegri
> >         > >         <giohappy a gmail.com> ha scritto:
> >         > >
> >         > >
> >         > >                 Dall'API di QGis non trovo un metodo per
> >         determinare
> >         > >                 l'orientamento della sequenza di
> >         coordinate... o se si
> >         > >                 tratta di un'isola. Un modo grezzo ma,
> >         credo, efficace
> >         > >                 è lanciare questo script nella console di
> >         Python
> >         > >                 dentro QGis, nel quale faccio un intersect
> >         tra la
> >         > >                 geometria e il suo centroide. Se fossse
> >         un'isola
> >         > >                 dovrebbe tornarmi False... o sbaglio?
> >         > >
> >         > >                 iface = qgis.utils.iface
> >         > >                 lyr = iface.activeLayer()
> >         > >                 prov = lyr.dataProvider()
> >         > >                 attrlist = prov.attributeIndexes()
> >         > >                 prov.select(attrlist)
> >         > >                 feat = QgsFeature()
> >         > >                 for i in range(lyr.featureCount()):
> >         > >                     prov.nextFeature(feat)
> >         > >                     geom = feat.geometry()
> >         > >                     cent = geom.centroid()
> >         > >                     dentro = geom.intersects(cent)
> >         > >                     if (dentro):
> >         > >                         attributes = feat.attributeMap()
> >         > >                         print 'La feature %s contiene una
> >         geometria
> >         > >                 piena' % attributes[0].toInt()[0]
> >         > >                     else:
> >         > >                         print '->>> La feature %s sembra
> >         contenere
> >         > >                 un'isola' % attributes[0].toInt()[0]
> >         > >
> >         > >
> >         > >                 Giovanni
> >         > >
> >         > >
> >         > >
> >         > >
> >         > >
> >         > >                 Il giorno 15 giugno 2011 11:00, marco
> >         zanieri
> >         > >                 <marcozanieri a gmail.com> ha scritto:
> >         > >
> >         > >                         Salve,
> >         > >                         ho un problema con alcune
> >         geometrie areali,
> >         > >                         avrei la necessità di verificare
> >         il senso di
> >         > >                         digitalizzazione (orario:interno
> >         poligono
> >         > >                         pieno; antiorario: interno
> >         poligono vuoto);
> >         > >                         esiste quest possibilità in Qgis?
> >         > >
> >         > >                         Grazie mille,
> >         > >                         marco
> >         > >
> >         > >                         --
> >         > >                                     dott. Marco Zanieri
> >         > >                            e-mail: marcozanieri a gmail.com
> >         > >
> >         > >                                    cartografia tematica
> >         > >                                   banche dati territoriali
> >         > >                              sistemi informativi
> >         geografici
> >         > >                               applicazioni GIS e webGIS
> >         > >
> >         > >
> >         > >
> >         > >
> >         > >
> >         > >
> >         > >
> >         _______________________________________________
> >         > >                         Iscriviti all'associazione
> >         GFOSS.it:
> >         > >
> >         http://www.gfoss.it/drupal/iscrizione
> >         > >                         Gfoss a lists.gfoss.it
> >         > >
> >         http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
> >         > >                         Questa e' una lista di discussione
> >         pubblica
> >         > >                         aperta a tutti.
> >         > >                         Non inviate messaggi commerciali.
> >         > >                         I messaggi di questa lista non
> >         rispecchiano
> >         > >                         necessariamente
> >         > >                         le posizioni dell'Associazione
> >         GFOSS.it.
> >         > >                         518 iscritti al 3.6.2011
> >         > >
> >         > >
> >         > >
> >         > >
> >         > >
> >         > >
> >         > >
> >         > > --
> >         > >             dott. Marco Zanieri
> >         > >    e-mail: marcozanieri a gmail.com
> >         > >
> >         > >            cartografia tematica
> >         > >           banche dati territoriali
> >         > >      sistemi informativi geografici
> >         > >       applicazioni GIS e webGIS
> >         > >
> >         > >
> >         > >
> >         > >
> >         > > _______________________________________________
> >         > > Iscriviti all'associazione GFOSS.it:
> >         http://www.gfoss.it/drupal/iscrizione
> >         > > Gfoss a lists.gfoss.it
> >         > > http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
> >         > > Questa e' una lista di discussione pubblica aperta a
> >         tutti.
> >         > > Non inviate messaggi commerciali.
> >         > > I messaggi di questa lista non rispecchiano
> >         necessariamente
> >         > > le posizioni dell'Associazione GFOSS.it.
> >         > > 518 iscritti al 3.6.2011
> >         >
> >         > _______________________________________________
> >         > Iscriviti all'associazione GFOSS.it:
> >         http://www.gfoss.it/drupal/iscrizione
> >         > Gfoss a lists.gfoss.it
> >         > http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
> >         > Questa e' una lista di discussione pubblica aperta a tutti.
> >         > Non inviate messaggi commerciali.
> >         > I messaggi di questa lista non rispecchiano necessariamente
> >         > le posizioni dell'Associazione GFOSS.it.
> >         > 518 iscritti al 3.6.2011
> >
> >         _______________________________________________
> >         Iscriviti all'associazione GFOSS.it:
> >         http://www.gfoss.it/drupal/iscrizione
> >         Gfoss a lists.gfoss.it
> >         http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
> >         Questa e' una lista di discussione pubblica aperta a tutti.
> >         Non inviate messaggi commerciali.
> >         I messaggi di questa lista non rispecchiano necessariamente
> >         le posizioni dell'Associazione GFOSS.it.
> >         518 iscritti al 3.6.2011
> >
> >
>
>
-------------- parte successiva --------------
Un allegato HTML ? stato rimosso...
URL: <http://lists.gfoss.it/pipermail/gfoss/attachments/20110615/2a4bb1e5/attachment-0001.html>


Maggiori informazioni sulla lista Gfoss