<br><br><div class="gmail_quote">Il giorno 15 giugno 2011 15:21, 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>
Ciao Giovanni,<br>
<br>
grazie, questa dell'area non la sapevo. ;)<br>
<br>
Tra l'altro come notavi giustamente il centroide può cadere fuori se il<br>
poligono è convoluto, a meno che l'API specifica non ti fornisca una<br>
funzione che garantisca la posizione del centroide nel poligono, quindi<br>
il metodo da me proposto è rischioso, si dovrebbe sostituire il<br>
centroide ad un qualunque punto sicuramente interno al poligono.<br>
<br>
Sono andato a ripescare una vecchia funzione MapInfo che scrissi per<br>
determinare il verso di rotazione delle coordinate di un linearring:<br>
data la matrice dei punti che lo costituiscono (1..n), e data una<br>
matrice di 4 elementi che contengono gli indici dei punti,<br>
rispettivamente:<br>
1 - y = maxY<br>
2 - x = maxX<br>
3 - y = minY<br>
4 - x = minX<br></blockquote><div><br><br>non ho capito cosa contiene la matrice dei 4 indici....<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<br>
se gli indici contenuti in almeno 3 dei 4 elementi sono crescenti, la<br>
linestring ruota in senso orario.<br>
<br>
Forse computazionalmente meno intensivo (nessuna moltiplicazione) ma<br>
decisamente meno elegante :)<br>
<br>
Proverò a fare il porting in python<br>
<br>
Sig<br>
<br>
<br>
Il giorno mer, 15/06/2011 alle 15.08 +0200, G. Allegri ha scritto:<br>
<div><div></div><div class="h5">> Più semplicemte si può usare il metodo dell'area. Se è positiva è<br>
> 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>
> Il giorno 15 giugno 2011 14:58, Luca Sigfrido Percich<br>
> <<a href="mailto:sigfrido@tiscali.it">sigfrido@tiscali.it</a>> ha scritto:<br>
><br>
>         Mah, in PostGIS ho trovato solo:<br>
><br>
>         ST_LineCrossingDirection()<br>
><br>
>         che accetta due linestring come parametro. La seconda va<br>
>         generata dal<br>
>         congiungendo il punto originale (mypoint) con la proiezione<br>
>         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<br>
>         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<br>
>         Percich ha<br>
>         scritto:<br>
><br>
>         > 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<br>
>         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<br>
>         antiorario.<br>
>         ><br>
>         ><br>
>         > Per proiezione e segmentazione, intendo ad esempio le<br>
>         funzioni LRS di<br>
>         > PostGIS (ST_Line_Locate_Point() per la segmentazione, ma non<br>
>         trovo<br>
>         > quella che mi dà il lato). Ci sono funzioni analoghe in JTS,<br>
>         quindi in<br>
>         > GEOS e quindi in python. Secoli fa scrissi una classe Java<br>
>         per gestire<br>
>         > la segmentazione usando JTS, se ti serve te la spedisco, ma<br>
>         spero che<br>
>         > qualcuno abbia già implementato una funzione ad alto livello<br>
>         che dato un<br>
>         > punto e una polilinea mi dice a che distanza, da che lato e<br>
>         con che<br>
>         > proiezione questo cade su quella. Le funzioni JTS lavorano a<br>
>         livello di<br>
>         > punto e segmento (2 punti), quindi devi fare un ciclo per<br>
>         lavorare su<br>
>         > una linestring.<br>
>         ><br>
>         > Fammi sapere se trovi qualcosa, mi interessa molto<br>
>         (soprattutto mi piace<br>
>         > l'idea di non dover fare il porting di quanto già<br>
>         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<br>
>         scritto:<br>
>         > > ho provato con la tematizzazione delle coordinate e si<br>
>         riesce a<br>
>         > > comprendere l'orientamento...grazie mille Luca; credo<br>
>         comunque che<br>
>         > > possa risultare molto utile la possibilità di individuare<br>
>         la sequenza<br>
>         > > delle coordinate di una geometria e comunque una procedura<br>
>         automatica<br>
>         > > che possa riconoscere la presenza di eventuali isole<br>
>         (pieni e<br>
>         > > vuoti)...<br>
>         > > grazie a tutti<br>
>         > ><br>
>         > > Il giorno 15 giugno 2011 12:49, G. Allegri<br>
>         <<a href="mailto:giohappy@gmail.com">giohappy@gmail.com</a>> ha<br>
>         > > scritto:<br>
>         > >         Il test del centroide è un test del pirla,<br>
>         scusate, perché il<br>
>         > >         centroide può cadere anche fuori dalla<br>
>         geometria...<br>
>         > >         Posterò una domanda nell ml di sviluppo ma intanto<br>
>         lo chiedo<br>
>         > >         anche qua: come si può sapere l'orientamento di<br>
>         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<br>
>         determinare<br>
>         > >                 l'orientamento della sequenza di<br>
>         coordinate... o se si<br>
>         > >                 tratta di un'isola. Un modo grezzo ma,<br>
>         credo, efficace<br>
>         > >                 è lanciare questo script nella console di<br>
>         Python<br>
>         > >                 dentro QGis, nel quale faccio un intersect<br>
>         tra la<br>
>         > >                 geometria e il suo centroide. Se fossse<br>
>         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<br>
>         geometria<br>
>         > >                 piena' % attributes[0].toInt()[0]<br>
>         > >                     else:<br>
>         > >                         print '->>> La feature %s sembra<br>
>         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<br>
>         zanieri<br>
>         > >                 <<a href="mailto:marcozanieri@gmail.com">marcozanieri@gmail.com</a>> ha scritto:<br>
>         > ><br>
>         > >                         Salve,<br>
>         > >                         ho un problema con alcune<br>
>         geometrie areali,<br>
>         > >                         avrei la necessità di verificare<br>
>         il senso di<br>
>         > >                         digitalizzazione (orario:interno<br>
>         poligono<br>
>         > >                         pieno; antiorario: interno<br>
>         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<br>
>         geografici<br>
>         > >                               applicazioni GIS e webGIS<br>
>         > ><br>
>         > ><br>
>         > ><br>
>         > ><br>
>         > ><br>
>         > ><br>
>         > ><br>
>         _______________________________________________<br>
>         > >                         Iscriviti all'associazione<br>
>         GFOSS.it:<br>
>         > ><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>
>         > ><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<br>
>         pubblica<br>
>         > >                         aperta a tutti.<br>
>         > >                         Non inviate messaggi commerciali.<br>
>         > >                         I messaggi di questa lista non<br>
>         rispecchiano<br>
>         > >                         necessariamente<br>
>         > >                         le posizioni dell'Associazione<br>
>         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:<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 aperta a<br>
>         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>
>         > 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 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:<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 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>
<br>
</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>