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