[Gfoss] verifica senso digitalizzazione geometria

G. Allegri giohappy a gmail.com
Mer 15 Giu 2011 15:08:22 CEST


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/4474e7a7/attachment-0001.html>


Maggiori informazioni sulla lista Gfoss