<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CkEHSXc8fip7ImA9WhRTEk4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532</id><updated>2011-11-02T11:43:58.976+01:00</updated><category term="Garmin 60Cx" /><category term="pft" /><category term="gpsd" /><category term="epsg" /><category term="ogr2ogr" /><category term="traspunto" /><category term="kml" /><category term="d.mon" /><category term="simpleloc" /><category term="GDAL" /><category term="mtk" /><category term="v.clean" /><category term="gpsbabel" /><category term="gps" /><category term="v.to.points" /><category term="bluetooth" /><category term="location" /><category term="g.proj" /><category term="GRASS" /><category term="Topology" /><category term="google earth" /><category term="qgis" /><category term="realtime" /><category term="point in polygon" /><category term="v.distance" /><category term="v.select" /><category term="Ubuntu 8.10" /><category term="wget" /><category term="v.to.db" /><title>Grass, gis e dintorni</title><subtitle type="html">Lavoro e didattica con GRASS e i gis.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/GrassGisEDintorni" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="grassgisedintorni" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;AkIBRHg8eip7ImA9WhdVF0g.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-1439843686754762048</id><published>2011-09-22T21:00:00.000+02:00</published><updated>2011-09-23T08:15:55.672+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-23T08:15:55.672+02:00</app:edited><title>Condividere progetti QGis tra Linux e Windows (memo)</title><content type="html">I motivi per cui si deve (purtroppo) mantenere una partizione windows in una postazione gis sono molti e, per quanto mi riguarda, sono imposti da altri...&lt;br /&gt;
Capita quindi di dover usare in Windows progetti di Quantum Gis creati in Linux; per far questo vado a correggere i percorsi che puntano ai dati con una semplice linea di comando (che scrivo qui per ricordarmela):&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cat nomeProgettoCreatoInLinux.qgs | sed sed 's/\/media\/windows/c:/g' &amp;gt; nuovoNomeProgettoInWin.qgs&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ovvio che i dati devono stare in directories che entrambi i sistemi operativi possano leggere e scrivere; inoltre il percorso di &lt;a href="http://it.wikipedia.org/wiki/Mount"&gt;mount&lt;/a&gt; della partizione windows (nell'esempio: /media/windows) e la lettera ('c:') indicante il disco possono cambiare da pc a pc.&lt;br /&gt;
In windows&amp;nbsp; &lt;a href="http://www.gnu.org/s/sed/"&gt;sed&lt;/a&gt; e &lt;a href="http://www.gnu.org/s/coreutils/manual/html_node/cat-invocation.html"&gt;cat&lt;/a&gt;&amp;nbsp; possono essere forniti&amp;nbsp; dalla shell di grass (nel plugin di grass in QGis) o da &lt;a href="http://www.mingw.org/wiki/MSYS"&gt;MinGW&amp;nbsp; &lt;/a&gt;(Minimalist GNU for Windows) installato insieme a &lt;a href="http://grass.osgeo.org/grass64/binary/mswindows/native/"&gt;grass per Windows &lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-1439843686754762048?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/1439843686754762048/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2011/09/condividere-progetti-qgis-tra-linux-e.html#comment-form" title="1 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/1439843686754762048?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/1439843686754762048?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2011/09/condividere-progetti-qgis-tra-linux-e.html" title="Condividere progetti QGis tra Linux e Windows (memo)" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CEMMQH06eip7ImA9WhdVFk4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-6135381382512018746</id><published>2011-09-21T18:00:00.003+02:00</published><updated>2011-09-21T21:14:41.312+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-21T21:14:41.312+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ogr2ogr" /><title>Riproiettare un'intera cartella di shapefiles da linea di comando (memo)</title><content type="html">Giusto per ricordare a me stesso e, forse, ad altri: riproiettare al volo da linea di comando un'intera cartella di shapefiles:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
for f in inputFolder/*shp; do&amp;nbsp;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shp=$(basename $f)&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ogr2ogr&amp;nbsp; -s_srs '+init=epsg:32632' -t_srs '+init=epsg:4326' \&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outputFolder/${shp} $f&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
done&lt;/div&gt;
&lt;br /&gt;
dove:&lt;br /&gt;
&lt;i&gt;inputFolder&lt;/i&gt; è la cartella con gli shapefiles da riproiettare;&lt;br /&gt;
&lt;i&gt;outputFolder&lt;/i&gt; quella ove verranno memorizzati gli sphapefiles risultato.&lt;br /&gt;
&lt;br /&gt;
Nell'esempio si riproietta da&amp;nbsp; WGS84 UTM32N a WGS84 (gradi decimali).&lt;br /&gt;
&lt;br /&gt;
Ne ho già viste decine e decine di versioni, ma quando serve non&amp;nbsp; mi ricordo mai...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-6135381382512018746?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/6135381382512018746/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2011/09/riproiettare-unintera-cartella-di.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/6135381382512018746?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/6135381382512018746?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2011/09/riproiettare-unintera-cartella-di.html" title="Riproiettare un'intera cartella di shapefiles da linea di comando (memo)" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUIEQ348eSp7ImA9WhdTFEs.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-948520218200041311</id><published>2011-07-12T12:45:00.001+02:00</published><updated>2011-07-12T12:45:02.071+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-12T12:45:02.071+02:00</app:edited><title>Ancora su Garmin e GPSBabel</title><content type="html">&lt;p&gt;In una'installazione fresca di &lt;a name="tex2html1" href="http://www.ubuntu.com/" id=
"tex2html1"&gt;Ubuntu&lt;/a&gt; ho ancora avuto problemi di permessi nel leggere la porta USB alla
quale viene collegato l'apparecchio &lt;a name="tex2html2" href="http://www.garmin.it/" id=
"tex2html2"&gt;garmin&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;
pcgis@pcgis-netbook:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 11.04
Release:        11.04
Codename:       natty
&lt;/pre&gt;

&lt;p&gt;La soluzione è sempre quella indicata nel precedente &lt;a name="tex2html3" href=
"http://appuntigis.blogspot.com/2009/11/garmin-gpsmap-60-cx-e-gpsbabel.html" id=
"tex2html3"&gt;post&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;
pcgis@pcgis-netbook:~$ cat /etc/udev/rules.d/71-garmin.rules 
# # http://wiki.openstreetmap.org/wiki/USB_Garmin_on_GNU/Linux
# # gps garmin con porta usb senza permessi
ATTRS{idVendor}=="091e", ATTRS{idProduct}=="0003", MODE="0660", GROUP="plugdev"
&lt;/pre&gt;

&lt;p&gt;Notare che al nome del file si è dato un numero iniziale più alto (71) di quelli già
presenti nella cartella.&lt;/p&gt;

&lt;p&gt;Leggere il file README presente nella cartelle per &lt;span class="textit"&gt;provare&lt;/span&gt;
a capire il perchè.&lt;/p&gt;
&lt;pre&gt;
pcgis@pcgis-netbook:~$ dir /etc/udev/rules.d/
70-persistent-cd.rules  70-persistent-net.rules  71-garmin.rules  README
&lt;/pre&gt;

&lt;p&gt;Il file gps_garmin risulta già in blacklist:&lt;/p&gt;

&lt;pre&gt;
pcgis@pcgis-netbook:~$ cat /etc/modprobe.d/blacklist.conf | grep gps
blacklist garmin_gps
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-948520218200041311?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/948520218200041311/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2011/07/ancora-su-garmin-e-gpsbabel.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/948520218200041311?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/948520218200041311?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2011/07/ancora-su-garmin-e-gpsbabel.html" title="Ancora su Garmin e GPSBabel" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEMGRn45eSp7ImA9Wx9bFEs.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-4588017619006919095</id><published>2011-02-23T13:00:00.004+01:00</published><updated>2011-02-23T13:00:27.021+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-23T13:00:27.021+01:00</app:edited><title>La mia prima volta... con python</title><content type="html">Ho iniziato a studiare il &lt;a name="tex2html1" href="http://www.python.org/" id=
"tex2html1"&gt;Pyhton&lt;/a&gt;; mi sembra un passaggio obbligato per un utente GIS...:
&lt;span class="textit"&gt;&lt;i&gt;No more excuses to not use Python&lt;/i&gt;&lt;/span&gt; (&lt;a name="tex2html2" href=
"http://www.spatiallyadjusted.com/2011/01/03/2011-the-year-python-takes-over-gis/" id=
"tex2html2"&gt;James Fee&lt;/a&gt;)!

&lt;p&gt;Così ho iniziato con il &lt;a name="tex2html3" href=
"http://docs.python.org/tutorial/index.html" id="tex2html3"&gt;tutorial&lt;/a&gt; e con &lt;a name=
"tex2html4" href="http://diveintopython.org/toc/index.html" id="tex2html4"&gt;Dive Into
Python&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dopo qualche esercizio ho avuto bisogno di qualcosa di più concreto da fare: quale
occasione migliore per ripescare nella memoria qualche confuso ricordo di
cartografia?&lt;/p&gt;

&lt;p&gt;Quel che segue è un brutto codice, sicuramente ridondante...&amp;nbsp;benvenuti i
suggerimenti e le correzioni!&lt;/p&gt;

&lt;p&gt;Quasi tutte le fonti sono citate nei commenti.&lt;/p&gt;
&lt;pre&gt;
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import  division
import math

class ellipsoid():
    """
        b semi-minor axis (polar)
        a semi-major axis (equatorial)
        f flattering
        rf reverse (inverse) flattering
        """
    def __init__(self, a,**kargs):    
        self.a=a
        self.b=None
        ## a sloppy and shallow parsing... 
        if len(kargs)&amp;lt;1:
            exit
        elif 'b' in kargs.keys():
            self.b = kargs['b']
        elif 'f' in kargs.keys():
            self.b =self.a*(1-kargs['f'])
        elif 'rf' in kargs.keys():
            self.b=self.a*(1-1/kargs['rf'])
            
        if 'name' in kargs.keys():
            self.name=kargs['name']
        else:
            self.name=None
            
    def getFirstEccentricity(self):
        """
        first eccentricity = sqrt(1-(b2/a2)**2)
        """
        return math.sqrt(1 - (self.b / self.a) ** 2)

    def getFirstEccentricitySquared(self):
        """
        first eccentricity squared = (a**2-b**2)/a**2
        """
        return (self.a ** 2 - self.b ** 2) / self.a ** 2

    def getSecondEccentricity(self):
        """
        second eccentricity = sqrt((a**2-b**2)/b**2)
        """
        return math.sqrt((self.a ** 2 - self.b ** 2) / self.b ** 2)

    def getSecondEccentricitySquared(self):
        """
        second eccentricity squared (a**2-b**2)/b***2
        """
        return (self.a ** 2 -self.b ** 2) / self.b ** 2

    def getFlattering(self):
        """
        flattering  =(a-b)/a
        """
        return (self.a - self.b) / self.a

    def getInverseFlattering(self):
        """
        inverse flattering =1/f = a/(a-b)
        """
        return 1 / self.getFlattering()

    def getNormal(self, lat):
        """
        prime vertical, normal at latitude lat
        """
        #        return self.a**2/math.sqrt( \    
        #                (self.a*math.cos(lat))**2 + \
        #                (self.b*math.sin(lat))**2)
        return self.a / math.sqrt(\
                1 - self.getFirstEccentricitySquared()*(math.sin(lat)) ** 2)

    def getMeridional(self, lat):
        """
        radius of curvature in the (north-south) meridian at latitude lat 
        """
        #-------------------------------- return (self.a*self.b)**2/math.pow(( \
        #--------------------------------- (self.a*math.cos(lat))**2 + \
        #--------------------------------- (self.b*math.sin(lat))**2), \
        #-------------------------------------------------------- (3/2))
        return (self.a * (1 - self.getFirstEccentricitySquared())) / (\
            math.pow(1 - self.getFirstEccentricitySquared()*(math.sin(lat)) ** 2, 3 / 2))

    def getPolarRadius(self):
        """
        Distance from the Earth's center to the North (or South) Pole
        """
        return self.b

    def getEquatorialRadius(self):
        """
        Distance from the Earth's center to the Equator
        """
        return self.a

    def getEllipsoidArea(self):
        """
        Surface area S of an oblate ellipsoid 
        (generated by an ellipse rotating around its minor axis)
        """
        #        formula from:
        #        http://www.numericana.com/answer/geometry.htm#ovalarea
        area=2 * math.pi * self.a ** 2 * (\
            1 + (self.a / self.b) ** 2 * \
            math.atan(self.getFirstEccentricity()) / \
            (self.getFirstEccentricity()))
        return area

    def getEllipsoidVolume(self):
        """
        Volume v of an oblate ellipsoid 
        (generated by an ellipse rotating around its minor axis)
        """
        vol=(4 / 3) * math.pi * self.a ** 2 * self.b
        return vol

    def getAuthalicRadius(self):
        """
        radius of a hypothetical perfect sphere which has 
        the same ellipsoid surface
        """
        #        formula from:
        #        http://en.wikipedia.org/wiki/Earth_radius#Notable_radii
        return math.sqrt(self.getEllipsoidArea() / (math.pi * 4))
    
    def getVolumetricRadius(self):
        """
        radius of a hypothetical perfect sphere which has 
        the same ellipsoid volume
        """
        #        formula from:
        #        http://en.wikipedia.org/wiki/Earth_radius#Notable_radii
        return math.pow(self.a**2*self.b, 1/3)

    def getGeodeticRadius(self, lat):
        """
        Distance from the Earth's center to a point on the 
        spheroid surface at geodetic latitude lat
        """
        #        formula from:
        #        http://en.wikipedia.org/wiki/Earth_radius#Notable_radii
        gradius= math.sqrt(\
            ((self.a**2 * math.cos(lat))**2 + (self.b**2 * math.sin(lat))**2) / \
            ((self.a * math.cos(lat))** 2 + (self.b * math.sin(lat))** 2))
        return gradius

    def getParallelRadius(self, lat):
        """
        radius of parallel at latitude lat
        """
        return self.getNormal(lat) * math.cos(lat)

    def getParallelArc(self, lat, fromLon, toLon):
        """
        arc of parallel between two longitude (fromLong toLon) at laitutde lat
        """
        return self.normal(lat) * math.cos(lat) * (toLon - fromLon)

    def getMeridianArcDelambre(self,lat):
        """
        arc of meridian from equator to lat
        Delambre series
        """
        e2, e4, e6, e8 = (math.pow(self.getFirstEccentricity(), i) for i in (2, 4, 6, 8))
        k = self.a * (1 - e2)
        A0 = k * (1 + 3 / 4 * e2 + 45 / 64 * e4 + \
                  175 / 256 * e6 + 11025 / 16384 * e8)
        A2 = -(k / 2) * (3 / 4 * e2 + 15 / 16 * e4 + \
                   525 / 512 * e6 + 2205 / 2048 * e8)
        A4 = k / 4 * (15 / 64 * e4 + 105 / 256 * e6 + 2205 / 4096 * e8)
        A6 = -(k / 6) * (35 / 512 * e6 + 315 / 2048 * e8)
        A8 = (k / 8) * (315 / 16348 * e8)
        return A0*lat+A2*math.sin(2*lat)+A4*math.sin(4*lat)+ \
                    A6*math.sin(6*lat)+ A8*math.sin(8*lat)

    def getMeridianArcBessel(self,lat):
        """
        arc of meridian from equator to lat
        Bessel, third flattering
        """
        n=(self.a-self.b)/(self.a+self.b)
        n2,n3,n4,n5=(math.pow(n, i) for i in range(2,6))
        D0=1+(9/4*n**2)+(255/64*n4)
        D2=(3/2*n)+(45/16*n3)+(525/128*n5)
        D4=(15/16*n2)+(105/64*n4)
        D6=(35/48*n3)+(315/256*n5)
        return self.a*(1-n)**2*(1+n)*((D0*lat)-(D2*math.sin(2*lat))+\
                    (D4*math.sin(4*lat))-(D6*math.sin(6*lat)))
    
    def getSferaLocale(self,lat):
        """raggio della sfera locale """
        return math.sqrt(self.getMeridional(lat)*self.getNormal(lat))

if __name__ == "__main__":
    '''qualche dato di prova'''
    bessel=ellipsoid(6377397.155,f=0.003342773154,name='bessel')
    wgs84 = ellipsoid(6378137.0, b=6356752.3142,name='wgs84')
    grs80=ellipsoid(6378137.0,rf=298.257222101,name='grs80')
    ell=[wgs84,bessel,grs80]
    x=bessel.getFlattering()
    lat=44
    lat_rad=math.radians(lat)
    print "Principali caratterisitche di alcuni ellissoidi"
    print "Quando viene richiesto, la latitudine è uguale a {0} gradi".format(lat)
    for e in ell:
        print "========================================================="
        print "Nome: {0}".format(e.name)
        print "Flattering \'f\': {0}".format(e.getFlattering())
        print "Inverse flatteirng \'rf\': {0}".format(e.getInverseFlattering())
        print 'Eccentricità'.rjust(30,'-')
        print "Eccentricità: {0}"\
            .format(e.getFirstEccentricity())
        print "Eccentricità al quadrato: {0}"\
            .format(e.getFirstEccentricitySquared())
        print "Eccentricità seconda: {0}"\
            .format(e.getSecondEccentricity())
        print "Eccentricità seconda al quadrato: {0}"\
            .format(e.getSecondEccentricitySquared())
        print 'Raggi'.rjust(30,'-')
        print "Raggio equatoriale \'a\': {0}".format(e.a)
        print "Raggio polare \'b\': {0}".format(e.b)
        print "Raggio geodetico: {0:.15}"\
            .format(e.getGeodeticRadius(lat_rad))
        print "Gran normale alla latitudine di {0} gradi: {1}"\
            .format(lat,e.getNormal(lat_rad))
        print "Raggio di curvatura del meridiano alla latitudine di {0} gradi: {1}"\
            .format(lat, e.getMeridional(lat_rad))
        print "Raggio di curvatura del parallelo alla latitudine di {0} gradi: {1}"\
            .format(lat, e.getParallelRadius(lat_rad))
        print "Raggio di una sfera di area equivalente: {0}"\
            .format(bessel.getAuthalicRadius())
        print "Raggio di una sfera di volume equivalente: {0}"\
            .format(bessel.getVolumetricRadius())
        print "Raggio della sfera locale alla  latitudine di {0} gradi: {1}"\
            .format(lat,bessel.getSferaLocale(lat_rad))
        print 'Archi di meridiano'.rjust(30,'-')
        print "Arco di meridiano dall'equatore alla latitudine di {0} gradi (Bessel): {1}"\
            .format(lat,e.getMeridianArcBessel(lat_rad))
        print "Arco di meridiano dall'equatore alla latitudine di {0} gradi (Delambre): {1}"\
            .format(lat,e.getMeridianArcDelambre(lat_rad))
&lt;/pre&gt;&lt;br /&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-4588017619006919095?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/4588017619006919095/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2011/02/la-mia-prima-volta-con-python.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/4588017619006919095?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/4588017619006919095?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2011/02/la-mia-prima-volta-con-python.html" title="La mia prima volta... con python" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Dk8GQXg5eyp7ImA9WxFXE00.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-6588590928938192864</id><published>2010-05-19T23:31:00.001+02:00</published><updated>2010-05-19T23:33:40.623+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-19T23:33:40.623+02:00</app:edited><title>QLandkarte GT e lo screenshot capovolto</title><content type="html">Da
qualche tempo uso l'ottimo programma &lt;a
href="http://www.qlandkarte.org/" target="_blank"&gt;QLandKarte GT&lt;/a&gt;&amp;nbsp;
per gestire il GPS &lt;a href="http://www.garmin.com/garmin/cms/site/us"
target="_blank"&gt;Garmin&lt;/a&gt;.&lt;br&gt;
Una funzionalità che può servire è quella della cattura della schermata
del dispositivo.&lt;br&gt;
Non so per quale strana ragione, ma da quando ho aggiornato il sistema
ad &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu Lucid&lt;/a&gt; lo screenshot
ottenuto è ruotato e rispecchiato orizzontalmente (ma forse l'aggiornamento è del tutto ininfluente). &lt;br&gt;
È comunque facile, con &lt;a
href="http://www.imagemagick.org/script/index.php"&gt;ImageMagick&lt;/a&gt;
convertire gli screenshots ottenuti:&lt;br&gt;
&lt;span style="font-family: monospace;"&gt;convert -rotate 180 -flop
screen_bad.png screen_ok.png&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;!--due figure--&gt;
&lt;!--tutte su una riga--&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;!--seconda figura--&gt;&lt;a
href="http://picasaweb.google.it/lh/photo/ZC2vWUUFA58eCkmmfIOLfw?feat=embedwebsite"&gt;
&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/S_RTsFQm1aI/AAAAAAAAAgg/nSQ3CgLq0Ss/s800/qland_scr_bad.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--prima figura--&gt; &lt;a
href="http://picasaweb.google.it/lh/photo/3iDan9czMLvs4vIaMDDafQ?feat=embedwebsite"
target="Picasa album"&gt; &lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/S_RTr9YXbAI/AAAAAAAAAgc/Bg5kcv8tkTI/s800/qland_scr_ok.png"&gt;
&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla prima foto--&gt; &lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: left;"&gt;
Screenshot capovolto &lt;/td&gt;
&lt;!--commento alla seconda foto--&gt; &lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: left;"&gt;
...corretto con&amp;nbsp;&lt;a
href="http://www.imagemagick.org/script/index.php" target="_blank"&gt;ImageMagick&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-6588590928938192864?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/6588590928938192864/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2010/05/qlandkarte-gt-e-lo-screenshot-capovolto.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/6588590928938192864?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/6588590928938192864?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2010/05/qlandkarte-gt-e-lo-screenshot-capovolto.html" title="QLandkarte GT e lo screenshot capovolto" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_87lofqKSw4A/S_RTsFQm1aI/AAAAAAAAAgg/nSQ3CgLq0Ss/s72-c/qland_scr_bad.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkcDR3o4eyp7ImA9WxBXF0w.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-7153135264514104596</id><published>2010-01-27T19:02:00.002+01:00</published><updated>2010-01-28T21:21:16.433+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-28T21:21:16.433+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ogr2ogr" /><category scheme="http://www.blogger.com/atom/ns#" term="kml" /><title>Da Shapefile a KML</title><content type="html">Alcune brevi note sulla conversione di uno shapefile in un file &lt;a
href="http://code.google.com/intl/it-IT/apis/kml/documentation/"
target="_blank"&gt;kml&lt;/a&gt; per &lt;a href="http://earth.google.it/"
target="_blank"&gt;Google Earth&lt;/a&gt;.&lt;br&gt;
Si voglia, ad esempio, visualizzare le aree protette del Piemonte su &lt;a
href="http://earth.google.it/" target="_blank"&gt;Google Earth&lt;/a&gt;,
partendo da uno shapefile nel sistema &lt;a
href="http://en.wikipedia.org/wiki/ED50" target="_blank"&gt;UTM
ED50&lt;/a&gt; (codice &lt;a href="http://spatialreference.org/ref/epsg/23032/"
target="_blank"&gt;epsg 23032&lt;/a&gt;).&lt;br&gt;
&lt;br&gt;
Scaricare il file parchi_ed50.zip da &lt;a
href="http://gis.csi.it/parchi/datigeo_ap.htm" target="_blank"&gt;questo&lt;/a&gt;
indirizzo; scompattare il file con unzip:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;unzip
parchi_ed50.zip&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Un solo comando con&amp;nbsp;&lt;a href="http://www.gdal.org/ogr2ogr.html"
target="_blank"&gt;ogr2ogr&lt;/a&gt; è sufficiente per ottenere il file &lt;a
href="http://code.google.com/intl/it-IT/apis/kml/documentation/"
target="_blank"&gt;kml&lt;/a&gt; delle aree protette:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;ogr2ogr
-f&amp;nbsp; "KML" -s_srs '+init=epsg:23032
+towgs84=-87.000,-98.000,-121.000'&amp;nbsp; \&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
-t_srs '+init=epsg:4326' parchi_1.kml parchi_ed50.shp&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;br&gt;
Una lettura del manuale in linea di &lt;a
href="http://www.gdal.org/ogr2ogr.html" target="_blank"&gt;ogr2ogr&lt;/a&gt;
potrà aiutare la comprensione.&lt;br&gt;
Si può scindere l'operazione in due parti; la prima è la conversione
dal sistema (proiettato) UTM con datum ED50 al sistema geografico WGS84
(&lt;a href="http://spatialreference.org/ref/epsg/4326/" target="_blank"&gt;codice
epsg 4326&lt;/a&gt;):&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;ogr2ogr
-s_srs '+init=epsg:23032 +towgs84=-87.000,-98.000,-121.000' \&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -t_srs '+init=epsg:4326'&amp;nbsp; parchi_wgs84.shp
parchi_ed50.shp&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
da notare i parametri&amp;nbsp; &lt;span
style="font-family: Courier New,Courier,monospace;"&gt;towgs84=-87.000,-98.000,-121.000&lt;/span&gt;
necessari
per una corretta trasformazione (vedere &lt;a
href="http://appuntigis.blogspot.com/2008/12/in-un-precedente-post-ho-usato-ogr2ogr.html"
target="_blank"&gt;questo&lt;/a&gt; precedente post).&lt;br&gt;
&lt;br&gt;
La seconda operazione è la trasformazione dello shapefile in&amp;nbsp; &lt;a
href="http://code.google.com/intl/it-IT/apis/kml/documentation/"
target="_blank"&gt;kml&lt;/a&gt; :&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;ogr2ogr -f
"KML" parchi_2.kml parchi_wgs84.shp&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.gdal.org/ogr2ogr.html" target="_blank"&gt;ogr2ogr&lt;/a&gt;&amp;nbsp;
offre la possibilità di impostare interrogazioni &lt;a
href="http://www.gdal.org/ogr/ogr_sql.html" target="_blank"&gt;SQL&lt;/a&gt;;
ad
esempio, se si vuole un file &lt;a
href="http://code.google.com/intl/it-IT/apis/kml/documentation/"
target="_blank"&gt;kml&lt;/a&gt; con il solo poligono riguardante
l'area protetta denominata 'confluenza del Varaita' impartire il
comando:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;ogr2ogr -f
"KML" -sql "SELECT * FROM parchi_wgs84 WHERE LOCALITA='confluenza del
Varaita'" \&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
-dsco NameField=LOCALITA conf_varaita.kml parchi_wgs84.shp&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Le &lt;a
href="http://code.google.com/intl/it-IT/apis/kml/documentation/kmlreference.html"
target="_blank"&gt;specifiche kml&lt;/a&gt; definiscono un campo denominato
'name' che
contiene il nome dell'elemento (nel nostro caso un poligono); l'opzione
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;-dsco&lt;/span&gt;
imposta 'name' al contenuto del campo 'LOCALITA'.&lt;br&gt;
&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/XfiW4RB2pwhs1481EJ6nhQ?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/S2B-orQeBZI/AAAAAAAAAfA/6b7ZAv--ua8/s400/Google_Earth.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
Un analogo risultato si può ottenere con il &lt;a
href="http://qgis.org/en/download/plugins.html" target="_blank"&gt;plugin&lt;/a&gt;
&lt;em&gt;OGR Layer converter&lt;/em&gt; di &lt;a href="http://www.qgis.org/" target="_blank"&gt;Quantum
Gis&lt;/a&gt; :&lt;br&gt;
&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/7Znmh7QD9CP8q8N2tdlLYQ?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/S2B98aOrVII/AAAAAAAAAe8/XZx8lvWBpiU/s400/qgis_ogr2layer.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-7153135264514104596?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/7153135264514104596/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2010/01/da-shapefile-kml.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7153135264514104596?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7153135264514104596?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2010/01/da-shapefile-kml.html" title="Da Shapefile a KML" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_87lofqKSw4A/S2B-orQeBZI/AAAAAAAAAfA/6b7ZAv--ua8/s72-c/Google_Earth.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkIMSHY5eCp7ImA9WxBQFkg.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-8323182447296539856</id><published>2010-01-06T18:28:00.001+01:00</published><updated>2010-01-16T15:03:09.820+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-16T15:03:09.820+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GDAL" /><category scheme="http://www.blogger.com/atom/ns#" term="qgis" /><title>Qgis 1.4: interfaccia alle utilities GDAL.</title><content type="html">&lt;a href="http://www.qgis.org/" target="_blank"&gt;Qgis 1.4&lt;/a&gt; presenta
numerose nuove funzionalità. La prima ad essere apprezzata è stata
l'interfaccia a molte utilities della libreria &lt;a
href="http://www.gdal.org/gdal_utilities.html" target="_blank"&gt;gdal&lt;/a&gt;
delle quali non ricordo quasi mai la sintassi: in pratica un
compositore&amp;nbsp; che facilita enormemente l'immissione corretta di
righe di comando.&lt;br&gt;
&lt;br&gt;
Ecco un esempio:&lt;br&gt;
&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/CeRYbeupMT09wwFyaujOMA?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/S0THIg-0O1I/AAAAAAAAAdo/r12iWgf4CW4/s400/gdalWarp.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
Il comando così composto può essere eseguito subito, oppure copiato ed
incollato in uno script.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-8323182447296539856?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/8323182447296539856/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2010/01/qgis-14-interfaccia-alle-utilities-gdal.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/8323182447296539856?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/8323182447296539856?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2010/01/qgis-14-interfaccia-alle-utilities-gdal.html" title="Qgis 1.4: interfaccia alle utilities GDAL." /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_87lofqKSw4A/S0THIg-0O1I/AAAAAAAAAdo/r12iWgf4CW4/s72-c/gdalWarp.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkEGQXc7fyp7ImA9WxBQFkg.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-1182043239316501084</id><published>2009-12-30T22:59:00.003+01:00</published><updated>2010-01-16T15:03:40.907+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-16T15:03:40.907+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GDAL" /><category scheme="http://www.blogger.com/atom/ns#" term="qgis" /><title>Qgis e la sorgente dati non valida.</title><content type="html">Raramente uso &lt;a href="http://www.qgis.org/" target="_blank"&gt;Qgis&lt;/a&gt;
per l'elaborazione di raster memorizzati in mapset di&amp;nbsp;&lt;a
href="http://grass.osgeo.org/" target="_blank"&gt;GRASS&lt;/a&gt;; ho quindi,
per lungo tempo, sopportato passivamente l'errore che ricevevo quando
tentavo di caricare un raster di &lt;a href="http://grass.osgeo.org/"
target="_blank"&gt;GRASS&lt;/a&gt; in &lt;a href="http://www.qgis.org/"
target="_blank"&gt;Qgis&lt;/a&gt;: &lt;span
style="font-family: Courier New,Courier,monospace;"&gt;sorgente dati non
valida&lt;/span&gt;.&lt;br&gt;
L'ultima versione di &lt;a href="http://www.qgis.org/" target="_blank"&gt;Qgis&lt;/a&gt;
("Enceladus") è però molto ricca&amp;nbsp; e l'uso della shell di &lt;a
href="http://grass.osgeo.org/" target="_blank"&gt;GRASS&lt;/a&gt; nel plugin
per &lt;a href="http://www.qgis.org/" target="_blank"&gt;Qgis&lt;/a&gt; pare uno
strumento efficace; ho fatto allora&amp;nbsp; qualche tentativo (positivo)
per risolvere il problema dei raster. &lt;br&gt;
&lt;br&gt;
Ecco gli appunti (non è...&lt;span style="font-style: italic;"&gt; oro colato&lt;/span&gt;)
di una soluzione poco ortodossa e temporanea:&lt;br&gt;
&lt;br&gt;
&amp;nbsp;Linux Ubuntu Karmic; nel file &lt;span
style="font-family: Courier New,Courier,monospace;"&gt;sources.list&lt;/span&gt;
ho, tra gli altri, questi repositories:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;deb
http://ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubuntu karmic main&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;deb-src
http://ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubuntu karmic main&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Per il gioco delle dipendenze, nel sistema sono installati questi files:&lt;br&gt;
&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;/usr/lib/gdal15plugins/gdal_GRASS.so&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;/usr/lib/gdal15plugins/ogr_GRASS.so&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;br style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;/usr/lib/gdal16plugins/ogr_GRASS.so&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;/usr/lib/gdal16plugins/gdal_GRASS.so&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;br&gt;
Sospetto che i due pacchetti &lt;a href="http://www.gdal.org/"
target="_blank"&gt;gdal&lt;/a&gt; vadano in conflitto; rinomino il pacchetto
meno aggiornato e creo un link:&lt;br&gt;
&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;pcgis@laptop:/usr/lib/gdal15plugins$
sudo mv gdal_GRASS.so copia_di_gdal_GRASS.so&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;pcgis@laptop:/usr/lib/gdal15plugins$
sudo ln -s /usr/lib/gdal16plugins/gdal_GRASS.so&amp;nbsp; gdal_GRASS.so&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.qgis.org/" target="_blank"&gt;Qgis 1.4&lt;/a&gt; ora carica
senza problemi&amp;nbsp; i raster di&amp;nbsp; &lt;a
href="http://grass.osgeo.org/" target="_blank"&gt;GRASS&lt;/a&gt;:&lt;br&gt;
&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/4Uu85A85ZRZTxsnIHcsSCQ?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SzvMU9fDczI/AAAAAAAAAdk/NR3AGe4pw94/s400/rasterGrassInQgis.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-1182043239316501084?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/1182043239316501084/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/12/qgis-e-la-sorgente-dati-non-valida.html#comment-form" title="1 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/1182043239316501084?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/1182043239316501084?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/12/qgis-e-la-sorgente-dati-non-valida.html" title="Qgis e la sorgente dati non valida." /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_87lofqKSw4A/SzvMU9fDczI/AAAAAAAAAdk/NR3AGe4pw94/s72-c/rasterGrassInQgis.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CkEBRHg_eyp7ImA9WxBQFkg.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-364866250987050403</id><published>2009-12-21T14:54:00.005+01:00</published><updated>2010-01-16T15:04:15.643+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-16T15:04:15.643+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Garmin 60Cx" /><category scheme="http://www.blogger.com/atom/ns#" term="qgis" /><category scheme="http://www.blogger.com/atom/ns#" term="gps" /><category scheme="http://www.blogger.com/atom/ns#" term="gpsbabel" /><title>GPS Garmin in Windows:  i due (+1) indispensabili</title><content type="html">Dare gli strumenti indispensabili, facili da installare e &lt;em&gt;liberi&lt;/em&gt;,
&amp;nbsp;per&amp;nbsp; lavorare in
Windows con apparecchi&amp;nbsp; GPS in... &lt;em&gt;un'ottica GIS&lt;/em&gt;...:
brevi istruzioni per l'uso rivolte a nuovi&amp;nbsp; utenti (entry
level).&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;&lt;a
 href="http://www8.garmin.com/support/download_details.jsp?id=209"
 target="_blank"&gt;Map Source&lt;/a&gt;&lt;/h3&gt;
Non essendo &lt;em&gt;libero&lt;/em&gt; e &lt;em&gt;facile da
installare&lt;/em&gt; non dovrebbe essere menzionato in questo post; un
accenno, però, occorre farlo. Considero &lt;a
 href="http://www8.garmin.com/support/download_details.jsp?id=209"
 target="_blank"&gt;Map Source&lt;/a&gt; utiile nel solo caso si
debbano gestire mappe acquistate da &amp;nbsp;&lt;a
 href="http://www.garmin.com/garmin/cms/site/us" target="_blank"&gt;Garmin&lt;/a&gt;:
pare che questo software&amp;nbsp;
si&amp;nbsp; preoccupi in modo quasi maniacale di tutto ciò che
riguarda
autenticazione, sblocco e registrazione&amp;nbsp; delle mappe
acquistate&amp;nbsp;tralasciando di fornire all'utente un prodotto...
utile
e fruibile in tutte le occasioni di normale utilizzo (download
&amp;nbsp;e
upload di waypoitns, tracce, rotte). &amp;nbsp;Per quanto l'esperienza
di chi scrive, l'utilità di &lt;a
 href="http://www8.garmin.com/support/download_details.jsp?id=209"
 target="_blank"&gt;Map Source&lt;/a&gt; inizia e finisce nel
momento in cui, dopo una lunga e cervellotica&amp;nbsp; fase di
autenticazione nella quale vengono richiesti 3-4 codici di attivazione,
le mappe acquistate sono sbloccate e possono essere caricate nel GPS.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&lt;h3&gt;&lt;a href="http://www.qgis.org/index.php"
 target="_blank"&gt;Quantum Gis&lt;/a&gt;&lt;/h3&gt;
&lt;a href="http://www.qgis.org/index.php" target="_blank"&gt;Qgis&lt;/a&gt;
può essere scaricato da &lt;a
 href="http://www.qgis.org/en/download/current-software.html"
 target="_blank"&gt;qui&lt;/a&gt;: consiglio di scegliere il
file denominato QGIS-1.3.0-3-No-GrassSetup.exe (o un analogo file con
un numero più recente di versione). Scaricarlo ed installarlo
accettando la licenza ed ogni altra
preimpostazione (non è necessario scaricare i set di dati di esempio
proposti durante l'installazione).&lt;br&gt;
&lt;br&gt;
Una guida introduttiva a&amp;nbsp;&amp;nbsp;&lt;a
 href="http://www.qgis.org/index.php" target="_blank"&gt;Qgis&lt;/a&gt;
può essere trovata &lt;a
 href="http://www.qgis.org/en/documentation/manuals.html"
 target="_blank"&gt;qui&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Il plugin GPS di &lt;a href="http://www.qgis.org/index.php"
 target="_blank"&gt;Qgis&lt;/a&gt; sfrutta &lt;a
 href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt;, un altro
programma&amp;nbsp;
che deve essere presente &amp;nbsp;(installato) nel sistema.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;&lt;a href="http://www.gpsbabel.org/" target="_blank"&gt;&lt;span
 style="font-weight: bold;"&gt;&lt;/span&gt;Gpsbabel&lt;/a&gt;&lt;/h3&gt;
A giudizio di chi scrive, &lt;a href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt;
è
uno tra i migliori software&amp;nbsp;per lavorare con i&amp;nbsp; GPS.&lt;br&gt;
Scaricare da &lt;a href="http://www.gpsbabel.org/download.html"
 target="_blank"&gt;qui&lt;/a&gt; il file denominato &lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;gpsbabel-1.3.6.zip&lt;/span&gt;
(o un analogo file con
un numero più recente di versione). Per l'installazione:&lt;br&gt;
&lt;ol&gt;
  &lt;li&gt;creare una cartella sull'Hard disk (ad esempio: &lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;C:\Programmi\gpsbabel&lt;/span&gt;)&lt;/li&gt;
  &lt;li&gt;scomapttare&amp;nbsp; il file &amp;nbsp; &lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;gpsbabel-1.3.6.zip&lt;/span&gt;
nella cartella appena creata; alla fine di questa operazione il
contenuto di quest'ultima dovrebbe presentarsi così: &amp;nbsp;
    &lt;table style="width: auto;"&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;a
 href="http://picasaweb.google.com/lh/photo/DCK0Hds1Qk24VYdgl5ji_w?feat=embedwebsite"&gt;&lt;img
 src="http://lh3.ggpht.com/_87lofqKSw4A/Sy9_ob_i-DI/AAAAAAAAAb4/pOUjy7US4Bo/s400/gpsBabelFolder.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td
 style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
          &lt;a
 href="http://picasaweb.google.com/pcraveri/Gps?feat=embedwebsite"&gt;gps&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt;
ha due eseguibili: &lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;GPSBabelGUI.exe&lt;/span&gt;
&amp;nbsp;che è un'interaccia grafica ; &lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;gpsbabel.exe&lt;/span&gt;
che è il vero e proprio motore, eseguibile all'interno della finestra &lt;a
 href="http://en.wikipedia.org/wiki/MS-DOS#The_Windows_command-line_interface"
 target="_blank"&gt;MS-DOS di Windows&lt;/a&gt; ;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt;
, pur essendo installato, può essere - al momento - eseguito solo dalla
cartella ove sono collocati i files (nell'esempio:
C:\Programmi\gpsbabel). Per rendere disponibili le sue funzionalità
all'esterno di questa cartella e per tutti&amp;nbsp; gli altri
programmi che lo utilizzano (ad es.&amp;nbsp; &lt;a
 href="http://www.qgis.org/" target="_blank"&gt;qgis&lt;/a&gt;),
occorre&amp;nbsp; inserire il percorso degli eseguibili di &lt;a
 href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt; nella
variabile di sistema &lt;a
 href="http://it.wikipedia.org/wiki/Variabile_d%27ambiente_%28Windows%29#PATH"
 target="_blank"&gt;&lt;em&gt;&lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;path&lt;/span&gt;&lt;/em&gt;&lt;/a&gt;;&amp;nbsp;
per far ciò (in Windows XP):&lt;br&gt;
Impostazioni-&amp;gt;pannello dai
controllo-&amp;gt;sistema-&amp;gt;avanzate-&amp;gt;variabili di
ambiente: &amp;nbsp;nella casella &amp;nbsp;&lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;Variabili
di sistema&lt;/span&gt; selezionare &amp;nbsp;&lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;Path&lt;/span&gt;
e modificarlo, aggiungendo alla linea il percorso ove sono
stati installati gli eseguibili di &lt;a
 href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt;
(nell'esempio: C:\Programmi\gpsbabel; ricordarsi di separare i diversi
percorsi con ";")&amp;nbsp;
    &lt;table style="width: auto;"&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;a
 href="http://picasaweb.google.com/lh/photo/OxRrs7NFQ8sFY2rBvUH81g?feat=embedwebsite"&gt;&lt;img
 src="http://lh4.ggpht.com/_87lofqKSw4A/Sy9ebCTE2VI/AAAAAAAAAaw/unT2Q4vSikE/s400/gpsBabelSetPath.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
  &lt;li&gt;a questo punto &lt;a href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt;
dovrebbe funzionare...&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;attraverso la riga di comando della finestra&amp;nbsp;&lt;a
 href="http://en.wikipedia.org/wiki/MS-DOS#The_Windows_command-line_interface"
 target="_blank"&gt;MS-DOS di Windows&lt;/a&gt; :&amp;nbsp;
      &lt;table style="width: auto;"&gt;
        &lt;tbody&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a
 href="http://picasaweb.google.com/lh/photo/B0XCkPzVgOJOJcpx7XKO1Q?feat=embedwebsite"&gt;&lt;img
 src="http://lh6.ggpht.com/_87lofqKSw4A/Sy9jm0J3iJI/AAAAAAAAAa4/CEJoaW7ZJoM/s400/gpsBabelCLI.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
      &lt;br&gt;
    &lt;/li&gt;
    &lt;li&gt;attraverso l'interfaccia grafica di &lt;a
 href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt;
&amp;nbsp;(doppio click su &lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;GPSBabelGUI.exe&lt;/span&gt;
nella cartella &lt;span
 style="font-family: Courier New,Courier,monospace;"&gt;C:\Programmi\gpsbabel
      &lt;/span&gt;oppure creare un link sul desktop)&amp;nbsp;
      &lt;table style="width: auto;"&gt;
        &lt;tbody&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a
 href="http://picasaweb.google.com/lh/photo/yFlIUIw8C79I_Vmrkich1A?feat=embedwebsite"&gt;&lt;img
 src="http://lh3.ggpht.com/_87lofqKSw4A/Sy95jgllJaI/AAAAAAAAAbY/hSa6wXJr_ro/s400/gpsBabelGuiWorking.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td
 style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
            &lt;a
 href="http://picasaweb.google.com/pcraveri/Gps?feat=embedwebsite"&gt;gps&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/li&gt;
    &lt;li&gt;attraverso il plugin GPS di &lt;a
 href="http://www.qgis.org/" target="_blank"&gt;qgis&lt;/a&gt;:&amp;nbsp;
      &lt;table style="width: auto;"&gt;
        &lt;tbody&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a
 href="http://picasaweb.google.com/lh/photo/d9J1HUtKEkMLRZSnbSPgXA?feat=embedwebsite"&gt;&lt;img
 src="http://lh3.ggpht.com/_87lofqKSw4A/Sy97NSfO5_I/AAAAAAAAAbk/5dOHNxwAMJo/s400/qgisGPS_plugin.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td
 style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;&lt;a
 href="http://picasaweb.google.com/pcraveri/Gps?feat=embedwebsite"&gt;&lt;br&gt;
            &lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
      &lt;table style="width: auto;"&gt;
        &lt;tbody&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a
 href="http://picasaweb.google.com/lh/photo/D2f3_FVf68IZxJV7udwerA?feat=embedwebsite"&gt;&lt;img
 src="http://lh3.ggpht.com/_87lofqKSw4A/Sy97NRIme6I/AAAAAAAAAbo/ZGUkXfdzXII/s400/qgisGPS_ScaricaTrack.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td
 style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;&lt;a
 href="http://picasaweb.google.com/pcraveri/Gps?feat=embedwebsite"&gt;&lt;br&gt;
            &lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
      &lt;table style="width: auto;"&gt;
        &lt;tbody&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;a
 href="http://picasaweb.google.com/lh/photo/Mud9gRfMn6VDXpt8mAoUfw?feat=embedwebsite"&gt;&lt;img
 src="http://lh6.ggpht.com/_87lofqKSw4A/Sy97NuKs-qI/AAAAAAAAAbs/WKrtO8rK9Ug/s400/qgisGPS_tracciaScaricata.jpg"&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td
 style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/ol&gt;
&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;a
 href="http://www.dnr.state.mn.us/mis/gis/tools/arcview/extensions/DNRGarmin/DNRGarmin.html"
 target="_blank"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-364866250987050403?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/364866250987050403/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/12/gps-garmin-in-windows-i-due-1.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/364866250987050403?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/364866250987050403?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/12/gps-garmin-in-windows-i-due-1.html" title="GPS Garmin in Windows:  i due (+1) indispensabili" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_87lofqKSw4A/Sy9_ob_i-DI/AAAAAAAAAb4/pOUjy7US4Bo/s72-c/gpsBabelFolder.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkQFQH4_eip7ImA9WxBRE0U.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-5623923280548381705</id><published>2009-12-19T16:59:00.001+01:00</published><updated>2010-01-01T22:11:51.042+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-01T22:11:51.042+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GRASS" /><category scheme="http://www.blogger.com/atom/ns#" term="gpsd" /><category scheme="http://www.blogger.com/atom/ns#" term="realtime" /><title>GRASS, gpsd, l'MTK e il bluetooth</title><content type="html">Nel &lt;a
href="http://appuntigis.blogspot.com/2009/12/mtk-gpsd-via-bluetooth.html"
target="_blank"&gt;precedente post&lt;/a&gt; si è visto come connetere l'&lt;a
href="http://www.transystem.com.tw/products/index_list.php?mcat_no=2&amp;amp;cat_no=33&amp;amp;ver=en"
target="_blank"&gt;MTK 747 Transystem&lt;/a&gt; a&amp;nbsp;&amp;nbsp;&lt;a
href="http://gpsd.berlios.de/"&gt;gpsd&lt;/a&gt; via bluetooth in &lt;a
href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu 9.10&lt;/a&gt;.&lt;br&gt;
Ecco un semplice memo di come utilizzare la connessione in real-time in
&lt;a href="http://grass.osgeo.org/" target="_blank"&gt;GRASS&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Lanciare &lt;a href="http://grass.osgeo.org/" target="_blank"&gt;GRASS&lt;/a&gt;
in un terminale ed entrare in una location con sistema di riferimento
cartografico noto; dal terminale di &lt;a href="http://grass.osgeo.org/"
target="_blank"&gt;GRASS&lt;/a&gt; lanciare &lt;a href="http://gpsd.berlios.de/"&gt;gpsd&lt;/a&gt;
e quindi &lt;a href="http://gpsd.berlios.de/gpspipe.html" target="_blank"&gt;gpspipe&lt;/a&gt;:&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/ZR_R_E8PltRSMXn8WYKIbg?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/Syzwla0o4-I/AAAAAAAAAZ4/XxDPUdFtbuQ/s144/gpsdInGrass.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
Ora, con semplici comandi della shell è possibile ottenere in real-time
diverse elaborazioni; per esempio con:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;gpspipe -w -n
30 | grep 'GGA' | awk 'BEGIN{FS=" "}{print $5,$4}' |\&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&amp;nbsp;m.proj
-i --q | awk '{sx+=$1;sy+=$2}END{ print " posizione media: ", sx/NR,
sy/NR " samples: ", NR }'&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
si riproiettano (&lt;a
href="http://grass.osgeo.org/grass64/manuals/html64_user/m.proj.html"
target="_blank"&gt;m.proj&lt;/a&gt;) le coordinate (Latitudine e Longitudine)
inviate dal ricevitore nel sistema cartografico di riferimento della
location corrente (nell'esempio: &lt;a
href="http://spatialreference.org/ref/epsg/32632/" target="_blank"&gt;epsg:
32632&lt;/a&gt;),&amp;nbsp; viene calcolata&amp;nbsp; la posizione media del
ricevitore collegato al pc e si stampa a video il risultato.&lt;br&gt;
&lt;br&gt;
Complicando ulteriormente l'esempio, è possibile editare in real-time,
catturando il punto in un vettoriale:&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/hPoJIM2RC3zNrD4fIX_onw?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh4.ggpht.com/_87lofqKSw4A/Syz1TZIyFgI/AAAAAAAAAZ8/sUqAVE06j1U/s144/gpsd2Grass_editing.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
Per le &lt;em&gt;frasi&lt;/em&gt;&amp;nbsp; &lt;a
href="http://it.wikipedia.org/wiki/NMEA_0183" target="_blank"&gt;NMEA&lt;/a&gt;&amp;nbsp;
è possibile consultare &lt;a href="http://gpsd.berlios.de/NMEA.txt"
target="_blank"&gt;questo link&lt;/a&gt;. &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-5623923280548381705?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/5623923280548381705/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/12/grass-gpsd-lmtk-e-il-bluetooth.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/5623923280548381705?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/5623923280548381705?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/12/grass-gpsd-lmtk-e-il-bluetooth.html" title="GRASS, gpsd, l'MTK e il bluetooth" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_87lofqKSw4A/Syzwla0o4-I/AAAAAAAAAZ4/XxDPUdFtbuQ/s72-c/gpsdInGrass.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0cBRH46fCp7ImA9WxBRE0U.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-2559813737186140077</id><published>2009-12-19T16:14:00.001+01:00</published><updated>2010-01-01T22:24:15.014+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-01T22:24:15.014+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mtk" /><category scheme="http://www.blogger.com/atom/ns#" term="bluetooth" /><category scheme="http://www.blogger.com/atom/ns#" term="gpsd" /><title>MTK, GPSD via bluetooth</title><content type="html">Brevi note per connettere l'&lt;a
href="http://www.transystem.com.tw/products/index_list.php?mcat_no=2&amp;amp;cat_no=33&amp;amp;ver=en"
target="_blank"&gt;MTK 747 Transystem&lt;/a&gt; a&amp;nbsp;&amp;nbsp;&lt;a
href="http://gpsd.berlios.de/"&gt;gpsd&lt;/a&gt; via bluetooth in &lt;a
href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu 9.10&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Ho una chiavetta USB SURECOM per le connessioni bluetooth che viene
vista dal sistema così:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;lsusb&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;[...]&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;Bus 003
Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle
(HCI mode)&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;[...]&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Accendere l'&lt;a
href="http://www.transystem.com.tw/products/index_list.php?mcat_no=2&amp;amp;cat_no=33&amp;amp;ver=en"
target="_blank"&gt;MTK 747 Transystem&lt;/a&gt; in posizione&amp;nbsp; &lt;span
style="font-family: Courier New,Courier,monospace;"&gt;NAV&lt;/span&gt; ;
provare&amp;nbsp; se la perifirica Bluetooth viene riconosciuta:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;hcitool scan&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;Scanning ...&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
00:1C:88:00:CC:9C&amp;nbsp;&amp;nbsp;&amp;nbsp; iBT-GPS&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
La periferica viene riconosciuta ed associata al codice &lt;span
style="font-family: Courier New,Courier,monospace;"&gt; 00:1C:88:00:CC:9C.&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
Configuro la&amp;nbsp; connessione:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;paolo@laptop:~$
sudo gedit /etc/bluetooth/rfcomm.conf&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
inserisco questi settaggi:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;rfcomm0 {&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;
# Automatically bind the device at startup&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
bind yes;&lt;/span&gt;&lt;br style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;
# Bluetooth address of the device&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
device 00:1C:88:00:CC:9C;&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;
# RFCOMM channel for the connection&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
channel&amp;nbsp;&amp;nbsp;&amp;nbsp; 1;&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;
# Description of the connection&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
comment "iBT-GPS";&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Salvo e chiudo. N.B.: non è detto che debba per forza essere rfcomm0;
se si hanno altri dispositivi bluetooth associare il dispositivo ad
un'altra connessione (&lt;span
style="font-family: Courier New,Courier,monospace;"&gt;rfcomm1&lt;/span&gt;, &lt;span
style="font-family: Courier New,Courier,monospace;"&gt;rfcomm2&lt;/span&gt;,&amp;nbsp;
ecc.)&lt;br&gt;
&lt;br&gt;
Quindi:&lt;span style="font-family: Courier New,Courier,monospace;"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: Courier New,Courier,monospace;"&gt;paolo@laptop:~$&lt;/span&gt;&lt;span
style="font-family: Courier New,Courier,monospace;"&gt; rfcomm connect 0&lt;br&gt;
&lt;br&gt;
oppure:&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: Courier New,Courier,monospace;"&gt;rfcomm
connect 0 00:1C:88:00:CC:9C&lt;br&gt;
&lt;br&gt;
se tutto è ok si avrà la seguente risposta:&lt;br&gt;
&lt;/span&gt;&lt;span style="font-family: Courier New,Courier,monospace;"&gt;Connected
/dev/rfcomm0 to 00:1C:88:00:CC:9C on channel 1&lt;br&gt;
Press CTRL-C for hangup&lt;br&gt;
&lt;/span&gt;&lt;br&gt;
Aprire un altro terminale e digitare&lt;span
style="font-family: Courier New,Courier,monospace;"&gt;:&lt;br&gt;
paolo@laptop:~$ gpsd /dev/rfcomm0 &lt;br&gt;
paolo@laptop:~$ xgps&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/GMvDz0cW1pmZT2freFtmsA?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SyzpWms25wI/AAAAAAAAAZw/Tl8zmKoHq_I/s144/xgps.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
La disconnessione può essere effettuata dal &lt;a
href="http://live.gnome.org/GnomeBluetooth" target="_blank"&gt;gestore
Bluetooth di Gnome&lt;/a&gt;:&lt;br&gt;
&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/7U6JEu6-gpk-UJyPUyNpRQ?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SyztU9i5TuI/AAAAAAAAAZ0/2_rdimUC8go/s144/DisconnessioneGPS_Bluetooth.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
oppure premendo CONTROL-C nel primo terminale&lt;span
style="font-family: Courier New,Courier,monospace;"&gt;.&lt;br&gt;
&lt;/span&gt;Buona cosa, inoltre, &lt;em&gt;uccidere&lt;/em&gt; il processo &lt;span
style="font-family: Courier New,Courier,monospace;"&gt;gpsd&lt;/span&gt;&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;gpsd killall&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-2559813737186140077?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/2559813737186140077/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/12/mtk-gpsd-via-bluetooth.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/2559813737186140077?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/2559813737186140077?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/12/mtk-gpsd-via-bluetooth.html" title="MTK, GPSD via bluetooth" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_87lofqKSw4A/SyzpWms25wI/AAAAAAAAAZw/Tl8zmKoHq_I/s72-c/xgps.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkIMSHg4fyp7ImA9WxBSEkg.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-6762024593744372298</id><published>2009-12-18T19:20:00.004+01:00</published><updated>2009-12-19T21:29:49.637+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-19T21:29:49.637+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gps" /><category scheme="http://www.blogger.com/atom/ns#" term="google earth" /><category scheme="http://www.blogger.com/atom/ns#" term="kml" /><title>GoogleEarth e files kml</title><content type="html">Google Earth in Linux: problema di visualizzazione non corretta dei
file kml importati.&lt;br&gt;
&lt;br&gt;
Dopo aver scaricato ed installato Google Earth in Ubuntu ho notato che
i files kml importati non venivano posizionati correttamente; ho
risolto il problema grazie a &lt;a
href="http://www.slacky.eu/forum/viewtopic.php?f=2&amp;amp;t=29792&amp;amp;start=0&amp;amp;sid=2ad41b50f36b6a1116c2d268f098bcf3#p256334"
target="_blank"&gt;questo post&lt;/a&gt;; in pratica è sufficiente modificare
il file &lt;span style="font-family: Courier New,Courier,monospace;"&gt;googleearth&lt;/span&gt;
nella cartella &lt;span
style="font-family: Courier New,Courier,monospace;"&gt;/home/nomeutente/google-earth&lt;/span&gt;
(nel caso di installazione in locale, nella home utente) come segue:&lt;br&gt;
&lt;br style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;LD_LIBRARY_PATH=.:${GOOGLEEARTH_DATA_PATH}:${LD_LIBRARY_PATH}&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;export
LD_LIBRARY_PATH&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;export
LC_ALL=us_US.UTF-8&lt;/span&gt;&lt;br
style="font-family: Courier New,Courier,monospace;"&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;export
LANG=it_IT.UTF-8&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Ecco un esempio, con una traccia denominata &lt;span
style="font-family: Courier New,Courier,monospace;"&gt;track_15_12_2009.gpx_trk.gpx&lt;/span&gt;:&lt;br&gt;
&lt;br&gt;
step 1: conversione da &lt;a href="http://www.topografix.com/gpx.asp"
target="_blank"&gt;gpx&lt;/a&gt; a &lt;a
href="http://it.wikipedia.org/wiki/Keyhole_Markup_Language"
target="_blank"&gt;kml&lt;/a&gt; con &lt;a href="http://www.gpsbabel.org/"
target="_blank"&gt;gpsbabel&lt;/a&gt;:&lt;br&gt;
&lt;span style="font-family: Courier New,Courier,monospace;"&gt;paolo@laptop:~$
gpsbabel -t -i gpx -f track_15_12_2009_trk.gpx -o kml -F track.kml&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
step 2: aprire &lt;a href="http://earth.google.com/intl/it/"
target="_blank"&gt;Google Earth&lt;/a&gt; e caricare la traccia:&lt;br&gt;
&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/PCtKYG0GoabZl6MS5WKzaQ?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/Sy00gl0jysI/AAAAAAAAAaA/urnSjGjCeGw/s400/ge_apriFile.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;table style="width: auto;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/stQ-hNTGERy3Tljx94MuYQ?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/Sy00gxa42qI/AAAAAAAAAaE/Tf_rMvFkUcg/s400/ge_traccia.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td
style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From
&lt;a
href="http://picasaweb.google.com/pcraveri/GrassGisEDintorni?authkey=Gv1sRgCNex_MmLzMOcZQ&amp;amp;feat=embedwebsite"&gt;Grass,
gis e dintorni&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br style="font-family: Courier New,Courier,monospace;"&gt;
&lt;br&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-6762024593744372298?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/6762024593744372298/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/12/googleearth-e-files-kml.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/6762024593744372298?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/6762024593744372298?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/12/googleearth-e-files-kml.html" title="GoogleEarth e files kml" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_87lofqKSw4A/Sy00gl0jysI/AAAAAAAAAaA/urnSjGjCeGw/s72-c/ge_apriFile.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUUGRX45cSp7ImA9WxBTE0Q.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-7768811772634678304</id><published>2009-12-09T22:05:00.005+01:00</published><updated>2009-12-09T22:13:44.029+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-09T22:13:44.029+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="epsg" /><category scheme="http://www.blogger.com/atom/ns#" term="g.proj" /><title>Codici epsg per l'Italia Nord-Occidentale.</title><content type="html">Codici &lt;a href="http://www.epsg.org/" target="_blank"&gt;epsg&lt;/a&gt;: memo. &lt;br&gt;
&lt;br&gt;
Ecco i codici di più frequente uso nell'Italia Nord-Occidentale
(Piemonte, Liguria, Valle d'Aosta).&lt;br&gt;
&lt;br&gt;
&lt;table style="text-align: left; height: 88px; width: 526px;" border="1"
cellpadding="2" cellspacing="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 34px;"&gt;&lt;span
style="text-decoration: underline;"&gt;Codice&lt;/span&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 315px;"&gt;&lt;span
style="text-decoration: underline;"&gt;Descrizione&lt;/span&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 103px;"&gt;&lt;span
style="text-decoration: underline;"&gt;wkt&lt;/span&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 34px;"&gt;&lt;a target="_blank"
href="http://spatialreference.org/ref/epsg/4806/"&gt;4806&lt;/a&gt;&lt;/td&gt;
&lt;td style="vertical-align: top; width: 315px;"&gt;Roma1940, in
gradi. &lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 103px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/4806/prettywkt/"
target="_blank"&gt;wkt&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 34px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/26591/" target="_blank"&gt;26591&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 315px;"&gt;Sistema nazionale &lt;a
href="http://it.wikipedia.org/wiki/Proiezione_di_Gauss-Boaga"
target="_blank"&gt;Gauss-Boaga&lt;/a&gt;, fuso Ovest. Datum Roma1940.&amp;nbsp;
Falsa origine delle ascisse: 1.500 km. Deprecato (usare 3003).&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 103px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/26591/prettywkt/"&gt;wkt&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 34px;"&gt;&lt;a target="_blank"
href="http://spatialreference.org/ref/epsg/3003/"&gt;3003&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 315px;"&gt;Idem c.s. &lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 103px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/3003/prettywkt/"
target="_blank"&gt;wkt&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 34px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/23032/" target="_blank"&gt;23032&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 315px;"&gt;&lt;a
href="http://en.wikipedia.org/wiki/ED50" target="_blank"&gt;European 1950
datum&lt;/a&gt;
(ED50). Grigliato &lt;a
href="http://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system"
target="_blank"&gt;UTM&lt;/a&gt;, fuso 32 Nord.&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 103px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/23032/prettywkt/"&gt;wkt&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 34px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/4326/"&gt;4326&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 315px;"&gt;&lt;a target="_blank"
href="http://en.wikipedia.org/wiki/World_Geodetic_System"&gt;WGS84&lt;/a&gt;
datum. Lat/Long. &lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 103px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/4326/prettywkt/"
target="_blank"&gt;wkt&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; width: 34px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/32632/" target="_blank"&gt;32632&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; width: 315px;"&gt;&lt;a target="_blank"
href="http://en.wikipedia.org/wiki/World_Geodetic_System"&gt;WGS84&lt;/a&gt;
datum. Grigliato &lt;a
href="http://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system"
target="_blank"&gt;UTM&lt;/a&gt;, fuso 32 Nord.&lt;/td&gt;
&lt;td style="vertical-align: top; width: 103px;"&gt;&lt;a
href="http://spatialreference.org/ref/epsg/32632/prettywkt/"&gt;wkt&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
I parametri per le trasformazioni possono essere ottenuti con il
comando di&amp;nbsp; &lt;a href="http://grass.osgeo.org/" target="_blank"&gt;GRASS&lt;/a&gt;
&lt;a href="http://grass.osgeo.org/grass70/manuals/html70_user/g.proj.html"&gt;g.proj.&lt;/a&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-7768811772634678304?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/7768811772634678304/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/12/codici-epsg-per-litalia-nord.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7768811772634678304?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7768811772634678304?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/12/codici-epsg-per-litalia-nord.html" title="Codici epsg per l'Italia Nord-Occidentale." /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MCRHs9eyp7ImA9WhdTFEs.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-7848542973150516811</id><published>2009-11-09T21:56:00.009+01:00</published><updated>2011-07-12T12:11:05.563+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-12T12:11:05.563+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Garmin 60Cx" /><category scheme="http://www.blogger.com/atom/ns#" term="gpsbabel" /><title>Garmin GPSmap 60 Cx e GPSBabel</title><content type="html">Usare il &lt;a href="https://buy.garmin.com/shop/shop.do?pID=309" id="tex2html7" name="tex2html7"&gt;Garmin 60Cx&lt;/a&gt; con &lt;a href="http://www.gpsbabel.org/" id="tex2html8" name="tex2html8"&gt;GPSBabel&lt;/a&gt;. Seguire le guide di &lt;a href="http://wiki.openstreetmap.org/wiki/USB_Garmin_on_GNU/Linux" id="tex2html9" name="tex2html9"&gt;OpenStreetMap&lt;/a&gt; e di &lt;a href="http://www.gpsbabel.org/os/Linux_Hotplug.html" id="tex2html10" name="tex2html10"&gt;GPSBabel&lt;/a&gt;.&lt;br /&gt;
In pratica, creare il file &lt;code&gt;51-garmin.rules&lt;/code&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;paolo@laptop:~$ cat /etc/udev/rules.d/51-garmin.rules
# # http://wiki.openstreetmap.org/wiki/USB_Garmin_on_GNU/Linux
# # gps garmin con porta usb senza permessi
ATTRS{idVendor}=="091e", ATTRS{idProduct}=="0003", MODE="0660", GROUP="plugdev"
&lt;/pre&gt;
Inserire il modulo &lt;code&gt;garmin_gps&lt;/code&gt; in blacklist:&lt;br /&gt;
&lt;pre&gt;paolo@laptop:~$ cat /etc/modprobe.d/blacklist
#prevent garmin gops loaded so generic USB can be used instead
blacklist garmin_gps
&lt;/pre&gt;
A questo punto il ricevitore GPS viene riconosciuto come periferica &lt;span class="textit"&gt;usb:&lt;/span&gt;.&lt;br /&gt;
Per testare il tutto caricando una traccia dal pc al ricevitore:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;cancellare ogni traccia dal ricevitore;&lt;/li&gt;
&lt;li&gt;collegare il ricevitore;&lt;/li&gt;
&lt;li&gt;caricare una traccia dal pc al ricevitore con:&lt;br /&gt;
&lt;pre&gt;gpsbabel -t -i gpx -f miatraccia.gpx -o garmin -F usb:
&lt;/pre&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;la traccia viene (dovrebbe!) essere caricata, ma il ricevitore&lt;br /&gt;
non la nomina;&lt;/li&gt;
&lt;li&gt;nel menù tracce salvare la traccia dandole un nome&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;/ol&gt;
&lt;ol&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-7848542973150516811?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/7848542973150516811/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/11/garmin-gpsmap-60-cx-e-gpsbabel.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7848542973150516811?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7848542973150516811?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/11/garmin-gpsmap-60-cx-e-gpsbabel.html" title="Garmin GPSmap 60 Cx e GPSBabel" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkAEQHk_fyp7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-456838277240920763</id><published>2009-04-25T21:45:00.005+02:00</published><updated>2009-12-21T23:31:41.747+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:31:41.747+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="point in polygon" /><category scheme="http://www.blogger.com/atom/ns#" term="GRASS" /><title>Point in polygon (terza parte)</title><content type="html">&lt;h2&gt;&lt;a name="SECTION00001000000000000000"
id="SECTION00001000000000000000"&gt;Joins spaziali
e SQL&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In questa sezione vengono affrontati gli aspetti principali del &lt;span
class="textit"&gt;point in polygon&lt;/span&gt; maggiormente legati all'&lt;a
name="tex2html1" href="http://en.wikipedia.org/wiki/PL_SQL"
id="tex2html1"&gt;SQL&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a name="SECTION00001100000000000000"
id="SECTION00001100000000000000"&gt;Preparazione
dei dati e prime verifiche&lt;/a&gt;&lt;/h3&gt;
I dati necessari per l'esercitazione sono quelli
ottenuti &lt;a name="tex2html2"
href="http://appuntigis.blogspot.com/2009/03/point-in-polygon-seconda-parte.html"
id="tex2html2"&gt;nell'esercitazione precedente&lt;/a&gt;; riassiumiamo:
&lt;ol&gt;
&lt;li&gt;la &lt;a name="tex2html3"
href="http://appuntigis.blogspot.com/2008/12/simpleloc.html"
id="tex2html3"&gt;location &lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
con il mapset &lt;span class="textit"&gt;&lt;em class="sans"&gt;pointInPoly&lt;/em&gt;&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;un vettoriale poligonale &lt;code&gt;polygons&lt;/code&gt; con attributi &lt;span
class="textit"&gt;cat&lt;/span&gt; (la categoria dell'area), &lt;span
class="textit"&gt;label&lt;/span&gt;
(l'etichetta identificativa di ciascuna area) e &lt;span class="textit"&gt;GRASSRGB&lt;/span&gt;
(il
colore dell'area secondo la codifica RGB);&lt;/li&gt;
&lt;li&gt;un vettoriale di punti &lt;code&gt;mypt&lt;/code&gt; collegato, sul layer 1,
alla tabella
&lt;code&gt;points_code&lt;/code&gt; con i campi &lt;span class="textit"&gt;cat&lt;/span&gt;
e &lt;span class="textit"&gt;code&lt;/span&gt; (quest'ultimo codifica la posizione
del punto rispetto agli elementi
dei poligoni).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Merita porre l'attenzione sull'ultimo punto: un vettoriale è stato
collegato ad una
tabella con un nome totalmente diverso. Spesso si è indotti a pensare
che ciò non sia
possibile (a causa forse dell'abitudine ad usare formati di file quali
lo &lt;a name="tex2html4" href="http://en.wikipedia.org/wiki/Shapefile"
id="tex2html4"&gt;shapefile&lt;/a&gt;)
ma tutti i moduli di &lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; usati in
questo esercizio
funzionano benissimo anche in questo caso. Vediamo un esempio:&lt;/p&gt;
&lt;pre&gt;# # # vector and table with a different name&lt;br /&gt;# # # mypt connected to points_table&lt;br /&gt;table="points_code"&lt;br /&gt;column="polyCat"&lt;br /&gt;# # # if column not exists will be created&lt;br /&gt;if ! checkColumn "$table" "$column" ; then&lt;br /&gt; echo "ALTER TABLE $table ADD COLUMN $column integer" | db.execute&lt;br /&gt;fi&lt;br /&gt;# # upload polygons cat to table&lt;br /&gt;v.what.vect vect=mypt col=polyCat \&lt;br /&gt; qvector=polygons qcolumn=cat&lt;br /&gt;# # # how many rows in table?&lt;br /&gt;db.select sql="SELECT count(cat) FROM $table"&lt;br /&gt;# # # how many points overlap polygons?&lt;br /&gt;db.select sql="SELECT count(cat) FROM $table \&lt;br /&gt; WHERE $column NOT NULL"&lt;br /&gt;# # # how many points don't overlap polygons?&lt;br /&gt;db.select sql="SELECT count(cat) FROM $table \&lt;br /&gt; WHERE $column IS NULL"&lt;br /&gt;# # # how many points overlaps boundaries, nodes, vertices, centroids, ecc.&lt;br /&gt;db.select sql="SELECT code,count(cat) FROM $table \&lt;br /&gt; WHERE $column NOT NULL GROUP BY code"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Al solito vengono lasciati i commenti.&lt;/p&gt;
&lt;p&gt;Una nota di spiegazione meritano le funzioni &lt;code&gt;checkColumn&lt;/code&gt;
e
&lt;code&gt;checkTable&lt;/code&gt; (usata dopo). Tutto il codice riportato è
contenuto in una script
che viene testato ogni qualvolta si apportano modifiche; il tentativo
di creare una
colonna (campo) già esistente fornisce un errore e lo stesso dicasi per
il tentativo di
creare una tabella già presente nel database. Ripetendo quindi
l'esecuzione dello script
senza un preventivo controllo sull'esistenza o meno di tabelle e
colonne che si volgiono
creare fornirebbe numerosi errori. Per evitare questo è possibile usare
queste
funzioni:&lt;/p&gt;
&lt;pre&gt;checkTable()&lt;br /&gt;{&lt;br /&gt;# true=0&lt;br /&gt;# false=1&lt;br /&gt; table=$1&lt;br /&gt; db.tables -p | grep '\&amp;lt;'$table'\&amp;gt;' 2&amp;gt;/dev/null&lt;br /&gt; if [ $? -eq 0 ]; then&lt;br /&gt; exists=0&lt;br /&gt; else&lt;br /&gt; g.message -w message="Table $table doesn't exist"&lt;br /&gt; exists=1&lt;br /&gt; fi&lt;br /&gt; return $exists&lt;br /&gt;}&lt;br /&gt;checkColumn()&lt;br /&gt;{&lt;br /&gt;# true=0&lt;br /&gt;# false=1&lt;br /&gt; local table=$1&lt;br /&gt; local column=$2&lt;br /&gt; if checkTable $table; then&lt;br /&gt; db.describe -ct $table | grep '\&amp;lt;'$column'\&amp;gt;' 2&amp;gt;/dev/null&lt;br /&gt; if [ $? -eq 0 ]; then&lt;br /&gt; exists=0&lt;br /&gt; else&lt;br /&gt; g.message -w message="Column $column doesn't exist"&lt;br /&gt; exists=1&lt;br /&gt; fi&lt;br /&gt; return $exists&lt;br /&gt; else&lt;br /&gt; exit 1&lt;br /&gt; fi&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;È chiaro che chi non ha dimestichezza con lo scripting di shell può
lo stesso fare
questi esercizi, senza dover per forza capire il meccanismo di
funzionamento delle
funzioni sopra riportate! Nell'esempio di prima basta omettere le righe
che richiamano
&lt;code&gt;checkColumn&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;# # # if column not exists will be created&lt;br /&gt; echo "ALTER TABLE points_code ADD COLUMN polyCat integer" | db.execute&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;...ricordandosi di cancellare la colonna &lt;code&gt;polyCat&lt;/code&gt; con &lt;a
name="tex2html5"
href="http://grass.osgeo.org/grass65/manuals/html65_user/db.dropcol.html"
id="tex2html5"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;db.dropcol&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
prima di
ripetere l'esercizio, per evitare errori del tipo:&lt;/p&gt;
&lt;pre&gt;GRASS 6.5.svn (simpleloc):~/script_grass &amp;gt; echo "ALTER TABLE points_code ADD COLUMN polyCat integer" | db.execute&lt;br /&gt;DBMI-SQLite driver error:&lt;br /&gt;Error in sqlite3_prepare():&lt;br /&gt;duplicate column name: polyCat&lt;br /&gt;&lt;br /&gt;ERROR: Error while executing: 'ALTER TABLE points_code ADD COLUMN polyCat&lt;br /&gt; integer&lt;br /&gt; '&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Riprendendo l'esercitazione, se proprio si vuole avere vettoriale e
tabella con lo
stesso nome si può procedere semplicemente così, copiando il vettoriale
con un nuovo
nome:&lt;/p&gt;
&lt;pre&gt; # # vector and table with the same name&lt;br /&gt;g.copy vect=mypt,mypt2 --overwrite &lt;br /&gt;db.describe -tc mypt2&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;oppure esportando e reimportando il vettoriale con &lt;a
name="tex2html6"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.out.ogr.html"
id="tex2html6"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.out.ogr&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
e &lt;a name="tex2html7"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.in.ogr.html"
id="tex2html7"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.in.ogr&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;# # # vector and table with the same name&lt;br /&gt;v.out.ogr in=mypt layer=1 type=point dsn=. \&lt;br /&gt; olayer=tmp_pippo format=ESRI_Shapefile -c&lt;br /&gt;v.in.ogr dsn=. output=mypt2 layer=tmp_pippo --o&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si noti che con quest'ultimo metodo si ottiene una tabella
leggermente diersa rispetto
all'originaria (usare &lt;a name="tex2html8"
href="http://grass.osgeo.org/grass65/manuals/html65_user/db.describe.html"
id="tex2html8"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;db.describe&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;...
viene
inserito un campo &lt;tt&gt;cat_&lt;/tt&gt;; il campo &lt;tt&gt;polyCat&lt;/tt&gt; viene
trasformato da
&lt;span class="textsf textsl"&gt;integer&lt;/span&gt; a &lt;span
class="textsf textsl"&gt;double
precision&lt;/span&gt;).&lt;/p&gt;
&lt;p&gt;Per esercitarsi appieno con &lt;a name="tex2html9"
href="http://en.wikipedia.org/wiki/PL_SQL" id="tex2html9"&gt;SQL&lt;/a&gt;, si
crei una tabella che
memorizzi la desrizione della codifica dei punti così come definita &lt;a
name="tex2html10"
href="http://appuntigis.blogspot.com/2009/03/point-in-polygon-seconda-parte.html"
id="tex2html10"&gt;nell'esercitazione precedente&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;# # # create a table for points descriptions&lt;br /&gt;table="points_descr"&lt;br /&gt;# # # if table exists will be cancelled&lt;br /&gt;if checkTable $table ; then&lt;br /&gt; db.droptable -f $table&lt;br /&gt;fi&lt;br /&gt;echo "CREATE TABLE $table (cat integer, txtDescr varchar(25) )" | db.execute&lt;br /&gt;# # insert data in table with loop and here document&lt;br /&gt;while read data&lt;br /&gt; do&lt;br /&gt; fcat=$(echo $data | cut -d"|" -f1)&lt;br /&gt; ftxtDescr=$(echo $data | cut -d"|" -f2)&lt;br /&gt; echo "INSERT INTO $table (cat,txtDescr) \&lt;br /&gt; values ("$fcat",'"$ftxtDescr"')" | db.execute&lt;br /&gt;done&amp;lt;&amp;lt;EOF&lt;br /&gt;1|out (completly out!)&lt;br /&gt;2|in (but not on boundaries nor centroids)&lt;br /&gt;3|on_centroids&lt;br /&gt;4|on_nodes (but not on vertices)&lt;br /&gt;5|on_vertices (but not on nodes)&lt;br /&gt;6|on_boundaries (but not on vertices nor nodes)&lt;br /&gt;EOF&lt;br /&gt;db.select $table&lt;br /&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a name="SECTION00001200000000000000"
id="SECTION00001200000000000000"&gt;v.distance
semplificato: v.what.vect&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Si è visto &lt;a name="tex2html11"
href="http://appuntigis.blogspot.com/2009/03/point-in-polygon-seconda-parte.html"
id="tex2html11"&gt;nell'esercitazione precedente&lt;/a&gt; che &lt;a
name="tex2html12"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html12"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
permetto
il trasferimento della categoria o degli attributi dai poligoni ai
punti; &lt;a name="tex2html13"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.what.vect.html"
id="tex2html13"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.what.vect&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
non
è altro che uno script per semplificare &lt;a name="tex2html14"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html14"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
in
questo genere di operazioni.&lt;/p&gt;
&lt;p&gt;Per esempio si può aggiornare il campo &lt;tt&gt;polyCat&lt;/tt&gt; dei punti
con la categoria dei
poligoni o trasferire un attributo (in questo caso il campo &lt;tt&gt;GRASSRGB&lt;/tt&gt;):&lt;/p&gt;
&lt;pre&gt;# # # upload polygons cat to points attribute&lt;br /&gt;v.what.vect vect=mypt2 col=polyCat qvector=polygons qcolumn=cat&lt;br /&gt;# # # coloro i punti con lo stesso colore del poligono&lt;br /&gt;# # # nel quale sono contenuti&lt;br /&gt;if ! checkColumn "mypt2" "GRASSRGB" ; then&lt;br /&gt; v.db.addcol mypt2 col="GRASSRGB VARCHAR(11)"&lt;br /&gt;fi&lt;br /&gt;# # # upload polygons colors to points&lt;br /&gt;v.what.vect vect=mypt2 col=GRASSRGB qvector=polygons qcolumn=GRASSRGB&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Queste operazioni sono del tutto analoghe a quelle già viste in
precedenza con
&lt;a name="tex2html15"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html15"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a name="SECTION00001300000000000000"
id="SECTION00001300000000000000"&gt;Punti,
poligoni e SQL&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Si propone qui una semplice carrellata di esempi per dare un'idea
generale sull'uso
dell'&lt;a name="tex2html16" href="http://en.wikipedia.org/wiki/PL_SQL"
id="tex2html16"&gt;SQL&lt;/a&gt; collegato con lo &lt;span class="textit"&gt;spatial
join&lt;/span&gt; e il
&lt;span class="textit"&gt;point in polygon&lt;/span&gt;; si rimanda agli ottimi
tutorial presenti in
rete per gli approfondimenti riguardanti l'&lt;a name="tex2html17"
href="http://en.wikipedia.org/wiki/PL_SQL" id="tex2html17"&gt;SQL&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;a name="SECTION00001310000000000000"
id="SECTION00001310000000000000"&gt;Verifiche sul
numero dei punti&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;# # # how many points?&lt;br /&gt;db.select sql="SELECT count(cat) FROM mypt2"&lt;br /&gt;# # # how many points with polyCat not empty?&lt;br /&gt;# # # how many points overlap polygons?&lt;br /&gt;db.select sql="SELECT count(cat) FROM mypt2 \&lt;br /&gt; WHERE polyCat NOT NULL"&lt;br /&gt;# # # as above-mentioned but group by code&lt;br /&gt;db.select sql="SELECT code,count(cat) FROM mypt2 \&lt;br /&gt; WHERE polyCat NOT NULL GROUP BY code"&lt;br /&gt;# # # how many points polyCat=NULL? (=points outside areas)&lt;br /&gt;db.select sql="SELECT count(cat) FROM mypt2 \&lt;br /&gt; WHERE polyCat IS NULL"&lt;br /&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;a name="SECTION00001320000000000000"
id="SECTION00001320000000000000"&gt;Inner Join
(equal join)&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Nell'Inner join vengono estratti solo i record di entrambe le
tabelle nei quali il
campo chiave coincide.&lt;/p&gt;
&lt;p&gt;Nel caso di &lt;tt&gt;mypt2&lt;/tt&gt; e &lt;tt&gt;polygons&lt;/tt&gt; il campo chiave è
rispettivamente
&lt;tt&gt;polyCat&lt;/tt&gt; e &lt;tt&gt;cat&lt;/tt&gt;.&lt;/p&gt;
&lt;pre&gt;db.select sql="SELECT mypt2.cat AS pointCat, \&lt;br /&gt; polygons.cat, polygons.label AS polyLabel, \&lt;br /&gt; polygons.GRASSRGB AS polyColor \&lt;br /&gt; FROM mypt2 INNER JOIN polygons \&lt;br /&gt; ON mypt2.polyCat=polygons.cat"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'espressione con i campi chiave &lt;code&gt;mypt2.polyCat=polygons.cat&lt;/code&gt;
viene
valutata &lt;code&gt;true&lt;/code&gt; solo quando i campi, provenienti dalle due
tabelle, sono
uguali.&lt;/p&gt;
&lt;p&gt;È facile verificare che è indifferente porre la clausula &lt;code&gt;WHERE
mypt.polyCat NOT
NULL&lt;/code&gt; perchè nell'inner join vengono estratti solo i record di
entrambe le tabelle
nei quali il campo chiave coincide:&lt;/p&gt;
&lt;pre&gt;db.select sql="SELECT mypt2.cat AS pointCat, \&lt;br /&gt; polygons.cat, polygons.label AS polyLabel, \&lt;br /&gt; polygons.GRASSRGB AS polyColor \&lt;br /&gt; FROM mypt2 INNER JOIN polygons \&lt;br /&gt; ON mypt2.polyCat=polygons.cat \&lt;br /&gt; WHERE mypt2.cat NOT NULL"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si può usare anche un'altra notazione, che porta a risultati
identici:&lt;/p&gt;
&lt;pre&gt;db.select sql="SELECT a.cat AS pointCat, \&lt;br /&gt; b.cat, b.label AS polyLabel, \&lt;br /&gt; b.GRASSRGB AS polyColor \&lt;br /&gt; FROM mypt2 a, polygons b \&lt;br /&gt; WHERE a.polyCat=b.cat"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;È possibile ottenere i punti raggruppati per codice con la
descrizione contenuta nella
tabella &lt;tt&gt;points_descr&lt;/tt&gt;:&lt;/p&gt;
&lt;pre&gt;db.select sql="SELECT mypt2.code AS code, count(mypt2.code) AS NumberOfPoints, \&lt;br /&gt; points_descr.txtDescr AS description \&lt;br /&gt; FROM mypt2 INNER JOIN points_descr \&lt;br /&gt; ON mypt2.code=points_descr.cat GROUP BY mypt2.code"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;...o l'elenco completo dettagliato di tutti i punti&lt;/p&gt;
&lt;pre&gt;db.select sql="SELECT mypt2.cat, mypt2.code AS code, \&lt;br /&gt; points_descr.txtDescr AS description \&lt;br /&gt; FROM mypt2 INNER JOIN points_descr \&lt;br /&gt; ON mypt2.code=points_descr.cat ORDER BY code"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Un problema abbastanza comune è il calcolo del numero di punti
contenuti in ciascun
poligono:&lt;/p&gt;
&lt;pre&gt;db.select sql="SELECT COUNT(mypt2.cat) AS totalPoint, \&lt;br /&gt; polygons.label AS polyLabel FROM mypt2 \&lt;br /&gt; INNER JOIN polygons ON \&lt;br /&gt; mypt2.polyCat=polygons.cat GROUP BY polyCat"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Questo risutato può essere memorizzato in una tabella autonoma:&lt;/p&gt;
&lt;pre&gt;table="countPointsPerPoly"&lt;br /&gt;# # # if table exists will be cancelled&lt;br /&gt;if checkTable $table ; then&lt;br /&gt; db.droptable -f $table&lt;br /&gt;fi&lt;br /&gt;echo "CREATE TABLE $table AS SELECT count(mypt2.cat) AS numpoint, \&lt;br /&gt; polygons.cat AS refPoly FROM mypt2 \&lt;br /&gt; INNER JOIN polygons \&lt;br /&gt; ON mypt2.polyCat=polygons.cat \&lt;br /&gt; GROUP BY polygons.cat" | db.execute&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;...oppure memorizzato in un campo nella tabella attributi dei
poligoni:&lt;/p&gt;
&lt;pre&gt;if ! checkColumn "polygons" "numpoints" ; then&lt;br /&gt; v.db.addcol polygons col="numpoints integer"&lt;br /&gt;fi&lt;br /&gt;#&lt;br /&gt;for i in $(v.db.select polygons col=cat -c); do &lt;br /&gt;echo "UPDATE polygons SET numpoints= \&lt;br /&gt; (SELECT count(mypt2.cat) FROM mypt2 \&lt;br /&gt; WHERE mypt2.polyCat=$i \&lt;br /&gt; GROUP BY polyCat) WHERE polygons.cat=$i" | db.execute&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'aggiornamento del campo &lt;tt&gt;numpoints&lt;/tt&gt; è realizzato
attraverso un &lt;span class="textit"&gt;loop&lt;/span&gt;; per ogni &lt;tt&gt;cat&lt;/tt&gt;
della tabella dei poligoni viene eseguita la
&lt;span class="textit"&gt;subquery&lt;/span&gt; rappresentata dalle istruzioni
all'interno delle
parentesi tonde che restituisce un elenco di valori. La successiva
clausula &lt;code&gt;WHERE
polygons.cat=$i&lt;/code&gt; filtra i valori ottenuti dalla &lt;span
class="textit"&gt;subquery&lt;/span&gt; imponendo la condizione &lt;code&gt;polygons.cat=$i&lt;/code&gt;
ottenendo
un solo valore per ogni ciclo che viene inserito nel campo &lt;tt&gt;numpoints&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;È possibile concatenare l'&lt;span class="textit"&gt;inner join&lt;/span&gt;;
nell'esempio si
ottiene, per ogni poligono il punto contenuto con il suo codice e la
descrizione:&lt;/p&gt;
&lt;pre&gt;# # # double inner join&lt;br /&gt;db.select sql="SELECT polygons.label AS polyLabel, mypt2.cat AS pointCat,\&lt;br /&gt; mypt2.code as pointCode, points_descr.txtDescr AS pointDescr \&lt;br /&gt; FROM polygons \&lt;br /&gt; INNER JOIN mypt2 ON polygons.cat=mypt2.polyCat \&lt;br /&gt; INNER JOIN points_descr ON mypt2.code=points_descr.cat"&lt;br /&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;a name="SECTION00001330000000000000"
id="SECTION00001330000000000000"&gt;Left join
(left outer join)&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Il risultato del left join include tutti i records della prima
tabella e solo i
records della seconda che rendono vera l'espressione con i campi chiave:&lt;/p&gt;
&lt;pre&gt;db.select sql="SELECT mypt2.cat AS pointCat, \&lt;br /&gt; polygons.cat, polygons.label AS polyLabel, \&lt;br /&gt; polygons.GRASSRGB AS polyColor \&lt;br /&gt; FROM mypt2 LEFT JOIN polygons \&lt;br /&gt; ON mypt2.polyCat=polygons.cat"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Attualmente (aprile 2009) il &lt;span class="textit"&gt;right join (right
outer join)&lt;/span&gt;
non è supportato dal driver Sqlite di Grass.&lt;/p&gt;
&lt;p&gt;Analogamente a quanto fatto in precedenza, è possibile estrarre i
dati dalle tre
tabelle usando sia l'&lt;span class="textit"&gt;inner join&lt;/span&gt; che il &lt;span
class="textit"&gt;left join&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;db.select sql="select mypt2.cat AS pointCat, mypt2.code AS pointCode, \&lt;br /&gt; points_descr.txtDescr AS pointDescr, polygons.label AS polyLabel \&lt;br /&gt; FROM mypt2 \&lt;br /&gt; INNER JOIN points_descr ON mypt2.code=points_descr.cat \&lt;br /&gt; LEFT JOIN polygons ON mypt2.polyCat=polygons.cat"&lt;br /&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;a name="SECTION00001340000000000000"
id="SECTION00001340000000000000"&gt;Casi
particolari&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Si voglia per esempio estrarre, per ciascun poligono avente area
maggiore ad un certo
valore, il numero di punti in esso contenuti:&lt;/p&gt;
&lt;pre&gt;if ! checkColumn "polygons" "area"; then&lt;br /&gt; v.db.addcol polygons col="area double precision"&lt;br /&gt;fi&lt;br /&gt;v.to.db polygons opt=area col="area"&lt;br /&gt;db.select sql="SELECT count(mypt2.polyCat) AS numPoint, \&lt;br /&gt; polygons.label as polyLabel, \&lt;br /&gt; polygons.area AS polyArea FROM mypt2 \&lt;br /&gt; INNER JOIN polygons ON mypt2.polyCat=polygons.cat \&lt;br /&gt; GROUP BY polygons.cat HAVING polyArea&amp;gt;=7 ORDER BY polyArea DESC"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Oppure è possibile calcolare il rapporto di densità tra punti
contenuti ed area del
poligono &lt;span class="textit"&gt;contenitore&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;db.select sql="SELECT count(mypt2.polyCat) AS numPoint, \&lt;br /&gt; polygons.label as polyLabel, \&lt;br /&gt; polygons.area AS polyArea, round(numpoints/area,2) AS density FROM mypt2 \&lt;br /&gt; INNER JOIN polygons ON mypt2.polyCat=polygons.cat \&lt;br /&gt; GROUP BY polygons.cat ORDER BY density DESC"&lt;br /&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a name="SECTION00002000000000000000"
id="SECTION00002000000000000000"&gt;Conclusioni&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In queste tre esercitazioni si è visto a grandi linee come &lt;span
class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; affronta il problema del &lt;span
class="textit"&gt;point in
polygon&lt;/span&gt;. I tools base sono &lt;a name="tex2html18"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.select.html"
id="tex2html18"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
e &lt;a name="tex2html19"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html19"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;;
&lt;a name="tex2html20"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.what.vect.html"
id="tex2html20"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.what.vect&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
è uno
script che semplifica l'uso di &lt;a name="tex2html21"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html21"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;;
l'&lt;a name="tex2html22" href="http://en.wikipedia.org/wiki/PL_SQL"
id="tex2html22"&gt;SQL&lt;/a&gt;
è stato usato per l'estrazione dei dati e per creare i &lt;span
class="textit"&gt;joins&lt;/span&gt;.
Merita ricordare che quando l'esigenza è di unire (&lt;span class="textit"&gt;merge&lt;/span&gt;)
due
tabelle, c'è a disposizione &lt;a name="tex2html23"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.db.join.html"
id="tex2html23"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.db.join&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;:
il suo
funzionamento interno, al di lá dei diversi controlli , ricorda le
operazioni usate per
l'aggiornamento del campo &lt;tt&gt;numpoints&lt;/tt&gt; attraverso un &lt;span
class="textit"&gt;loop&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;La conoscenza dell'&lt;a name="tex2html24"
href="http://en.wikipedia.org/wiki/PL_SQL" id="tex2html24"&gt;SQL&lt;/a&gt;
pare uno strumento indispensabile per l'utente GIS, in particolare
quando si lavora con il modello vettoriale.&lt;/p&gt;
&lt;p&gt;Tutto il codice riportato in questo esercizio può essere scaricato
da &lt;a name="tex2html25"
href="http://www.4shared.com/file/94786260/e73aea00/sl_pointsclasssh.html"
id="tex2html25"&gt;qui&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-456838277240920763?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/456838277240920763/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/04/point-in-polygon-terza-parte.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/456838277240920763?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/456838277240920763?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/04/point-in-polygon-terza-parte.html" title="Point in polygon (terza parte)" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0ABQ3c5eyp7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-115912863479644942</id><published>2009-04-16T22:51:00.002+02:00</published><updated>2009-12-21T23:49:12.923+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:49:12.923+01:00</app:edited><title>Tre anni di Gis Open Source</title><content type="html">Per una serie di motivi e coincidenze, nel marzo 2006 decisi di passare
dal Gis
proprietario in Windows al Gis Open Source in Linux.
&lt;p&gt;Dopo tre anni circa mi sento di poter affermare la grande
soddisfazione che questa
scelta ha portato.&lt;/p&gt;
&lt;p&gt;Poche cose mi mancano veramente del Gis-Windows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;l'ambiente &lt;span class="textit"&gt;layout&lt;/span&gt; di &lt;span
class="textsl"&gt;ArcView&lt;/span&gt;&amp;nbsp;(dalla vers. 8.2 in poi); &lt;a
name="tex2html1"
href="http://grass.osgeo.org/grass65/manuals/html65_user/ps.map.html"
id="tex2html1"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;ps.map&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
ha grandi
potenzialità ma allestimenti raffinati richiedono un ambiente dedicato &lt;span
class="textit"&gt;WYSIWYG&lt;/span&gt; o &lt;span class="textit"&gt;WYSIWYM&lt;/span&gt;
(What You See Is What You
Mean): in ogni caso allestendo una mappa di un certo livello qualcosa
(e non solo il
codice) si deve vedere in tempo reale man mano che si lavora e non solo
dopo
compilazione. &lt;a name="tex2html2"
href="http://www.gvsig.gva.es/index.php?id=gvsig&amp;amp;L=2" id="tex2html2"&gt;&lt;span
class="textsl"&gt;gvSIG&lt;/span&gt;&lt;/a&gt; offre un ambiente del tipo
ArcView&amp;nbsp; &lt;span class="textit"&gt;vecchia maniera&lt;/span&gt; (vers. 3.2)
ma come sarebbe bello avere tutto in
&lt;span class="textsl"&gt;GRASS&lt;/span&gt;!&lt;/li&gt;
&lt;li&gt;l'editor vettoriale di &lt;a name="tex2html3"
href="http://www.terranova.it/home.asp" id="tex2html3"&gt;&lt;span
class="textsl"&gt;Terranova ShArc&lt;/span&gt;&lt;/a&gt;: in 3 anni &lt;span
class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; ha fatto passi da gigante dal punto
di vista dell'editing
vettoriale, &lt;a name="tex2html4"
href="http://www.gvsig.gva.es/index.php?id=gvsig&amp;amp;L=2" id="tex2html4"&gt;&lt;span
class="textsl"&gt;gvSIG&lt;/span&gt;&lt;/a&gt; offre un ottimo ambiente ma non
topologico; purtroppo funzionalità del tipo &lt;span class="textit"&gt;inseguimento
linee del
raster&lt;/span&gt; o &lt;span class="textit"&gt;rimozione interattiva dei dangles&lt;/span&gt;
sono ancora
lontane; nell'editing massivo di grandi quantità di elementi geometrici
contano molto
l'interfaccia, gli acceleratori da tastiera, la velocità di ridisegno,
forma e dimensione
del puntatore, ecc.&lt;/li&gt;
&lt;li&gt;la gestione delle etichette (labels) di ArcView&amp;nbsp;(dalla vers.
8.2); tra le nuove
caratteristiche incluse in &lt;a name="tex2html5"
href="http://www.gvsig.gva.es/index.php?id=gvsig&amp;amp;L=2" id="tex2html5"&gt;&lt;span
class="textsl"&gt;gvSIG&lt;/span&gt;&amp;nbsp;(vers. 1.9)&lt;/a&gt; vi è un motore per il
&lt;span class="textit"&gt;labeling&lt;/span&gt; avanzato; speriamo in bene...&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-115912863479644942?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/115912863479644942/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/04/tre-anni-di-gis-open-source.html#comment-form" title="2 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/115912863479644942?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/115912863479644942?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/04/tre-anni-di-gis-open-source.html" title="Tre anni di Gis Open Source" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkIBQHw8cSp7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-7155449785673800956</id><published>2009-03-26T13:20:00.007+01:00</published><updated>2009-12-21T23:29:11.279+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:29:11.279+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="v.distance" /><category scheme="http://www.blogger.com/atom/ns#" term="v.select" /><title>Point in polygon (seconda parte)</title><content type="html">&lt;h2&gt;&lt;a name="SECTION00001000000000000000"
id="SECTION00001000000000000000"&gt;Classificazione di punti&lt;/a&gt;&lt;/h2&gt;
Prima di affrontare gli
aspetti del &lt;span class="textit"&gt;point in polygon&lt;/span&gt; maggiormente
legati all'&lt;a name="tex2html1"
href="http://en.wikipedia.org/wiki/PL_SQL" id="tex2html1"&gt;SQL&lt;/a&gt; è
bene
riassumere ed approfondire l'uso di &lt;a name="tex2html2"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.select.html"
id="tex2html2"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
e &lt;a name="tex2html3"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html3"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;p&gt;L'esercizio che ci si propone di risolvere è il seguente: dati una
copertura
poligonale e un vettoriale di punti, attribuire i seguenti codici
numerici:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1, ai punti completamente esterni alle aree;&lt;/li&gt;
&lt;li&gt;2, ai punti completamente all'interno delle aree ma non sui
boundaries né sui
centroidi;&lt;/li&gt;
&lt;li&gt;3, ai punti posti sui centroidi;&lt;/li&gt;
&lt;li&gt;4, ai punti posti sui nodi ma non sui vertici dei boundaries;&lt;/li&gt;
&lt;li&gt;5, ai punti posti sui vertici ma non sui nodi;&lt;/li&gt;
&lt;li&gt;6, ai punti posti sui boundaries (ma non sui vertici né sui nodi).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In pratica si vuole una classificazione dei punti in funzione della
posizione rispetto
agli elementi dei poligoni (centroidi, boundaries, nodi, vertici).&lt;/p&gt;
&lt;p&gt;La soluzione che si propone non è, &lt;span class="textit"&gt;probabilmente&lt;/span&gt;,
ottimale
ma... chi scrive non è riuscito a trovarne di migliori. Ben vengano i
suggerimenti e le
correzioni!&lt;/p&gt;
&lt;p&gt;In generale la procedura prevede:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;l'attribuzione di una categoria corrispondente al codice voluto
agli elementi dei
poligoni (centroidi, nodi, vertici, boundaries),&lt;/li&gt;
&lt;li&gt;il &lt;span class="textit"&gt;trasferimento&lt;/span&gt; della categoria
dagli elementi dei
polgioni agli attributi dei punti mediante &lt;a name="tex2html4"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html4"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;l'estrazione dei punti con il codice desiderato (&lt;a
name="tex2html5"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.extract.html"
id="tex2html5"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.extract&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;)
in un
nuovo vettoriale;&lt;/li&gt;
&lt;li&gt;la cancellazione dei punti nel vettoriale originario: vengono
cancellati solo i punti
di volta in volta già estratti con &lt;a name="tex2html6"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.extract.html"
id="tex2html6"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.extract&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a name="SECTION00001100000000000000"
id="SECTION00001100000000000000"&gt;Preparazione
dei dati&lt;/a&gt;&lt;/h3&gt;
Al solito, viene usata la &lt;a name="tex2html7"
href="http://appuntigis.blogspot.com/2008/12/simpleloc.html"
id="tex2html7"&gt;location
&lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.
Entrare nel mapset
&lt;span class="textit"&gt;&lt;em class="sans"&gt;pointInPoly&lt;/em&gt;&lt;/span&gt; creato in
precedenza.
&lt;pre&gt;db.connect driver=sqlite database='$GISDBASE/$LOCATION_NAME/$MAPSET/pointInpoly.db'&lt;br /&gt;g.copy vect=points,mypt,polyTopology,polygons --overwrite&lt;br /&gt;# # # add table to mypt&lt;br /&gt;v.db.addtable mypt&lt;br /&gt;v.db.addcol mypt col="code integer"&lt;br /&gt;g.copy vect=mypt,mypt_tmp --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Tutto il codice riportato in questo esercizio può essere scaricato
da &lt;a name="tex2html8"
href="http://www.4shared.com/file/94786260/e73aea00/sl_pointsclasssh.html"
id="tex2html8"&gt;qui&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name="SECTION00001200000000000000"
id="SECTION00001200000000000000"&gt;Punti (solo)
sui centroidi&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Si attribuisce con &lt;a name="tex2html9"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.category.html"
id="tex2html9"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.category&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
una
categoria ai centroidi corrispondente al codice voluto (3); si &lt;span
class="textit"&gt;trasferisce&lt;/span&gt; la categoria dai centroidi al campo &lt;span
class="textit"&gt;code&lt;/span&gt; di &lt;code&gt;mypt_tmp&lt;/code&gt;; si estraggono da
&lt;code&gt;mypt_tmp&lt;/code&gt;
tutti i punti con il codice pari a 3 creando il vettoriale &lt;code&gt;on_centroids&lt;/code&gt;;
si
cancellano in &lt;code&gt;mypt_tmp&lt;/code&gt; tutti i punti con codice 3.&lt;/p&gt;
&lt;pre&gt;v.category in=polygons out=polycode \&lt;br /&gt; type=centroid layer=2 cat=3 step=0 --overwrite&lt;br /&gt;v.distance from=mypt_tmp to=polycode \&lt;br /&gt; to_type=centroid to_layer=2 upload=cat \&lt;br /&gt; col=code dmax=0&lt;br /&gt;v.extract in=mypt_tmp out=on_centroids where="code=3" --overwrite&lt;br /&gt;v.edit map=mypt_tmp tool=delete where="code=3"&lt;br /&gt;g.remove vect=polycode&lt;br /&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a name="SECTION00001300000000000000"
id="SECTION00001300000000000000"&gt;Punti sui nodi
(ma non sui vertici)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Si assume la definizione di &lt;span class="textit"&gt;nodo&lt;/span&gt;
fornita in questa
&lt;a name="tex2html10"
href="http://appuntigis.blogspot.com/2009/01/full-planar-topology-in-grass.html"
id="tex2html10"&gt;esercitazione&lt;/a&gt;. Occorre estrarre i nodi con &lt;a
name="tex2html11"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.to.points.html"
id="tex2html11"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.points&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;;
in
questo modo però, il punto finale di un boundaries può coincidere con
il punto iniziale
del boundaries successivo. Si rimuovo allora i nodi duplicati con &lt;a
name="tex2html12"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.clean.html"
id="tex2html12"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.
Si
attribuisce poi la categoria 4 ai nodi estratti e, così come fatto per
i centroidi, si
&lt;span class="textit"&gt;trasferisce&lt;/span&gt; la categoria dai nodi al campo &lt;span
class="textit"&gt;code&lt;/span&gt; di &lt;code&gt;mypt_tmp&lt;/code&gt;. Si estraggono i
punti in un nuovo file
&lt;code&gt;on_nodes&lt;/code&gt; e si rimuovono nel vettoriale &lt;code&gt;my_tmp&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;v.to.points -n in=polygons out=multiNode \&lt;br /&gt; type=boundary --overwrite&lt;br /&gt;# # # remove duplicate nodes&lt;br /&gt;v.clean in=multiNode out=nodeSimple \&lt;br /&gt; type=point tool=rmdupl --overwrite&lt;br /&gt;# # # get a unique cat for each node&lt;br /&gt;v.category nodeSimple out=node \&lt;br /&gt; layer=3 opt=add cat=4 step=0 --overwrite&lt;br /&gt;# # # upload distance fron nearest node&lt;br /&gt;v.distance from=mypt_tmp to=node to_layer=3 \&lt;br /&gt; to_type=point upload=cat \&lt;br /&gt; column=code dmax=0&lt;br /&gt;v.extract in=mypt_tmp out=on_nodes where="code=4" --overwrite&lt;br /&gt;v.edit map=mypt_tmp tool=delete where="code=4"&lt;br /&gt;g.remove vect=multiNode,nodeSimple,node&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;!--due figure--&gt;
&lt;!--tutte su una riga--&gt;&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;!--prima figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/POGbPLVpbCrNMeLg9Am0jQ?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/SclQYkrjF_I/AAAAAAAAASU/T-dAEqrDCS0/s144/on_centroids.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--seconda figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/-h4AjVB-XzM-n5ndToeHPQ?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SclQjRsWKUI/AAAAAAAAASc/Bk8NM8X0Mqg/s144/on_nodes.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla prima foto--&gt;
&lt;td class="c1"&gt;Punti (solo) sui centroidi&lt;/td&gt;
&lt;!--commento alla seconda foto--&gt;&lt;td class="c1"&gt;Punti sui nodi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;a name="SECTION00001400000000000000"
id="SECTION00001400000000000000"&gt;Punti sui
vertici (ma non sui nodi)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Le operazioni sono del tutto simili a quelle già svolte per i nodi.&lt;/p&gt;
&lt;pre&gt;v.to.points -v in=polygons out=multiVertex \&lt;br /&gt; type=boundary --overwrite&lt;br /&gt;# # # remove duplicate nodes&lt;br /&gt;v.clean in=multiVertex out=vertexSimple \&lt;br /&gt; type=point tool=rmdupl --overwrite&lt;br /&gt;# # # set unique cat for each vertx&lt;br /&gt;v.category vertexSimple out=vertex \&lt;br /&gt; layer=3 opt=add cat=5 step=0 --overwrite&lt;br /&gt;# # # upload distance fron nearest node&lt;br /&gt;v.distance from=mypt_tmp to=vertex to_layer=3 \&lt;br /&gt; to_type=point upload=cat \&lt;br /&gt; column=code dmax=0&lt;br /&gt;v.extract in=mypt_tmp out=on_vertices where="code=5" --overwrite&lt;br /&gt;v.edit map=mypt_tmp tool=delete where="code=5"&lt;br /&gt;g.remove vect=multiVertex,vertexSimple,vertex&lt;br /&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a name="SECTION00001500000000000000"
id="SECTION00001500000000000000"&gt;Punti sui
boundaries (ma non sui nodi né sui vertici)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A questo punto è doveroso spiegare il perchè si sono cancellati i
punti da
&lt;code&gt;mypt_tmp&lt;/code&gt; ogni volta che si sono estratti in un nuovo file:
se non lo si
facesse sarebbe impossibile riuscire ad estrarre i punti posti sui
boundaries (o meglio,
&lt;span class="textit"&gt;lungo i boundaries&lt;/span&gt;) senza estrarre anche i
punti posti sui
vertici e i sui nodi dei boundaries medesimi (provare per credere).
Come si è detto
questa procedura è lungi dall'essere ottimale (sig!)...&lt;/p&gt;
&lt;pre&gt;v.category in=polygons type=boundary \&lt;br /&gt; out=arcs layer=2 opt=add cat=6 step=0 --overwrite&lt;br /&gt;v.distance from=mypt_tmp to=arcs to_layer=2 \&lt;br /&gt; to_type=boundary to_layer=2 upload=cat \&lt;br /&gt; col=code dmax=0&lt;br /&gt;v.extract in=mypt_tmp out=on_boundaries where="code=6" --overwrite&lt;br /&gt;v.edit map=mypt_tmp tool=delete where="code=6"&lt;br /&gt;g.remove vect=arcs&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;!--due figure--&gt;
&lt;!--tutte su una riga--&gt;&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;!--prima figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/M_IpHbh2EfmtFsKaT7P1AA?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SclQjkOhQQI/AAAAAAAAASk/RpVqOzx-gG0/s144/on_vertices.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--seconda figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/gXNI8GeqP_J3_p5fPKKzVQ?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SclTpFhM9gI/AAAAAAAAAS8/mTAYVFN0cnI/s144/on_boundaries.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla prima foto--&gt;
&lt;td class="c1"&gt;Punti (solo) sui vertici&lt;/td&gt;
&lt;!--commento alla seconda foto--&gt;&lt;td class="c1"&gt;Punti sui boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;a name="SECTION00001600000000000000"
id="SECTION00001600000000000000"&gt;Punti esterni
alle aree&lt;/a&gt;&lt;/h3&gt;
Con &lt;a name="tex2html13"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.select.html"
id="tex2html13"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
è, a
questo punto, banale estrarre i punti esterni alle aree (codice 1):
&lt;pre&gt;v.select -r ainput=mypt_tmp \&lt;br /&gt; binput=polygons \&lt;br /&gt; op=overlap out=out_area --overwrite&lt;br /&gt;v.db.update out_area col=code value=1&lt;br /&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a name="SECTION00001700000000000000"
id="SECTION00001700000000000000"&gt;Punti nelle
aree (ma non sui centroidi né sui boundaries)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Si usa &lt;a name="tex2html14"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.select.html"
id="tex2html14"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
con una
certa sicurezza: avendo cancellato via via i punti da &lt;code&gt;mypt_tmp&lt;/code&gt;
non si
&lt;span class="textit"&gt;dovrebbe&lt;/span&gt; (ancora una volta: la procedura
qui proposta è lungi
dall'essere ottimale) correre il rischio di estrarre punti non corretti.&lt;/p&gt;
&lt;pre&gt;v.select ainput=mypt_tmp \&lt;br /&gt; binput=polygons \&lt;br /&gt; op=overlap out=in_area --overwrite&lt;br /&gt;v.db.update in_area col=code value=2&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;!--due figure--&gt;
&lt;!--tutte su una riga--&gt;&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;!--prima figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/WXYHyng72tqyxHLhbwfKAQ?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SclQkOt3D2I/AAAAAAAAAS0/4S7DXNMP-8E/s144/out_area.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--seconda figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/ZB71phE99-8X_rgRBeHU9w?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SclQX0aJU2I/AAAAAAAAAR8/Sf3vNDyuAXk/s144/in_area.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla prima foto--&gt;
&lt;td class="c1"&gt;Punti esterni alle aree&lt;/td&gt;
&lt;!--commento alla seconda foto--&gt;&lt;td class="c1"&gt;Punti nelle aree (ma
non sui centroidi, nodi,vertici, boundaries)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;a name="SECTION00001800000000000000"
id="SECTION00001800000000000000"&gt;Creazione
della tabella dei punti&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Verrebbe da usare, a questo punto, &lt;a name="tex2html15"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.patch.html"
id="tex2html15"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.patch&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;v.patch -e in=in_area,out_area,on_boundaries,\&lt;br /&gt; on_nodes,on_vertices,on_centroids \&lt;br /&gt; out=points_code_vpatch --overwrite&lt;br /&gt;v.db.select points_code_vpatch&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;ma ecco il risultato nella tabella attributi:&lt;/p&gt;
&lt;pre&gt;cat|code&lt;br /&gt;12|2&lt;br /&gt;[...]&lt;br /&gt;18|2&lt;br /&gt;36|2&lt;br /&gt;38|1&lt;br /&gt;[...]&lt;br /&gt;47|1&lt;br /&gt;81|6&lt;br /&gt;[...]&lt;br /&gt;87|6&lt;br /&gt;110|4&lt;br /&gt;[...]&lt;br /&gt;152|5&lt;br /&gt;171|3&lt;br /&gt;[...]&lt;br /&gt;174|3&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Le categorie originarie di &lt;code&gt;mypt&lt;/code&gt; vengono perse; se si
vogliono preservare
le categorie, occorre creare una tabella unica partendo dagli attributi
dei diversi files
di volta in volta estratti (&lt;code&gt;on_centroids&lt;/code&gt;, &lt;code&gt;on_nodes&lt;/code&gt;,
ecc.) e
connetterla (&lt;a name="tex2html16"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.db.connect.html"
id="tex2html16"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.db.connect&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;)
sul
layer 1 sovrascrivendo la connessione esistente &lt;code&gt;mypt&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;# # # test if table exists &lt;br /&gt;# # # from v.db.addtable script&lt;br /&gt;table="points_code"&lt;br /&gt;database=`db.connect -p | grep '^database' | cut -d':' -f2`&lt;br /&gt;driver=`db.connect -p | grep '^driver' | cut -d':' -f2`&lt;br /&gt;db.tables database="$database" driver="$driver" 2&amp;gt; /dev/null | grep "^$table$"&lt;br /&gt;# # # if table exists it will be deleted&lt;br /&gt;if [ $? -eq 0 ]; then&lt;br /&gt; db.droptable -f $table&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;echo "CREATE TABLE $table AS \&lt;br /&gt; SELECT * FROM on_boundaries \&lt;br /&gt; UNION \&lt;br /&gt; SELECT * FROM on_nodes \&lt;br /&gt; UNION \&lt;br /&gt; SELECT * FROM on_vertices \&lt;br /&gt; UNION \&lt;br /&gt; SELECT * FROM in_area \&lt;br /&gt; UNION \&lt;br /&gt; SELECT * FROM out_area \&lt;br /&gt; UNION \&lt;br /&gt; SELECT * FROM on_centroids" | db.execute&lt;br /&gt;v.db.connect map=mypt table=points_code key=cat layer=1 -o&lt;br /&gt;v.db.select mypt layer=1&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;In questo modo la tabella &lt;code&gt;points_code&lt;/code&gt; viene connessa
al vettoriale
&lt;code&gt;mypt&lt;/code&gt; sul layer 1 (non è detto che il nome del vettoriale e
il nome della
tabella ad esso collegata debbano proprio essere uguali!).&lt;/p&gt;
&lt;p&gt;La prima parte del codice serve solamente per testare se la tabella &lt;span
class="textit"&gt;points_code&lt;/span&gt; esiste già; in caso positivo viene
sovrascritta con la nuova
creata dal codice &lt;a name="tex2html17"
href="http://en.wikipedia.org/wiki/PL_SQL" id="tex2html17"&gt;SQL&lt;/a&gt;
riportato.&lt;/p&gt;
&lt;p&gt;Come si vede dal risultato di &lt;a name="tex2html18"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.db.select.html"
id="tex2html18"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.db.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
la
tabella sul layer 2 di &lt;code&gt;mypt&lt;/code&gt; contiene due campi: la &lt;span
class="textit"&gt;cat&lt;/span&gt; che corrisponde ovviamente a quella del
vettoriale originario
(&lt;code&gt;points&lt;/code&gt;) e il &lt;span class="textit"&gt;code&lt;/span&gt; contenente
la codifica basata
sulla localizzazione del punto rispetto agli elementi della copertura
poligonale.&lt;/p&gt;
&lt;p&gt;Un'ultima semplice e grossolana verifica sul numero dei punti nei
diversi files
intermedi rispetto al vettoriale contenente tutti i punti (&lt;code&gt;mypt&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;or vectorpoint in "on_vertices" \&lt;br /&gt; "on_boundaries" \&lt;br /&gt; "on_nodes" \&lt;br /&gt; "on_centroids" \&lt;br /&gt; "out_area" \&lt;br /&gt; "in_area" \&lt;br /&gt; "mypt"; do&lt;br /&gt;echo "$vectorpoint $(v.info -t $vectorpoint | grep points | cut -d"=" -f2)"&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;on_vertices 7&lt;br /&gt;on_boundaries 5&lt;br /&gt;on_nodes 5&lt;br /&gt;on_centroids 4&lt;br /&gt;out_area 10&lt;br /&gt;in_area 8&lt;br /&gt;mypt 39&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;La somma dei punti nei diversi vettoriali (&lt;code&gt;on_centroids&lt;/code&gt;,
&lt;code&gt;on_nodes&lt;/code&gt;, ecc.) corrisponde al numero dei punti contenuti
in
&lt;code&gt;mypt&lt;/code&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-7155449785673800956?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/7155449785673800956/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/03/point-in-polygon-seconda-parte.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7155449785673800956?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7155449785673800956?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/03/point-in-polygon-seconda-parte.html" title="Point in polygon (seconda parte)" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_87lofqKSw4A/SclQYkrjF_I/AAAAAAAAASU/T-dAEqrDCS0/s72-c/on_centroids.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkQGQXc6eSp7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-5997699151772463526</id><published>2009-03-01T22:28:00.006+01:00</published><updated>2009-12-21T23:25:20.911+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:25:20.911+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="v.distance" /><category scheme="http://www.blogger.com/atom/ns#" term="v.select" /><title>Point in polygon (prima parte)</title><content type="html">&lt;h2&gt;&lt;a name="SECTION00001000000000000000"
id="SECTION00001000000000000000"&gt;Obbiettivi&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Trovare se una determinata area contiene/non contiene un dato punto
è tra i più
classici dei problemi &lt;span class="textsl"&gt;GIS&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; risolve il problema con
alcuni tools:&lt;/p&gt;
&lt;p&gt;&lt;a name="tex2html1"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.select.html"
id="tex2html1"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;,
&lt;a name="tex2html2"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html2"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
e
&lt;a name="tex2html3"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.what.vect.html"
id="tex2html3"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.what.vect&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Questa esercitazione introduttiva affronta il problema del &lt;span
class="textit"&gt;point
in polygon&lt;/span&gt;, ed il relativo passaggio degli attributi dagli
elementi poligonali ai
punti contenuti (o a quelii più vicini, sovrapposti, ecc): lo &lt;span
class="textit"&gt;spatial join&lt;/span&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00002000000000000000"
id="SECTION00002000000000000000"&gt;Set di dati
per l'esercitazione&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Al solito l'esercitazione sarà condotta con la &lt;a name="tex2html4"
href="http://appuntigis.blogspot.com/2008/12/simpleloc.html"
id="tex2html4"&gt;location
&lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;, la
location creata
apposta per fini didattici.&lt;/p&gt;
&lt;p&gt;È necessario creare un nuovo mapset &lt;span class="textit"&gt;&lt;em
class="sans"&gt;pointInPoly&lt;/em&gt;&lt;/span&gt; ed accedervi.&lt;/p&gt;
&lt;p&gt;Per poter usufruire appieno dell'&lt;a name="tex2html5"
href="http://en.wikipedia.org/wiki/PL_SQL" id="tex2html5"&gt;SQL&lt;/a&gt; (per
la seconda parte di
questa esercitazione) occorre connettere il mapset ad un database &lt;a
name="tex2html6" href="http://www.sqlite.org/" id="tex2html6"&gt;SQLite&lt;/a&gt;
e copiare i due vettoriali dal
mapset &lt;span class="textit"&gt;&lt;em class="sans"&gt;PERMANENT&lt;/em&gt;&lt;/span&gt; al
mapset &lt;span class="textit"&gt;&lt;em class="sans"&gt;pointInPoly&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;db.connect driver=sqlite \&lt;br /&gt; database='$GISDBASE/$LOCATION_NAME/$MAPSET/pointInpoly.db'&lt;br /&gt;g.copy vect=points,mypt,polyTopology,polygons --overwrite&lt;br /&gt;v.db.addtable mypt&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Le tabelle dei due vettoriali sono ora memorizzate nel database &lt;a
name="tex2html7" href="http://www.sqlite.org/" id="tex2html7"&gt;SQLite&lt;/a&gt;
denominato
&lt;code&gt;pointInpoly.db&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il vettoriale di punti usato è stato creato apposta per consentire
di avere tutte le
combinazioni possibili (punto in area, fuori area, su taluni centroidi,
su alcuni nodi,
su alcuni vertici, sui boundaries, &lt;span class="textit"&gt;molto vicino&lt;/span&gt;
ai centroidi,
&lt;span class="textit"&gt;molto vicino&lt;/span&gt; ai boundaries, ecc.).&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00003000000000000000"
id="SECTION00003000000000000000"&gt;Selezione
semplice di punti (in,out,on...)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dati due vettoriali, &lt;a name="tex2html8"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.select.html"
id="tex2html8"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
consente di
selezionare ed estrarre in un nuovo vettoriale gli elementi del primo
(&lt;code&gt;ainput&lt;/code&gt;) sovrapposti al secondo (&lt;code&gt;binput&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Ecco in sequenza le diverse operazioni; vengono lasciati i commenti
che servono da
spiegazione:&lt;/p&gt;
&lt;pre&gt;# # # select all points into polygons&lt;br /&gt;v.select ainput=mypt \&lt;br /&gt; binput=polygons btype=area \&lt;br /&gt; op=overlap out=inarea --overwrite&lt;br /&gt;&lt;br /&gt;# # # select all points outside polygons&lt;br /&gt;v.select -r ainput=mypt \&lt;br /&gt; binput=polygons \&lt;br /&gt; op=overlap out=outarea --overwrite&lt;br /&gt;&lt;br /&gt;# # # select all points on centroid&lt;br /&gt;v.select ainput=mypt \&lt;br /&gt; binput=polygons btype=centroid\&lt;br /&gt; op=overlap out=oncentroids --overwrite&lt;br /&gt; &lt;br /&gt;# # #select all points on boundary&lt;br /&gt;v.select ainput=mypt \&lt;br /&gt; binput=polygons btype=boundary \&lt;br /&gt; op=overlap out=onboundaries --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Al momento &lt;code&gt;overlap&lt;/code&gt; è l'unico operatore di &lt;a
name="tex2html9"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.select.html"
id="tex2html9"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
ma nella
&lt;a name="tex2html10"
href="http://grass.osgeo.org/wiki/GRASS_6.4_Feature_Plan"
id="tex2html10"&gt;&lt;span class="textit"&gt;roabmap&lt;/span&gt; di &lt;span
class="textsl"&gt;GRASS&lt;/span&gt;&lt;/a&gt;
si legge anche di operatori di contenimento e adiacenza.&lt;/p&gt;
&lt;p&gt;Le mappe che seguono illustrano i risultati ottenuti con &lt;a
name="tex2html11"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.select.html"
id="tex2html11"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.select&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
e sono
ottenute in modo automatico tramite lo script che può essere scaricato
da &lt;a name="tex2html12"
href="http://www.4shared.com/file/90208097/896f3e50/sl_point_in_poly_1.html"
id="tex2html12"&gt;questo link&lt;/a&gt;&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/S4UBTcLa4BFfiuCcOP3-Rw?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/SclQXWlsZyI/AAAAAAAAAR0/1U22vwQdoGs/s144/inarea.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/g7AgwotmtROrAJ74o9NFrA?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SclQX2ohkcI/AAAAAAAAASE/Di_KhUI5zSY/s144/onboundaries.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla prima foto--&gt;
&lt;td class="c1"&gt;Punti all'interno delle aree&lt;/td&gt;
&lt;!--commento alla seconda foto--&gt;&lt;td class="c1"&gt;Punti sui boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/uuyPI51acZywUxwNPlT-KQ?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh4.ggpht.com/_87lofqKSw4A/SclQYO4yq0I/AAAAAAAAASM/YIZcTcgbDLk/s144/oncentroids.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/NB5A_9FXVjcDlr0l7HmggQ?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/SclQjhJP31I/AAAAAAAAASs/NPMdNcON5XY/s144/outarea.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla terza foto--&gt;
&lt;td class="c1"&gt;Punti sui centroidi&lt;/td&gt;
&lt;!--commento alla quarta foto--&gt;&lt;td class="c1"&gt;Punti non sovrapposti
alle aree&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;a name="SECTION00004000000000000000"
id="SECTION00004000000000000000"&gt;Selezione di
punti con passaggio di attributi&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Il modulo &lt;a name="tex2html13"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html13"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
&lt;span class="textit"&gt;spaventa&lt;/span&gt; un po': la sua sintassi è davvero
complicata (almeno
per me!) ma è ampiamente giustificata dall'elevato numero di analisi
possibili. Il
manuale riporta che &lt;a name="tex2html14"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html14"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
trova,
per ogni elemento del vettoriale &lt;span class="textit"&gt;from&lt;/span&gt;, il
più vicino elemento
nel vettoriale &lt;span class="textit"&gt;to&lt;/span&gt;: decisamente diminutivo!
In realtà &lt;a name="tex2html15"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html15"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
è un
formidabile tool per realizzare joins spaziali.&lt;/p&gt;
&lt;p&gt;Una nota generale: Si impara ad usare &lt;a name="tex2html16"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html16"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
usandolo..., come per moltissimi altri comandi di &lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp;
che a prima vista &lt;span class="textit"&gt;spaventano&lt;/span&gt; per l'elevato
numero di
opzioni.&lt;/p&gt;
&lt;h3&gt;&lt;a name="SECTION00004100000000000000"
id="SECTION00004100000000000000"&gt;Upload della
cat del più vicino poligono.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Il primo e più semplice dei problemi è il seguente: dato un
vettoriale costituito da
punti e un altro vettoriale costituito da poligoni, trovare per ciascun
punto il più
vicino poligono e caricare la categoria di quest'ultimo nella tabella
degli attributi dei
punti.&lt;/p&gt;
&lt;p&gt;Si crea quindi una sorta di &lt;span class="textit"&gt;legame spaziale&lt;/span&gt;
(=join) tra
ciascun punto e il poligono più vicino.&lt;/p&gt;
&lt;pre&gt;# # # upload category of the NEAREST polygons&lt;br /&gt;v.db.addcol mypt col="polyCatNearest integer"&lt;br /&gt;# # # dmax=-1 (default, no limit): all points&lt;br /&gt;v.distance from=mypt to=polygons \&lt;br /&gt; upload=cat col=polyCatNearest dmax=-1&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Settando il parametro &lt;span class="textit"&gt;dmax&lt;/span&gt; al valore di
-1 non si pongono
limiti alla ricerca del più vicino poligono; pertanto, anche gli
attributi dei punti
esterni (non sovrapposti) alle aree vengono aggiornati con la cat del
poligono più
vicino; se si setta il valore pari a 0, saranno trovati solo i punti &lt;span
class="textbf"&gt;sovrapposti&lt;/span&gt; ai poligoni.&lt;/p&gt;
&lt;pre&gt;v.db.addcol mypt col="polyCatOverlap integer"&lt;br /&gt;# # # dmax=0: only points that OVERLAP polygons&lt;br /&gt;v.distance from=mypt to=polygons \&lt;br /&gt; upload=cat col=polyCatOverlap dmax=0&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si osservi ora la tabella degli attributi dei punti:&lt;/p&gt;
&lt;pre&gt;v.db.select mypt col=cat,polyCatNearest,polyCatOverlap&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;I punti 6 e 7 non sembrano essere stati presi in considerazione: la
cat del poligono
più vicino, per questi due punti, è nulla. I punti 6 e 7 sono in
un'isola (area senza
centroide e con categoria nulla): in questo caso il valore caricato da &lt;a
name="tex2html17"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html17"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
sugli
attributi dei punti è nullo.&lt;/p&gt;
&lt;p&gt;Se si vuole realizzare un upload di tutte le cat dei centroidi dei
poligoni sugli
attributi dei punti occorre settare il parametro &lt;code&gt;to_type&lt;/code&gt;
a &lt;span class="textit"&gt;centroid&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;v.db.addcol mypt col="centroidCat integer"&lt;br /&gt;v.distance from=mypt to=polygons to_type=centroid \&lt;br /&gt; upload=cat col=centroidCat dmax=-1 \&lt;br /&gt; out=distFromCentroid --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si osservi che ora anche ai punti 6 e 7 è stata caricata la cat del
centroide più
vicino:&lt;/p&gt;
&lt;pre&gt;v.db.select mypt col=cat,polyCatNearest,polyCatOverlap,centroidCat \&lt;br /&gt; where="cat=6 OR cat=7"&lt;br /&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a name="SECTION00004200000000000000"
id="SECTION00004200000000000000"&gt;Upload della
cat del centroide posto ad una distanza minima data.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sino ad ora si è usato &lt;a name="tex2html18"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html18"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
per
trovare gli oggetti (poligoni o centroidi) più vicini; è pure possibile
aggiornare la
tabella attributi dei punti con la cat dei centroidi trovati ad una
distanza minima
data:&lt;/p&gt;
&lt;pre&gt;v.db.addcol mypt col="centroidCatDmin integer"&lt;br /&gt;v.distance from=mypt to=polygons to_type=centroid \&lt;br /&gt; upload=cat col=centroidCatDmin \&lt;br /&gt; dmin=3 out=distFormCentroidDmin --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;In questo caso &lt;a name="tex2html19"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html19"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
cerca i
centroidi distanti almeno 3 unità di mappa da ciascun punto.&lt;/p&gt;
&lt;p&gt;&lt;!--due figure--&gt;
&lt;!--tutte su una riga--&gt;&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;!--prima figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/6EL8-aBaE9PrGwPdmLZANg?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh4.ggpht.com/_87lofqKSw4A/SclQN12nl8I/AAAAAAAAARU/poxU2FLaczo/s144/distFromCentroid.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--seconda figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/Ykq7m8CaXG3vpQEgzr_Rlg?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SclQOEf7aWI/AAAAAAAAARc/lUCQMsJNEy4/s144/distFromCentroidDmin.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla prima foto--&gt;
&lt;td class="c1"&gt;Distanza dai centroidi&lt;/td&gt;
&lt;!--commento alla seconda foto--&gt;&lt;td class="c1"&gt;Centroidi distanti
almeno 3 unità di mappa dai punti&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;a name="SECTION00004300000000000000"
id="SECTION00004300000000000000"&gt;Upload
dell'area dei poligoni sugli attributi dei punti sovrapposti.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Per creare una relazione spaziale tra punti e poligoni, è di per sè
sufficiente
caricare la cat dei poligoni sugli attributi dei punti con i metodi
appena visti; come si
vedrà in seguito, in tale maniera è possibile interrogare la tabella
dei poligoni in
funzione della posizione dei punti. Non sempre però è questo il
risultato desiderato: si
potrebbe ad esempio richiedere un passaggio diretto di taluni attributi
dei poligono
sulla tabella dei punti.&lt;/p&gt;
&lt;p&gt;Quale esempio di upload di attributi si può calcolare l'area dei
poligoni e
&lt;span class="textit"&gt;caricarla&lt;/span&gt; nella tabella dei punti. In
questo esempio verranno
presi in considerazione solo i punti sovrapposti ai poligoni:&lt;/p&gt;
&lt;pre&gt;# # # upload all polygons (areas) attributes&lt;br /&gt;# # # required fields (columns) in "from" vector&lt;br /&gt;# # # must be present before run v.distance&lt;br /&gt;v.db.addcol mypt col="polyArea double precision"&lt;br /&gt;# # # add column for area polygons&lt;br /&gt;v.db.addcol polygons col="area double precision"&lt;br /&gt;# # # calculate polygons area size&lt;br /&gt;v.to.db polygons opt=area col=area&lt;br /&gt;# # # upload polygons attributes to OVERLAP points&lt;br /&gt;v.distance from=mypt to=polygons \&lt;br /&gt; upload=to_attr col=polyArea \&lt;br /&gt; to_col=area dmax=0&lt;br /&gt;v.db.select mypt&lt;br /&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a name="SECTION00005000000000000000"
id="SECTION00005000000000000000"&gt;Upload della
distanza fra punti e centroidi&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a name="tex2html20"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html20"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
è un
calcolatore di distanze fra oggetti; ecco due esempi dell'upload delle
distanze tra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;i punti e i centroidi dei poligoni;&lt;/li&gt;
&lt;li&gt;i punti e i boundaries dei poligoni&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;# # # upload distance from the nearest centroid&lt;br /&gt;v.db.addcol mypt col="centroidDist double precision"&lt;br /&gt;v.distance from=mypt to=polygons to_type=centroid \&lt;br /&gt; upload=dist col=centroidDist \&lt;br /&gt; dmax=-1 &lt;br /&gt;# # # upload distance from the nearest boundary (ALL points)&lt;br /&gt;v.db.addcol mypt col="boundaryDist double precision"&lt;br /&gt;v.distance from=mypt to=polygons to_type=boundary \&lt;br /&gt; upload=dist col=boundaryDist \&lt;br /&gt; dmax=-1 out=distFromBondary --overwrite&lt;br /&gt;&lt;br /&gt;v.db.select mypt col=cat,centroidDist,boundaryDist&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Come si sarà certamente notato è sempre possibile &lt;span
class="textit"&gt;materializzare&lt;/span&gt; la distanza fra gli oggetti,
settando il parametro
opzionale &lt;span class="textit"&gt;out&lt;/span&gt; con il nome del file
vettoriale desiderato.&lt;/p&gt;
&lt;p&gt;&lt;!--due figure--&gt;
&lt;!--tutte su una riga--&gt;&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;!--prima figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/Lftr5Yeuozr60-WCLEBoXA?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SclQNlbumWI/AAAAAAAAARM/rmQ_beIfo8c/s144/distFromBoundaries.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--seconda figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/lNZZ-p7cXZpKc5wA9Xu4Ew?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SclQOBqI25I/AAAAAAAAARk/q-d7RRUG38M/s144/distFromNode.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla prima foto--&gt;
&lt;td class="c1"&gt;Distanze tra punti e boundaries&lt;/td&gt;
&lt;!--commento alla seconda foto--&gt;&lt;td class="c1"&gt;Distanze tra punti e
nodi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;a name="SECTION00006000000000000000"
id="SECTION00006000000000000000"&gt;Casi
particolari&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gli esercizi precedenti hanno consentito di apprendere le operazioni
basilari con
&lt;a name="tex2html21"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html21"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ecco alcuni casi meno usuali.&lt;/p&gt;
&lt;h3&gt;&lt;a name="SECTION00006100000000000000"
id="SECTION00006100000000000000"&gt;Upload della
distanza, della cat univoca e delle coordinate del più vicino nodo&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Si assume la definizione di &lt;span class="textit"&gt;nodo&lt;/span&gt;
fornita in questa
&lt;a name="tex2html22"
href="http://appuntigis.blogspot.com/2009/01/full-planar-topology-in-grass.html"
id="tex2html22"&gt;esercitazione&lt;/a&gt;. Data quindi una copertura
poligonale, estrarre i nodi
rimuovendo ogni sovrapposizione, identificarli univocamente e applicare
&lt;a name="tex2html23"
href="http://grass.osgeo.org/grass65/manuals/html65_user/v.distance.html"
id="tex2html23"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
in
modo da ottenere l'upload, sulla tabella attributi dei punti, di:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;distanza fra nodo e più vicino punto;&lt;/li&gt;
&lt;li&gt;cat univoca del nodo;&lt;/li&gt;
&lt;li&gt;coordinate del nodo.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;v.db.addcol mypt col="nodeDist double precision, \&lt;br /&gt; nodeCat integer, \&lt;br /&gt; node_x double precision, \&lt;br /&gt; node_y double precision"&lt;br /&gt;# # # extract nodes from polygons&lt;br /&gt;v.to.points -n in=polyTopology out=multiNode \&lt;br /&gt; type=boundary --overwrite&lt;br /&gt;# # # remove duplicate nodes&lt;br /&gt;v.clean in=multiNode out=nodeSimple \&lt;br /&gt; type=point tool=rmdupl --overwrite&lt;br /&gt;# # # get a unique cat for each node&lt;br /&gt;v.category nodeSimple out=node \&lt;br /&gt; layer=3 opt=add --overwrite&lt;br /&gt;# # # upload distance fron nearest node&lt;br /&gt;v.distance from=mypt to=node to_layer=3 \&lt;br /&gt; to_type=point upload=dist \&lt;br /&gt; col=nodeDist dmax=-1&lt;br /&gt;# # # upload cat from nearest node&lt;br /&gt;v.distance from=mypt to=node to_layer=3 \&lt;br /&gt; to_type=point upload=cat \&lt;br /&gt; col=nodeCat dmax=-1&lt;br /&gt;# # # upload coordinates from nearest node&lt;br /&gt;v.distance from=mypt to=node to_layer=3 \&lt;br /&gt; to_type=point upload=to_x,to_y \&lt;br /&gt; col=node_x,node_y \&lt;br /&gt; dmax=-1 out=distFromNode --overwrite&lt;br /&gt;v.db.select mypt col=cat,nodeDist,nodeCat,node_x,node_y&lt;br /&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a name="SECTION00006200000000000000"
id="SECTION00006200000000000000"&gt;Upload della
cat univoca dei boundaries sugli attributi dei punti posti &lt;span
class="textit"&gt;sui&lt;/span&gt; boundaries medesimi&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Nel modello vettoriale implementato in &lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp;
i
boundaries costituiscono i contorni delle aree e, normalmente, non sono
identificati
univocamente con una category.&lt;/p&gt;
&lt;pre&gt;v.db.addcol mypt col="boundCatOverlap"&lt;br /&gt;# # # get unique cat (on layer 2)&lt;br /&gt;v.category in=polyTopology type=boundary \&lt;br /&gt; out=arcs layer=2 opt=add --overwrite&lt;br /&gt;v.distance from=mypt to=arcs to_layer=2 \&lt;br /&gt; to_type=boundary upload=cat \&lt;br /&gt; col=boundCatOverlap dmax=0&lt;br /&gt;v.db.select mypt col=cat,boundCatOverlap&lt;br /&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a name="SECTION00006300000000000000"
id="SECTION00006300000000000000"&gt;Upload della
cat univoca dei boundaries sugli attributi dei punti posti entro due
valori di distanza
dati&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;È una veriante di quanto appena visto: i punti sui quali caricare la
cat dei
boundaries sono posti entro una distanza minima e massima dai
boundaries medesimi.&lt;/p&gt;
&lt;pre&gt;v.db.addcol mypt col="boundCatZone double precision"&lt;br /&gt;v.distance from=mypt to=arcs to_layer=2 \&lt;br /&gt; to_type=boundary upload=cat \&lt;br /&gt; col=boundCatZone out=distFromZone \&lt;br /&gt; dmin=0.2 dmax=2 --overwrite&lt;br /&gt;v.db.select mypt col=cat,boundCatOverlap,boundCatZone&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;!--una figure--&gt;&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;!--prima figura--&gt; &lt;a
href="http://picasaweb.google.com/lh/photo/SbwtVg-Kpp-5965wScqxAw?feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh4.ggpht.com/_87lofqKSw4A/SclQOPP2T6I/AAAAAAAAARs/dsfR4YVsZqE/s144/distFromZone.png" /&gt;
&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;!--commento alla prima foto--&gt;
&lt;td class="c1"&gt;Punti compresi entro due valori di distanza (0.2 e
2) dai boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-5997699151772463526?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/5997699151772463526/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/03/point-in-polygon-prima-parte.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/5997699151772463526?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/5997699151772463526?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/03/point-in-polygon-prima-parte.html" title="Point in polygon (prima parte)" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_87lofqKSw4A/SclQXWlsZyI/AAAAAAAAAR0/1U22vwQdoGs/s72-c/inarea.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Dk8DQH0zfip7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-3063222445447518542</id><published>2009-02-09T22:10:00.004+01:00</published><updated>2009-12-21T23:34:31.386+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:34:31.386+01:00</app:edited><title>Random Network Analisys in GRASS</title><content type="html">Questa è un'esercitazione introduttiva sulla &lt;span class="textit"&gt;Network
Analisys&lt;/span&gt;
che verrà condotta su un reticolo di linee e punti creati in modo
casuale; su detto
reticolo verranno applicati i diversi tools: creazione del grafo delle
isodistanze dai
punti, percorso minimo, problema del &lt;span class="textit"&gt;commesso
viaggiatore&lt;/span&gt;,
ecc.
&lt;p&gt;Si farà uso del monitor per la rappresentazione dei risultati: (&lt;a
name="tex2html1"
href="http://grass.osgeo.org/grass64/manuals/html64_user/d.mon.html"
id="tex2html1"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;d.mon&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;);
alcune volte
le operazioni usate potrebbero risultare di difficile comprensione a
chi non avesse
dimestichezza con la shell; si consiglia, in tal caso, di visualizzare
i risultati nel
Map Display nel modo usuale. L'intento è evidente: fare qualche
semplice &lt;span class="textit"&gt;studio&lt;/span&gt; sui layouts per
riutilizzarli in altri lavori.&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00001000000000000000"
id="SECTION00001000000000000000"&gt;Set di dati
per l'esercitazione&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Verrà usata, come al solito, location &lt;span class="textit"&gt;&lt;em
class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;; essendo la creazione del network
completamente casuale,
qualsiasi location può andare bene.&lt;/p&gt;
&lt;p&gt;La location &lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;
è stata creata
appositamente per fini didattici; per avere maggiori notizie
vedere&amp;nbsp;&lt;a name="tex2html2"
href="http://appuntigis.blogspot.com/2008/12/simpleloc.html"
id="tex2html2"&gt;questo&lt;/a&gt; &amp;nbsp;precedente blog.&lt;/p&gt;
&lt;p&gt;La location &lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;
può essere
scaricata da &lt;a
href="http://www.4shared.com/file/81992813/2a7f5805/simpleloc.html"
target="_blank"&gt;qui&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00002000000000000000"
id="SECTION00002000000000000000"&gt;Creazione del
network&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un network è formato da archi e nodi tra loro connessi a formare un
reticolo.&lt;/p&gt;
&lt;p&gt;Il procedimento per creare il reticolo in modo casuale è il seguente:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;si &lt;span class="textit"&gt;estraggono a sorte&lt;/span&gt; un certo
numero di punti (&lt;a name="tex2html3"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.random.html"
id="tex2html3"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.random&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;da ogni punto si ricavano le coordinate (&lt;a name="tex2html4"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.out.ascii.html"
id="tex2html4"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.out.ascii&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;)
e si
memorizzano in un file di testo;&lt;/li&gt;
&lt;li&gt;si leggono le coordinate dal file e si crea un vettoriale di
linee (&lt;a name="tex2html5"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.in.ascii.html"
id="tex2html5"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.in.ascii&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;si pulisce il vettoriale di linee (&lt;a name="tex2html6"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.clean.html"
id="tex2html6"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;si estraggono nuovamente a sorte un certo numero di punti che
andranno a costituire i
nodi del network;&lt;/li&gt;
&lt;li&gt;si crea la connessione (&lt;a name="tex2html7"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.html"
id="tex2html7"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;)
tra nodi e
reticolo di linee (archi).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;È consigliabile scrivere tutti i comandi in un file di testo ed
eseguirlo come script;
sarà interessante ripetere l'esercitazione variando il numero di punti
casuali ed alcuni
altri parametri.&lt;/p&gt;
&lt;p&gt;Si riportano nel seguito i comandi impartiti, lasciando i relativi
commenti.&lt;/p&gt;
&lt;pre&gt;# # # set region to default values&lt;br /&gt;g.region -d&lt;br /&gt;# # # set number of random points&lt;br /&gt;numpoint="120"&lt;br /&gt;# # # create a random points&lt;br /&gt;v.random out=rndpoints n=$numpoint --overwrite&lt;br /&gt;# # # create a temporary file to store points coordiantes&lt;br /&gt;tmpascii="$(g.tempfile pid=$$)"&lt;br /&gt;# # # first row in standard mode: (L)ine number of points&lt;br /&gt;echo "L $numpoint" &amp;gt; ${tmpascii}&lt;br /&gt;# # # append coordinates to ascii file; formatting by awk&lt;br /&gt;v.out.ascii in=rndpoints fs=" "| awk '{print $1 " " $2}' &amp;gt;&amp;gt; ${tmpascii}&lt;br /&gt;# # # inport ascii file; bad =&amp;gt; before cleaning&lt;br /&gt;v.in.ascii -n in=${tmpascii} out=rndlines_bad format=standard --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Il numero di punti è settato a 120. È particolarmente utile
osservare come si possa
creare il reticolo di linee importando le coordinate dal file ASCII
generato dai punti:
quale applicazione pratica si pensi alla creazione di linee partendo da
punti rilevati
con strumenti GPS.&lt;/p&gt;
&lt;p&gt;L'output di &lt;a name="tex2html8"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.out.ascii.html"
id="tex2html8"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.out.ascii&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
viene
&lt;span class="textit"&gt;incanalato&lt;/span&gt; (&lt;span class="textit"&gt;pipe&lt;/span&gt;,
|) attraverso
&lt;a name="tex2html9"
href="http://www.gnu.org/software/gawk/manual/gawk.html" id="tex2html9"&gt;&lt;span
class="textbf"&gt;&lt;em class="slanted"&gt;awk&lt;/em&gt;&lt;/span&gt;&lt;/a&gt; per formattare
l'output delle coordinate.&lt;/p&gt;
&lt;p&gt;Si passa ora alla &lt;span class="textit"&gt;pulizia&lt;/span&gt; del
vettoriale:&lt;/p&gt;
&lt;pre&gt;# # # v.clean: order of tools is significant:&lt;br /&gt;# # # try to change it (also you have to change order of&lt;br /&gt;# # # thresholds) and see how vector shape changes&lt;br /&gt;v.clean input=rndlines_bad out=rndlines_nocat type=line \&lt;br /&gt; tool=break,snap,rmline,rmsa,rmdupl \&lt;br /&gt; thresh=0,0.4,0,0,0 --overwrite&lt;br /&gt;v.build.polylines in=rndlines_nocat out=polylines --overwrite&lt;br /&gt;# # # add category to vector lines&lt;br /&gt;v.category in=polylines out=rndlines opt=add --overwrite&lt;br /&gt;# # # clean up vectors&lt;br /&gt;g.remove vect=rndpoints,rndlines_bad,rndlines_nocat,polylines&lt;br /&gt;rm $tmpascii&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a name="tex2html10"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.clean.html"
id="tex2html10"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
è tra i
comandi più difficili di &lt;span class="textsl"&gt;GRASS&lt;/span&gt;: provare ad
invertire l'ordine
dei tools per capire come agiscono...&lt;/p&gt;
&lt;p&gt;Il passaggio attraverso la creazione di &lt;span class="textit"&gt;polylines&lt;/span&gt;
(&lt;a name="tex2html11"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.build.polylines.html"
id="tex2html11"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.build.polylines&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;)
è necessario per rimuovere gli &lt;span class="textit"&gt;pseudonodi&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Si noti che il vettoriale di linee non ha categoria e pertanto
occorre aggiungerla con
&lt;a name="tex2html12"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.category.html"
id="tex2html12"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.category&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il reticolo di linee è pronto; si passa ai nodi, randomizzando
nuovamente:&lt;/p&gt;
&lt;pre&gt;g.region -d&lt;br /&gt;numpoint="5"&lt;br /&gt;v.random out=netpoints n=$numpoint --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Ottenuto il reticolato di linee (=archi) e i nodi, si crea il
network connettendoli.
Per prima cosa aggiungere una tabella a &lt;code&gt;netpoints&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;# # # add table to points&lt;br /&gt;v.db.addtable map=netpoints col="cat integer, dist double precision"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Il campo &lt;span class="textit"&gt;dist&lt;/span&gt; viene popolato con il
comando &lt;a name="tex2html13"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.distance.html"
id="tex2html13"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.distance&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
che
calcola, per ciscun elemento puntuale, la distanza alla più vicina
linea.&lt;/p&gt;
&lt;pre&gt;# # # upload distances from points to the nearest line&lt;br /&gt;v.distance from=netpoints to=rndlines upload=dist col=dist&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'opzione &lt;span class="textit"&gt;connect&lt;/span&gt; di &lt;a
name="tex2html14"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.html"
id="tex2html14"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
connette i
punti al reticolo di linee entro una certa soglia (threshold); per
determinare tale
soglia si sceglie il valore massimo che assume il campo &lt;span
class="textit"&gt;dist&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;# # # get the maximun distnce from points to lines&lt;br /&gt;max_dist=$(db.select -c sql="SELECT max(dist) FROM netpoints" )&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;...e lo si aumenta di una certa quantità per avere la sicurezza che
tutti i punti
vengano connessi: viene usato &lt;a name="tex2html15"
href="http://www.gnu.org/software/gawk/manual/gawk.html"
id="tex2html15"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;awk&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
per eseguire il semplice conto.&lt;/p&gt;
&lt;pre&gt;max_dist=$(echo "$max_dist" | awk '{print $1+0.01}')&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'ultimo passo è la creazione del network vero e proprio con la
connessione dei punti
algi archi:&lt;/p&gt;
&lt;pre&gt;# # # create network by connecting points and arcs at given threshold&lt;br /&gt;v.net in=rndlines points=netpoints \&lt;br /&gt; out=network op=connect \&lt;br /&gt; alayer=1 thresh=$max_dist --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'output di &lt;a name="tex2html16"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.html"
id="tex2html16"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
è un
vettoriale con due layer: sul layer 1 vi sono le linee (archi); sul
layer 2 vi sono i
punti (nodi).&lt;/p&gt;
&lt;p&gt;Lo script &lt;span class="textbf"&gt;&lt;em class="slanted"&gt;sl_draw.sh&lt;/em&gt;&lt;/span&gt;
può essere
scaricato da &lt;a name="tex2html17"
href="http://www.4shared.com/file/75453673/9a067d8c/sl_draw.html"
id="tex2html17"&gt;questo
indirizzo&lt;/a&gt;; deve essere ovviamente scomapttato, reso eseguibile (&lt;code&gt;chmod
ugoa+x
sl_draw.sh&lt;/code&gt;) e posto in una directory in modo che l'interprete
dei comandi possa
trovarlo (controllare con &lt;code&gt;echo $PATH&lt;/code&gt;).&lt;/p&gt;
&lt;pre&gt;./sl_draw.sh&lt;br /&gt;d.vect network layer=1 display=shape color=grey&lt;br /&gt;d.vect network layer=2 display=shape icon=basic/circle \&lt;br /&gt; size=8 color=red fcolor=blue&lt;br /&gt;d.vect network layer=2 display=cat llayer=2 \&lt;br /&gt; lsize=10 lcolor=blue&lt;br /&gt;&lt;/pre&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/9AVFRx9VKDMp2BiFDyjuAw?authkey=kIb4oLrptI4&amp;amp;feat=embedwebsite"
target="picasa albun"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SZCUPgP3t5I/AAAAAAAAALk/H3DY4JpBjMo/s144/network.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="c1"&gt;Il random-network creato&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;a name="SECTION00003000000000000000"
id="SECTION00003000000000000000"&gt;Network
Analysis&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La network analisys si basa sul concetto di &lt;span class="textit"&gt;costo&lt;/span&gt;
necessario per percorrere un determinato arco o per &lt;span
class="textit"&gt;attraversare&lt;/span&gt; un determinato nodo. In questa sede
si assumono i valori di
default:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;il costo di viaggio lungo ciascun arco è pari alla lunghezza
dell'arco medesimo;&lt;/li&gt;
&lt;li&gt;il costo di attraversamento di ciascun nodo è pari a 0&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a name="SECTION00003100000000000000"
id="SECTION00003100000000000000"&gt;Isodistanze
(isocosti)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Il comando &lt;a name="tex2html18"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.iso.html"
id="tex2html18"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net.iso&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
peremtte
di definire delle zone (&lt;span class="textit"&gt;costs&lt;/span&gt;) di uguale
costo di viaggio a
partire dai nodi inidcati (&lt;span class="textit"&gt;ccats&lt;/span&gt;):&lt;/p&gt;
&lt;pre&gt;v.net.iso in=network out=isonet alayer=1 nlayer=2 \&lt;br /&gt; ccats=1-100 costs=2,3,5 --overwrite&lt;br /&gt;v.db.addtable isonet&lt;br /&gt;./sl_draw.sh&lt;br /&gt;for catcolor in "1 red 2" "2 green 2" \&lt;br /&gt; "3 blue 2" "4 grey 1"; do&lt;br /&gt; # # # parsing parameters in group with set&lt;br /&gt; # # # $1=category $2=color $3=width&lt;br /&gt; # # # see http://tldp.org/LDP/abs/html/loops1.html&lt;br /&gt; set -- $catcolor&lt;br /&gt; d.vect isonet width=$3 display=shape \&lt;br /&gt; color=$2 where="cat=$1" &lt;br /&gt;done&lt;br /&gt;d.vect network layer=2 display=cat \&lt;br /&gt; icon=basic/circle size=6 llayer=2 \&lt;br /&gt; bgcolor=white bcolor=orange \&lt;br /&gt; fcolor=black lcolor=black xref=center yref=center&lt;br /&gt;&lt;/pre&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/R0XiB6oPdZe0RZ-qm9JsoA?authkey=kIb4oLrptI4&amp;amp;feat=embedwebsite"
target="``Picasa" album=""&gt;&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/SZCUPiw4OgI/AAAAAAAAALc/tPYpExqa4-g/s144/isodistance.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="c1"&gt;Il grafo dello isodistanze&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;a name="SECTION00003200000000000000"
id="SECTION00003200000000000000"&gt;Percorso
minimo&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Con &lt;a name="tex2html19"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.path.html"
id="tex2html19"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net.path&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
vengono
calcolati i percorsi minimi dal nodo di categoria 1 a tutti gli altri
nodi.&lt;/p&gt;
&lt;p&gt;Con &lt;a name="tex2html20"
href="http://grass.osgeo.org/grass64/manuals/html64_user/g.tempfile.html"
id="tex2html20"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;g.tempfile&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
viene
creato un file di testo temporaneo che memorizza, per ogni riga, i
seguenti elementi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;la categoria univoca del percorso che si va a cercare;&lt;/li&gt;
&lt;li&gt;la categoria del punto di partenza (nell'esempio si cercano le
distanze dal punto con
cat=1);&lt;/li&gt;
&lt;li&gt;la categoria del punto di arrivo (nell'esempio tutti gli altri
punti creati).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Il file temporaneo viene usato come imput per &lt;a name="tex2html21"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.path.html"
id="tex2html21"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net.path&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt; # # distance from point with cat=1 to all others points&lt;br /&gt;points_net=`g.tempfile pid=$$`&lt;br /&gt;# # cat_short_path from_node_cat to_node_cat&lt;br /&gt;echo "1 1 2" &amp;gt; $points_net&lt;br /&gt;echo "2 1 3" &amp;gt;&amp;gt; $points_net&lt;br /&gt;echo "3 1 4" &amp;gt;&amp;gt; $points_net&lt;br /&gt;echo "4 1 5" &amp;gt;&amp;gt; $points_net&lt;br /&gt;v.net.path input=network output=shortpath \&lt;br /&gt; file=$points_net --overwrite&lt;br /&gt;rm $points_net&lt;br /&gt;# # # display &lt;br /&gt;./sl_draw.sh&lt;br /&gt;d.erase&lt;br /&gt;# # # split monitor &lt;br /&gt;d.frame -c frame=1 at=51,99,1,49&lt;br /&gt;d.frame -c frame=2 at=51,99,51,99&lt;br /&gt;d.frame -c frame=3 at=1,49,1,49&lt;br /&gt;d.frame -c frame=4 at=1,49,51,99&lt;br /&gt;# # # loop; catpath is the shortest category path&lt;br /&gt;# # # and the frame name (1,2,3,4)&lt;br /&gt;for catpath in 1 2 3 4; do&lt;br /&gt; d.frame frame=$catpath -s&lt;br /&gt; d.vect network display=shape color=grey&lt;br /&gt; d.vect map=shortpath display=shape,cat \&lt;br /&gt; width=2 color=red cats=$catpath \&lt;br /&gt; bgcolor=white bcolor=blue \&lt;br /&gt; lcolor=blue&lt;br /&gt; d.vect network layer=2 display=shape,cat \&lt;br /&gt; icon=basic/circle size=6 llayer=2 \&lt;br /&gt; bgcolor=white bcolor=orange \&lt;br /&gt; fcolor=black lcolor=black xref=center yref=center&lt;br /&gt; string=$(v.db.select shortpath col=cost -c where="cat=$catpath")&lt;br /&gt; d.text at=2,94 text="cost=$string" color=blue&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Merita notare le istruzioni impartite per leggere, per ogni
percorso, la distanza tra
i due punti; &lt;a name="tex2html22"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.path.html"
id="tex2html22"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net.path&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
crea un
vettoriale con attributi:&lt;/p&gt;
&lt;pre&gt;v.db.select shortpath col=cost -c where="cat=$catpath"&lt;br /&gt;&lt;/pre&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/FneqYju3fqpKdjxPEqGdog?authkey=kIb4oLrptI4&amp;amp;feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/SZCUQNv2nvI/AAAAAAAAAL0/MsmhXrk9TfU/s144/shortpath.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="c1"&gt;I percorsi minimi dal nodo 1 a tutti gli altri
nodi.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;a name="SECTION00003300000000000000"
id="SECTION00003300000000000000"&gt;Il problema
del commesso viaggiatore e l'albero di Steiner&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Connettere una serie di punti attraverso un percorso più corto
possibile toccando
(&lt;span class="textit"&gt;attraversando&lt;/span&gt;) ciascun punto una sola
volta: questo è il
problema del &lt;span class="textit"&gt;commesso viaggiatore&lt;/span&gt; (&lt;a
name="tex2html23"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.salesman.html"
id="tex2html23"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net.salesman&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;L'albero di Steiner (&lt;a name="tex2html24"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.steiner.html"
id="tex2html24"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net.steiner&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;)
realizza la connessione tra i nodi dati con il percorso a minor costo
(più corto
possibile).&lt;/p&gt;
&lt;p&gt;Per ricordare: se voglio pianificare una gita o una vacanza scelgo
l'algoritmo del
&lt;span class="textit"&gt;travel salesman&lt;/span&gt;; se voglio posare un tubo
per portare acqua a
diversi irrigatori uso l'albero di Steiner.&lt;/p&gt;
&lt;p&gt;La sintassi dei due comandi è abbastanza simile:&lt;/p&gt;
&lt;pre&gt;v.net.salesman in=network \&lt;br /&gt; output=salesmanpath alayer=1 \&lt;br /&gt; nlayer=2 ccats=1,2,3,4,5 --overwrite&lt;br /&gt;# # #&lt;br /&gt;v.net.steiner input=network \&lt;br /&gt; output=steiner alayer=1 \&lt;br /&gt; nlayer=2 tcats=1-5 --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si passa alla visualizzazione dei risultati:&lt;/p&gt;
&lt;pre&gt;# # # dispay&lt;br /&gt;./sl_draw.sh; d.erase&lt;br /&gt;# # # split monitor&lt;br /&gt;d.frame -c frame=1 at=51,99,1,49&lt;br /&gt;d.frame -c frame=2 at=51,99,51,99&lt;br /&gt;d.frame -c frame=3 at=1,49,1,49&lt;br /&gt;d.frame -c frame=4 at=1,49,51,99&lt;br /&gt;# # # network in frame 1&lt;br /&gt;d.frame -s frame=1&lt;br /&gt;d.vect network display=shape color=grey&lt;br /&gt;d.vect network layer=2 display=shape \&lt;br /&gt; icon=basic/circle size=6 fcolor=red&lt;br /&gt;d.vect network layer=2 display=cat \&lt;br /&gt; llayer=2 lcolor=red lsize=10 \&lt;br /&gt; xref=left yref=bottom&lt;br /&gt;d.text at=2,2 text="Network" color=black &lt;br /&gt;# # # salesmanpath in frame 2&lt;br /&gt;d.frame -s frame=2&lt;br /&gt;d.vect salesmanpath display=shape \&lt;br /&gt; color=magenta width=2&lt;br /&gt;d.text at=2,2 text="Salesman path" color=black &lt;br /&gt;d.vect network layer=2 display=cat \&lt;br /&gt; bgcolor=white bcolor=orange llayer=2 \&lt;br /&gt; fcolor=black lcolor=black xref=center yref=center&lt;br /&gt;# # # steiner tree in frame 3&lt;br /&gt;d.frame -s frame=3&lt;br /&gt;d.vect steiner display=shape \&lt;br /&gt; color=violet width=2&lt;br /&gt;d.text at=2,2 text="Steiner tree" color=black &lt;br /&gt;d.vect network layer=2 display=cat \&lt;br /&gt; bgcolor=white bcolor=orange llayer=2 \&lt;br /&gt; fcolor=black lcolor=black xref=center yref=center&lt;br /&gt;# # # which is the shortest ?&lt;br /&gt;# # # steiner or salesman ?&lt;br /&gt;# # # text in frame 4&lt;br /&gt;d.frame -s frame=4&lt;br /&gt;top=90&lt;br /&gt;for vector in "salesmanpath" "steiner"; do&lt;br /&gt; # # # add table to vector&lt;br /&gt; v.db.addtable $vector col="length double precision"&lt;br /&gt; # # # upload vector length&lt;br /&gt; v.to.db $vector opt=length col=length&lt;br /&gt; # # # summarize length &lt;br /&gt; length=$(db.select -c sql="SELECT sum(length) FROM $vector")&lt;br /&gt; # # # print &lt;br /&gt; d.text.freetype -s text="$vector = $length" \&lt;br /&gt; size=10 at=2,$top color=black font=Vera&lt;br /&gt; # # # decrease text position in frame&lt;br /&gt; top=$(($top-8))&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/T6bvl3zCq8aTEm-dfxgd4w?authkey=kIb4oLrptI4&amp;amp;feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SZCUP0XmjMI/AAAAAAAAALs/ibNlMGlbgio/s144/salesman_steiner.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="c1"&gt;Il salesmann path e lo Steiner tree.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
L'uso dei &lt;span class="textit"&gt;frames&lt;/span&gt; rende possibile la
visualizzazione
delle differenze; la stessa area geografica viene ripetuta in tre
frames, ogni volta
rappresentando qualcosa di diverso ma mantenendo costanti alcuni
riferimenti (nel nostro
caso: i nodi del network): non si vuole far vedere dove esattamente
l'albero di Steiner e
il Salesman path &lt;span class="textit"&gt;passano&lt;/span&gt; sul network; si
vuole semplicemente
rtrasmettere il messaggio che i due vettoriali realizzano connessioni
con proprietà
diverse.
&lt;h3&gt;&lt;a name="SECTION00003400000000000000"
id="SECTION00003400000000000000"&gt;Allocazione
delle risorse&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a name="tex2html25"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.net.alloc.html"
id="tex2html25"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.net.alloc&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
crea
una ripartizione del network tra i diversi nodi forniti in input:&lt;/p&gt;
&lt;pre&gt;v.net.alloc input=network output=alloc \&lt;br /&gt; alayer=1 nlayer=2 ccats=1,2,3,4,5 --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Il vettoriale di output non ha tabella attributi;se ne aggiunge una
calcolando la
lunghezza complessiva dei diversi &lt;span class="textit"&gt;subnets&lt;/span&gt;
(uno per ciascuna
riga della tabella) e quella totale di tutto il network:&lt;/p&gt;
&lt;pre&gt;# # # add table &lt;br /&gt;v.db.addtable alloc layer=1 col="length double precision"&lt;br /&gt;# # # upload lenght&lt;br /&gt;v.to.db alloc layer=1 col=length opt=length&lt;br /&gt;# # # summarize total netwrok lenght&lt;br /&gt;tot_length=$(db.select -c \&lt;br /&gt; sql="SELECT sum(length) FROM alloc")&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si procede ora alla visualizzazione:&lt;/p&gt;
&lt;pre&gt;# # # colorize&lt;br /&gt;v.colors alloc range=1,5 color=bcyr column=cat&lt;br /&gt;&lt;br /&gt;./sl_draw.sh; d.erase;&lt;br /&gt;# # # split monitor into 4 frames&lt;br /&gt;d.frame -c at=1,99,1,65 frame=1&lt;br /&gt;d.frame -c at=67,99,66,99 frame=2&lt;br /&gt;d.frame -c at=34,66,66,99 frame=3&lt;br /&gt;d.frame -c at=1,33,66,99 frame=4&lt;br /&gt;&lt;br /&gt;# # # overview in frame 1&lt;br /&gt;d.frame -s frame=1&lt;br /&gt;d.vect -a alloc&lt;br /&gt;d.vect network layer=2 display=cat \&lt;br /&gt; bgcolor=white bcolor=orange llayer=2 \&lt;br /&gt; fcolor=black lcolor=black xref=center yref=center&lt;br /&gt; d.text.freetype -s at=2,2 text="Total lenght: ${tot_length}" \&lt;br /&gt; size=8 color=black&lt;br /&gt;# # # first number = frame&lt;br /&gt;# # # second number = subnet&lt;br /&gt;for subnet in "2 2" "3 3" "4 5"; do&lt;br /&gt; set -- $subnet&lt;br /&gt; d.frame -s frame=$1&lt;br /&gt; d.vect alloc color=grey&lt;br /&gt; d.vect -a alloc where="cat=$2" width=2&lt;br /&gt; subnet_length=$(db.select -c \&lt;br /&gt; sql="SELECT sum(length) FROM alloc WHERE cat=$2")&lt;br /&gt; d.text.freetype -s at=2,2 text="subnet n. ${2}: ${subnet_length}" \&lt;br /&gt; size=8 color=black &lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/IoZSm0ZkfC2p3MOEIg6HFg?authkey=kIb4oLrptI4&amp;amp;feat=embedwebsite"
target="Picasa album"&gt;&lt;img
src="http://lh4.ggpht.com/_87lofqKSw4A/SZCUPTtaK5I/AAAAAAAAALU/pFJFJv3q35k/s144/allocation.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="c1"&gt;Il grafo dell'allocazione delle risorse.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;a name="SECTION00004000000000000000"
id="SECTION00004000000000000000"&gt;Conclusioni&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Non si è affrontato la Network Analisys in modo approfondito: giusto
una presentazione
dei principali tools che &lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; mette
a disposzione,
senza considerare i versi di percorrenza degli archi ed i relativi
costi.&lt;/p&gt;
&lt;p&gt;Il codice di questa esercitazione si presta a molteplici varianti:
creazione di
vettoriali &lt;span class="textit"&gt;random&lt;/span&gt;, effetto dei tools di &lt;a
name="tex2html26"
href="http://grass.osgeo.org/grass64/manuals/html64_user/v.clean.html"
id="tex2html26"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
nel
conferire un particolare aspetto finale al vettoriale, allestimento dei
layouts con i
soli comandi &lt;a name="tex2html27"
href="http://grass.osgeo.org/grass64/manuals/html64_user/d.mon.html"
id="tex2html27"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;d.mon&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
e &lt;a name="tex2html28"
href="http://grass.osgeo.org/grass64/manuals/html64_user/d.vect.html"
id="tex2html28"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;d.vect&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-3063222445447518542?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/3063222445447518542/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/02/random-network-analisys-in-grass.html#comment-form" title="1 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/3063222445447518542?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/3063222445447518542?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/02/random-network-analisys-in-grass.html" title="Random Network Analisys in GRASS" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_87lofqKSw4A/SZCUPgP3t5I/AAAAAAAAALk/H3DY4JpBjMo/s72-c/network.png" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;D0YHQ3o9eip7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-7218985668654257210</id><published>2009-02-03T22:01:00.004+01:00</published><updated>2009-12-21T23:38:52.462+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:38:52.462+01:00</app:edited><title>Gdal e Grass from source in Ubuntu Intrepid Ibex - 2</title><content type="html">Faccio un seguito a questo &lt;a name="tex2html1"
href="http://appuntigis.blogspot.com/2008/12/resoconto-di-una-compilazione-portata.html"
id="tex2html1"&gt;precedente blog&lt;/a&gt;: installare &lt;span class="textsl"&gt;GDAL&lt;/span&gt;&amp;nbsp;
e
&lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; da sorgente è un tormentone,
almeno per me.
&lt;p&gt;Ecco gli &lt;span class="textit"&gt;appunti&lt;/span&gt; che uso, sotto forma
di script; spero
possano essere utili a qualcuno.&lt;/p&gt;
&lt;p&gt;Non lanciare alla cieca lo script: quasi sicuramente non funzionarà;
leggerlo per
capire le diverse operazioni ed eventualmente modificarlo. Gran parte
del contenuto è
tratto dai link riportati.&lt;/p&gt;
&lt;pre&gt;#! /usr/bin/env bash&lt;br /&gt;# # # january 2009&lt;br /&gt;# # # this isn't a script! It's a reminder only&lt;br /&gt;# # # SO THINK TWICE BEFORE RUNNING (AT YOUR OWN RISK)&lt;br /&gt;&lt;br /&gt;# # # you should read these links before try:&lt;br /&gt;# # # http://grass.osgeo.org/wiki/Compile_and_Install&lt;br /&gt;# # # http://grass.osgeo.org/grass64/source/REQUIREMENTS.html&lt;br /&gt;# # # http://casoilresource.lawr.ucdavis.edu/drupal/node/123&lt;br /&gt;# # # http://mpa.itc.it/markus/useful/conf_install_gdal_ogr_grass_plugin.sh&lt;br /&gt;# # # http://trac.osgeo.org/gdal/wiki/GRASS&lt;br /&gt;# # # http://trac.osgeo.org/gdal/wiki/BuildingOnUnix&lt;br /&gt;&lt;br /&gt;PROGRAM=`basename $0`&lt;br /&gt;CURRENTDIR="`pwd`"&lt;br /&gt;&lt;br /&gt;# # # change &lt;br /&gt;&lt;br /&gt;# # # gdal source directory&lt;br /&gt;DIR_SRC_GDAL="/usr/local/src/gdal"&lt;br /&gt;# # # gdal install directory&lt;br /&gt;DIR_INST_GDAL="/usr/local"&lt;br /&gt;# # # grass source directory&lt;br /&gt;DIR_SRC_GRASS="/usr/local/src/grass6_devel"&lt;br /&gt;# # # grass install directory&lt;br /&gt;DIR_INST_GRASS="/usr/local/grass-6.5.svn"&lt;br /&gt;# # # plugin grass-gdal source directory&lt;br /&gt;DIR_SRC_PLUGIN="/usr/local/src/gdal-grass-1.4.3"&lt;br /&gt;# # # plugin grass-gdal install directory&lt;br /&gt;DIR_INST_PLUGIN="/usr/local/lib/gdalplugins"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;ask_yes_no()&lt;br /&gt;{&lt;br /&gt; local yn=&lt;br /&gt; while [ "$yn" = "" ]; do&lt;br /&gt; echo "$1"&lt;br /&gt; read yn&lt;br /&gt; case $yn in&lt;br /&gt; y|Y) yn=0 ;;&lt;br /&gt; n|N) yn=1 ;;&lt;br /&gt; e|E)&lt;br /&gt;# cd ${CURRENTDIR}&lt;br /&gt; exit 1 ;;&lt;br /&gt; *) yn=&lt;br /&gt; echo "Invalid response - please answer y or n"&lt;br /&gt; ;;&lt;br /&gt; esac&lt;br /&gt; done&lt;br /&gt; return $yn&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if ask_yes_no "Update/upgrade system [Y/N/(E)xit] ?"; then&lt;br /&gt; sudo apt-get update&lt;br /&gt; sudo apt-get upgrade&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;# # #&lt;br /&gt;# # # GDAL - Geospatial Data Abstraction Library&lt;br /&gt;# # #&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;&lt;br /&gt;# # # cleaning&lt;br /&gt;if ask_yes_no "Clean GDAL source [Y/N/(E)xit] ?"; then&lt;br /&gt; cd ${DIR_SRC_GDAL}&lt;br /&gt; make distclean&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # upgrade from svn&lt;br /&gt;if ask_yes_no "Upgrade GDAL source from svn [Y/N/(E)xit] ?"; then&lt;br /&gt;# # #&lt;br /&gt;# # # FIRST INSTALL:&lt;br /&gt;# # # sudo mkdir /usr/local/src&lt;br /&gt;# # # sudo chown my_user_name:my_user_group /usr/local/src/&lt;br /&gt;# # # cd /usr/local/src&lt;br /&gt;# # # current development version:&lt;br /&gt;# # # svn checkout https://svn.osgeo.org/gdal/trunk/gdal gdal &lt;br /&gt;# # # current stable version:&lt;br /&gt;# # # svn checkout https://svn.osgeo.org/gdal/branches/1.5/gdal gdal&lt;br /&gt;# # #&lt;br /&gt;# # # AFTER FIRST INSTALL:&lt;br /&gt; cd ${DIR_SRC_GDAL}&lt;br /&gt; svn up&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # configure ***WITHOUT GRASS***&lt;br /&gt;if ask_yes_no "Configure GDAL [Y/N/(E)xit] ?"; then&lt;br /&gt; cd ${DIR_SRC_GDAL}&lt;br /&gt; ./configure \&lt;br /&gt; --with-pg=/usr/bin/pg_config \&lt;br /&gt; --prefix=${DIR_INST_GDAL} \&lt;br /&gt; --with-python \&lt;br /&gt; --with-ogdi \&lt;br /&gt; --with-sqlite \&lt;br /&gt; --with-mysql=/usr/bin/mysql_config \&lt;br /&gt; --with-libtiff=internal \&lt;br /&gt; --without-grass \&lt;br /&gt; -with-hide-internal-symbols&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # make&lt;br /&gt;if ask_yes_no "Make GDAL [Y/N/(E)xit] ?"; then&lt;br /&gt; cd ${DIR_SRC_GDAL}&lt;br /&gt; make&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # make install&lt;br /&gt;if ask_yes_no "Install GDAL [Y/N/(E)xit] ?"; then&lt;br /&gt; cd ${DIR_SRC_GDAL}&lt;br /&gt; sudo make install&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # Is directory, where binary have been installed, in PATH variable?&lt;br /&gt;if ask_yes_no "Check if PATH variable contains path to GDAL binaries [Y/N/(E)xit] ?"; then&lt;br /&gt; echo "GDAL binary are here ...${DIR_INST_GDAL}/bin"&lt;br /&gt; echo ""&lt;br /&gt; cd "${DIR_INST_GDAL}/bin"&lt;br /&gt; ls -l&lt;br /&gt; echo "PATH variable:"&lt;br /&gt; echo "$PATH"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if ask_yes_no "You can change PATH variable now...[Y/N/(E)xit] ?"; then&lt;br /&gt; echo "There many ways to do this; perhaps you can modify .bashrc..."&lt;br /&gt; gedit $HOME/.bashrc&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;# # #&lt;br /&gt;# # # GRASS GIS (Geographic Resources Analysis Support System) &lt;br /&gt;# # #&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;&lt;br /&gt;# # # cleaning&lt;br /&gt;if ask_yes_no "Clean GRASS source[Y/N/(E)xit] ?"; then&lt;br /&gt; cd ${DIR_SRC_GRASS}&lt;br /&gt; make distclean&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # upgrade from svn&lt;br /&gt;if ask_yes_no "Upgrade GRASS from svn [Y/N/(E)xit] ?"; then&lt;br /&gt;# # #&lt;br /&gt;# # # FIRST INSTALL: (6.5.0 development branch)&lt;br /&gt;# # # Note: development here is discouraged and&lt;br /&gt;# # # should take place in GRASS 7.&lt;br /&gt;# # # &lt;br /&gt;# # # svn checkout https://svn.osgeo.org/grass/grass/branches/develbranch_6 grass6_devel&lt;br /&gt;# # # To switch from SVN 'trunk' (now GRASS 7 development)&lt;br /&gt;# # # to 'develbranch_6' (now GRASS 6.4 development) use&lt;br /&gt;# # # cd /path/to/your/local/copy/trunk&lt;br /&gt;# # # svn switch https://svn.osgeo.org/grass/grass/branches/develbranch_6 .&lt;br /&gt;# # #&lt;br /&gt;# # # AFTER FIRST INSTALL:&lt;br /&gt; cd ${DIR_SRC_GRASS}&lt;br /&gt; svn up&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # configure GRASS&lt;br /&gt;if ask_yes_no "Configure GRASS [Y/N/(E)xit] ?"; then&lt;br /&gt; cd ${DIR_SRC_GRASS}&lt;br /&gt;# # # --with-gdal="${DIR_INST_GDAL}/bin/gdal-config" \&lt;br /&gt; # # # CFLAGS="-O2 -march=pentium-m -Wall" LDFLAGS="-s"&lt;br /&gt; # # # CFLAGS="-ggdb -Wall -Werror-implicit-function-declaration"&lt;br /&gt; CFLAGS="-g -Wall" LDFLAGS="-s" ./configure \&lt;br /&gt; --with-gdal="${DIR_INST_GDAL}/bin/gdal-config" \&lt;br /&gt; --with-tcltk-includes=/usr/include/tcl8.5 \&lt;br /&gt; --with-postgres=yes \&lt;br /&gt; --with-postgres-includes=/usr/include/postgresql \&lt;br /&gt; --with-sqlite \&lt;br /&gt; --with-cxx \&lt;br /&gt; --with-blas \&lt;br /&gt; --with-lapack \&lt;br /&gt; --with-cairo \&lt;br /&gt; --with-fftw \&lt;br /&gt; --with-freetype=yes \&lt;br /&gt; --with-freetype-includes=/usr/include/freetype2 \&lt;br /&gt; --with-readline \&lt;br /&gt; --with-opengl-includes=/usr/include/GL \&lt;br /&gt; --with-mysql \&lt;br /&gt; --with-mysql-includes=/usr/include/mysql \&lt;br /&gt; --with-python=/usr/bin/python2.5-config \&lt;br /&gt; --with-wxwidgets=/usr/bin/wx-config \&lt;br /&gt; --enable-largefile=yes \&lt;br /&gt; --with-proj-includes=/usr/include \&lt;br /&gt; --with-proj-share=/usr/share/proj \&lt;br /&gt; --with-proj-libs=/usr/lib&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # make&lt;br /&gt;if ask_yes_no "Make GRASS [Y/N/(E)xit] ?"; then&lt;br /&gt; cd ${DIR_SRC_GRASS}&lt;br /&gt; make&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # make vdigit nviz&lt;br /&gt;if ask_yes_no "Make vdigit and nviz [Y/N/(E)xit] ?"; then&lt;br /&gt;# # # symbolic link (overwrite if exists)&lt;br /&gt; sudo ln -s -f /usr/lib/python2.5/site-packages/wx-2.8-gtk2-unicode/wx/_gdi_.so \&lt;br /&gt; /usr/local/lib/libgdi.so &lt;br /&gt; cd "${DIR_SRC_GRASS}/gui/wxpython/vdigit"&lt;br /&gt; make&lt;br /&gt; cd "${DIR_SRC_GRASS}/gui/wxpython/nviz"&lt;br /&gt; make&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # make install&lt;br /&gt;if ask_yes_no "Install GRASS [Y/N/(E)xit] ?"; then&lt;br /&gt; cd ${DIR_SRC_GRASS}&lt;br /&gt; sudo make install&lt;br /&gt; cd ${CURRENTDIR}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # check/set/modify shared library&lt;br /&gt;if ask_yes_no "Check ld.so.conf [Y/N/(E)xit] ?"; then&lt;br /&gt; echo ""&lt;br /&gt; echo "REMEMBER: ${DIR_INST_GRASS}/lib must be shared!"&lt;br /&gt; echo ""&lt;br /&gt; cat /etc/ld.so.conf&lt;br /&gt;fi&lt;br /&gt;# # # /etc/ld.so.conf&lt;br /&gt;if ask_yes_no "Modify ld.so.conf [Y/N/(E)xit] ?"; then&lt;br /&gt; sudo gedit /etc/ld.so.conf&lt;br /&gt; sudo ldconfig&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;# # #&lt;br /&gt;# # # PLUGIN GDAL - GRASS&lt;br /&gt;# # # http://download.osgeo.org/gdal/gdal-grass-1.4.3.tar.gz&lt;br /&gt;# # # &lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;&lt;br /&gt;if ask_yes_no "Compile gdal-grass plugin [Y/N/(E)xit] ?"; then&lt;br /&gt;# # # FIRST INSTALL&lt;br /&gt;# # # cd /usr/local/src&lt;br /&gt;# # # tar xfvz gdal-grass-1.4.3.tar.gz&lt;br /&gt;# # # AFTER FIRST INSTALL:&lt;br /&gt; cd ${DIR_INST_GDAL}/lib&lt;br /&gt; # # # link GRASS libs to the lib/ folder&lt;br /&gt; sudo ln -sf ${DIR_INST_GRASS}/lib/*.so .&lt;br /&gt; cd ${DIR_SRC_PLUGIN}&lt;br /&gt; make distclean&lt;br /&gt;&lt;br /&gt; ./configure --with-grass=${DIR_INST_GRASS} \&lt;br /&gt; --with-gdal=${DIR_INST_GDAL}/bin/gdal-config \&lt;br /&gt; --with-autoload=${DIR_INST_PLUGIN} \&lt;br /&gt; --with-ld-shared="g++ -shared"&lt;br /&gt; &lt;br /&gt; make&lt;br /&gt;# # # sudo mkdir /usr/local/lib/gdalplugins # # # first install&lt;br /&gt; sudo cp *.so ${DIR_INST_PLUGIN}&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-7218985668654257210?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/7218985668654257210/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/02/gdal-e-grass-from-source-in-ubuntu.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7218985668654257210?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/7218985668654257210?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/02/gdal-e-grass-from-source-in-ubuntu.html" title="Gdal e Grass from source in Ubuntu Intrepid Ibex - 2" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0EBQX8_fip7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-4045210234043067369</id><published>2009-01-06T23:26:00.006+01:00</published><updated>2009-12-21T23:47:30.146+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:47:30.146+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GRASS" /><category scheme="http://www.blogger.com/atom/ns#" term="v.to.db" /><category scheme="http://www.blogger.com/atom/ns#" term="v.to.points" /><title>Full planar topology in  GRASS (Seconda parte)</title><content type="html">&lt;h2&gt;&lt;a name="SECTION00001000000000000000"
id="SECTION00001000000000000000"&gt;Node
Topology&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Occorre ottenere un vettoriale di nodi; per fare ciò si può usare il
tool &lt;a name="tex2html1"
href="http://grass.itc.it/grass64/manuals/html64_user/v.to.points.html"
id="tex2html1"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.points&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;v.to.points -n input=arcs out=multiNode \&lt;br /&gt; llayer=2 type=boundary --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;I nodi vengono estratti dal layer 2 di &lt;code&gt;arcs&lt;/code&gt;; volendo
mantenere una
relazione tra arco e nodo si usa l'opzione &lt;span class="textit"&gt;llayer&lt;/span&gt;
che indica
quale layer utilizzare (il &lt;span class="MATH"&gt;&lt;img
src="masterBlog-img1.png" alt="$2$" align="bottom" border="0"
height="13" width="12" /&gt;&lt;/span&gt;) per memorizzare la categoria
dell'arco (=boundary) negli attributi dei nodi. &lt;a name="tex2html2"
href="http://grass.itc.it/grass64/manuals/html64_user/v.to.points.html"
id="tex2html2"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.points&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
genera
due layer: il primo con gli archi originali, il secondo con i nodi:&lt;/p&gt;
&lt;pre&gt; v.db.select multiNode layer=2&lt;br /&gt;cat|lcat|along&lt;br /&gt;1|1|0&lt;br /&gt;2|1|6.24264068711928&lt;br /&gt;3|2|0&lt;br /&gt;4|2|3&lt;br /&gt;5|3|0&lt;br /&gt;6|3|6.70820393249937&lt;br /&gt;[...]&lt;br /&gt;23|12|0&lt;br /&gt;24|12|2.41421356237309&lt;br /&gt;25|13|0&lt;br /&gt;26|13|7.07106781186548&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Il campo &lt;span class="textit"&gt;lcat&lt;/span&gt; memorizza la categoria
dell'arco (layer 2 di
&lt;code&gt;arc&lt;/code&gt;) sul quale veine creato il nodo.&lt;/p&gt;
&lt;p&gt;Sul layer 2 di &lt;code&gt;multiNode&lt;/code&gt; si sono ottenuti i punti
(=nodi) iniziali e
finali di ciascun arco: va da sé che i nodi (finale di un arco ed
iniziale dell'arco
successivo) sono sovrapposti uno sull'altro.&lt;/p&gt;
&lt;p&gt;Questo esercizio è una &lt;span class="textit"&gt;simulazione&lt;/span&gt;
della Full Planar
Topology: la tabella Node Topology necessita che i nodi siano unici ed
univocamente
individuati. Si procede allora a una &lt;span class="textit"&gt;pulizia&lt;/span&gt;
dei nodi
sovrapposti con &lt;a name="tex2html3"
href="http://grass.itc.it/grass64/manuals/html64_user/v.clean.html"
id="tex2html3"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean
tool=rmdupl&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;v.clean in=multiNode out=nodeSimple \&lt;br /&gt; type=point tool=rmdupl --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Al vettoriale risultato si attribuisce un valore di categoria
univoco:&lt;/p&gt;
&lt;pre&gt;v.category nodeSimple out=node \&lt;br /&gt;layer=3 opt=add --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a name="tex2html4"
href="http://grass.itc.it/grass64/manuals/html64_user/v.clean.html"
id="tex2html4"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean
tool=rmdupl&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
ha rimosso i nodi sovrapposti da &lt;code&gt;multiNode&lt;/code&gt;; il meccanismo
di memorizzazione
dei vettori implementato in &lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp;
rende però possibile
il recupero dei valori di categoria per ciascun layer grazie al
mantenimento di una
relazione &lt;span class="textit"&gt;uno a molti&lt;/span&gt;: interrogando dal
layer 3 (parte
&lt;span class="textit"&gt;uno&lt;/span&gt;) di &lt;code&gt;nodeSimpel&lt;/code&gt; il layer 2
(parte
&lt;span class="textit"&gt;molti&lt;/span&gt;), è possibile conoscere quanti e
quali valori di
categoria sono presenti in quest'ultimo layer. Non solo: con lo stesso
meccanismo si
possono popolare i campi del layer 3 con altri attributi del layer 2.&lt;/p&gt;
&lt;p&gt;Per prima cosa occorre aggiungere alcuni campi al layer 3:&lt;/p&gt;
&lt;pre&gt;v.db.addtable node layer=3 \&lt;br /&gt; columns="cat integer, countnodes integer, \&lt;br /&gt; countarcs integer, nodeslist char(12), \&lt;br /&gt; arcslist char(12), arcslistnames char(20)"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Il tool che consente di realizzare quanto sopra descritto è &lt;a
name="tex2html5"
href="http://grass.itc.it/grass64/manuals/html64_user/v.to.db.html"
id="tex2html5"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.db
opt=query&lt;/em&gt;&lt;/span&gt;&lt;/a&gt; :
per ogni geometria esegue la funzione contenuta in &lt;span class="textit"&gt;qcolumn&lt;/span&gt;
interrogando il layer &lt;span class="textit"&gt;qlayer&lt;/span&gt; e popolando
il campo definito in
&lt;span class="textit"&gt;column&lt;/span&gt;. I commenti lasciati fra le righe di
comando servono
da spiegazione:&lt;/p&gt;
&lt;pre&gt;# # # numero di nodi sovrapposti nel layer 2&lt;br /&gt;v.to.db node option=query layer=3 \&lt;br /&gt; qlayer=2 column=countnodes qcolumn="count(cat)"&lt;br /&gt;# # # numero di archi collegati ai nodi &lt;br /&gt;v.to.db node option=query layer=3 \&lt;br /&gt; qlayer=2 column=countarcs qcolumn="count(lcat)"&lt;br /&gt;# # # elenco delle categorie dei nodi sovrapposti sul layer 2&lt;br /&gt;v.to.db node option=query layer=3 \&lt;br /&gt; qlayer=2 column=nodeslist qcolumn="group_concat(cat)"&lt;br /&gt;# # # elenco delle categorie delgi archi collegati&lt;br /&gt;v.to.db node option=query layer=3 \&lt;br /&gt; qlayer=2 column=arcslist qcolumn="group_concat(lcat)"&lt;br /&gt;# # # elenco dei nomi degli archi collegati &lt;br /&gt;v.to.db node option=query layer=3 \&lt;br /&gt; qlayer=2 column=arcslistnames qcolumn="group_concat(arcLabel)"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Il risultato è il seguente:&lt;/p&gt;
&lt;pre&gt;v.db.select node layer=3&lt;br /&gt;cat|countnodes|countarcs|nodeslist|arcslist|arcslistnames&lt;br /&gt;1|2|2|1,2|1,1|a1,a1&lt;br /&gt;2|3|3|6,9,17|3,5,9|a3,a5,a9&lt;br /&gt;3|3|3|15,18,19|8,9,10|a8,a9,a10&lt;br /&gt;4|3|3|4,5,20|2,3,10|a2,a3,a10&lt;br /&gt;5|4|4|7,10,11,22|4,5,6,11|a4,a5,a6,a11&lt;br /&gt;6|4|4|8,12,14,23|4,6,7,12|a4,a6,a7,a12&lt;br /&gt;7|3|3|21,24,25|11,12,13|a11,a12,a13&lt;br /&gt;8|4|4|3,13,16,26|2,7,8,13|a2,a7,a8,a13&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si può verificare la situazione delle categorie nei diversi layers:&lt;/p&gt;
&lt;pre&gt;v.category node opt=report&lt;br /&gt;Layer/table: 1/node_1&lt;br /&gt;type count min max&lt;br /&gt;point 25 1 13&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 0 0 0&lt;br /&gt;centroid 0 0 0&lt;br /&gt;area 0 0 0&lt;br /&gt;all 25 1 13&lt;br /&gt;Layer/table: 2/node_2&lt;br /&gt;type count min max&lt;br /&gt;point 26 1 26&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 0 0 0&lt;br /&gt;centroid 0 0 0&lt;br /&gt;area 0 0 0&lt;br /&gt;all 26 1 26&lt;br /&gt;Layer/table: 3/node_3&lt;br /&gt;type count min max&lt;br /&gt;point 8 1 8&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 0 0 0&lt;br /&gt;centroid 0 0 0&lt;br /&gt;area 0 0 0&lt;br /&gt;all 8 1 8&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;La tabella Node Topology è semplicemente:&lt;/p&gt;
&lt;pre&gt; v.db.select node layer=3 col=cat,arcslistnames&lt;br /&gt;cat|arcslistnames&lt;br /&gt;1|a1,a1&lt;br /&gt;2|a3,a5,a9&lt;br /&gt;3|a8,a9,a10&lt;br /&gt;4|a2,a3,a10&lt;br /&gt;5|a4,a5,a6,a11&lt;br /&gt;6|a4,a6,a7,a12&lt;br /&gt;7|a11,a12,a13&lt;br /&gt;8|a2,a7,a8,a13&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'arco &lt;span class="textit"&gt;a1&lt;/span&gt; si chiude su se stesso nel
nodo di categoria 1.
La tabella prodotta presenta in corrispondenza del nodo 1 la
ripetizione del nome
dell'arco: ciò costituisce una differenza fra quanto, sulla base del
modello Full Planar
Topology, dovrebbe essere.&lt;/p&gt;
&lt;p&gt;Si crea ora una visualizzazione del vettoriale &lt;code&gt;node&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;./sl_draw.sh&lt;br /&gt;d.font.freetype font=timesbd&lt;br /&gt;d.vect arcs layer=2 display=shape,attr attrcol=arcLabel \&lt;br /&gt; type=boundary llayer=2 \&lt;br /&gt; xref=center yref=center color=grey \&lt;br /&gt; lsize=10 bgcolor=white bcolor=black&lt;br /&gt;d.vect node layer=3 display=shape,cat llayer=3 \&lt;br /&gt; size=5 icon=basic/triangle lcolor=aqua \&lt;br /&gt; xref=center yref=center \&lt;br /&gt; lsize=10 bgcolor=white bcolor=aqua&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Lo script &lt;span class="textbf"&gt;&lt;em class="slanted"&gt;sl_draw.sh&lt;/em&gt;&lt;/span&gt;
può essere
scaricato da &lt;a name="tex2html6"
href="http://www.4shared.com/file/75453673/9a067d8c/sl_draw.html"
id="tex2html6"&gt;questo
indirizzo&lt;/a&gt;; deve essere ovviamente scomapttato, reso eseguibile (&lt;code&gt;chmod
ugoa+x
sl_draw.sh&lt;/code&gt;) e posto in una directory in modo che l'interprete
dei comandi possa
trovarlo (controllare con &lt;code&gt;echo $PATH&lt;/code&gt;).&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/0ntTnwYl2k3Lb9wknAo9PA?authkey=WXnV94KCFd0&amp;amp;feat=embedwebsite"
target="picasa albun"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SWPR8-7z9NI/AAAAAAAAAKI/jmg_nDekAts/s144/nodeTopology.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="c1"&gt;Relazioni tra i vettoriali node e arcs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;a name="SECTION00002000000000000000"
id="SECTION00002000000000000000"&gt;Polygon
Topology&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La terza ed ultima tabella &lt;span class="textit"&gt;Polygon Topology&lt;/span&gt;
viene ottenuta
combinando gli attributi sui due layers del vettoriale &lt;code&gt;arcs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nel campo &lt;span class="textit"&gt;arcList&lt;/span&gt; sarà memorizzato
l'elenco degli archi
che delimitano ciascuna area:&lt;/p&gt;
&lt;pre&gt; v.db.addcol arcs col="arcList char(15)"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si provi dapprima questa istruzione SQL:&lt;/p&gt;
&lt;pre&gt;echo "select a.cat as cat,a.label as label, \&lt;br /&gt; group_concat(b.arcLabel) as arcList \&lt;br /&gt; from arcs a, arcs_2 b \&lt;br /&gt; WHERE (a.cat==b.catPolyLeft) OR \&lt;br /&gt; (a.cat==b.catPolyRight) \&lt;br /&gt; GROUP BY a.cat" | db.select&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Ancora una volta si fa uso della funzione di aggregazione comando di
aggregazione
&lt;code&gt;group_concat&lt;/code&gt; supportato nelle recenti versioni di &lt;a
name="tex2html7" href="http://www.sqlite.org/lang_aggfunc.html"
id="tex2html7"&gt;&lt;span class="textsl"&gt;SQLite&lt;/span&gt;&lt;/a&gt;; inoltre le
diverse tabelle sono indicate da semplici
lettere.&lt;/p&gt;
&lt;p&gt;Si crea una tabella temporanea per memorizzare il risultato
dell'istruzione
&lt;span class="textit"&gt;SELECT&lt;/span&gt; e subito dopo la si interroga per
aggiornare il valore
del campo &lt;span class="textit"&gt;arcList&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;echo "CREATE TEMPORARY TABLE foo AS \&lt;br /&gt; select arcs.cat as cat, group_concat(arcs_2.arcLabel) as List \&lt;br /&gt; from arcs, arcs_2 \&lt;br /&gt; WHERE (arcs.cat==arcs_2.catPolyLeft) OR \&lt;br /&gt; (arcs.cat==arcs_2.catPolyRight) \&lt;br /&gt; GROUP BY arcs.cat;&lt;br /&gt; UPDATE arcs SET arcList=(select List FROM \&lt;br /&gt; foo WHERE arcs.cat=foo.cat)" | db.execute&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Notare che:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;si è usata la notazione consueta: &lt;span class="textit"&gt;nomeTabella&lt;/span&gt;.&lt;span
class="textit"&gt;nomeCampo&lt;/span&gt; anzichè le lettere per
indicare le tabelle;&lt;/li&gt;
&lt;li&gt;si sono concatenate le due istruzioni SQL con il &lt;code&gt;';'&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;viene creata una tabella temporanea; la sintassi completa del
comando &lt;span class="textit"&gt;CREATE TABLE&lt;/span&gt; è riportato &lt;a
name="tex2html8"
href="http://www.3rd-impact.net/Document/SQLite/Translation/Current/Original/lang_createtable.html"
id="tex2html8"&gt;manuale&lt;/a&gt; di SQLite;&lt;/li&gt;
&lt;li&gt;la tabella temporanea verrà distrutta appena la connessione al
database cesserà.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a name="SECTION00003000000000000000"
id="SECTION00003000000000000000"&gt;Conclusioni&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Arrivati al fondo di questa tortuosa esercitazione merita
puntualizzare alcune
cose:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;l'esercitazione condotta è stata una simulazione: &lt;span
class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; implementa il modello topologico in
modo ben più
efficiente!&lt;/li&gt;
&lt;li&gt;la procedura si presta a numerose varianti: si provi ad esempio
ad usare l'opzione
&lt;code&gt;-v&lt;/code&gt; (anziché &lt;code&gt;-n&lt;/code&gt;) del tool &lt;a
name="tex2html9"
href="http://grass.itc.it/grass64/manuals/html64_user/v.to.points.html"
id="tex2html9"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.points&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;;
la via
seguita è quella che si è ritenuto più &lt;span class="textit"&gt;didattica&lt;/span&gt;...&lt;/li&gt;
&lt;li&gt;mentre le tabelle &lt;span class="textit"&gt;Node Topology&lt;/span&gt; e &lt;span
class="textit"&gt;Arc Topology&lt;/span&gt; sono state ottenute interrogando le
geometrie, la terza
tabella, &lt;span class="textit"&gt;Polygon Topology&lt;/span&gt; è stata ottenuta
ricombinando altre
tabelle; si provi ad ottenere &lt;span class="textit"&gt;Polygon Topology&lt;/span&gt;
direttamente
dalle geometrie...&lt;/li&gt;
&lt;li&gt;per i debuttanti di &lt;span class="textsl"&gt;GRASS&lt;/span&gt;: non
scoraggiarsi; alcune cose
del tipo
&lt;pre&gt; v.category nodeSimple out=node layer=3 opt=add --overwrite&lt;br /&gt;&lt;/pre&gt;
non si capiscono al volo (a meno di persone particolarmente portate).
Questo è
normale: rifare alcune volte un esercizio non è una perdita di tempo.
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tutti i comandi usati in questa esercitazione sono contenuti in uno
script scaricabile
da &lt;a name="tex2html10"
href="http://www.4shared.com/file/79405379/5633eca1/sl_fullplanarsh.html"
id="tex2html10"&gt;da
questo link&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-4045210234043067369?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/4045210234043067369/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/01/full-planar-topology-in-grass-seconda.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/4045210234043067369?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/4045210234043067369?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/01/full-planar-topology-in-grass-seconda.html" title="Full planar topology in  GRASS (Seconda parte)" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_87lofqKSw4A/SWPR8-7z9NI/AAAAAAAAAKI/jmg_nDekAts/s72-c/nodeTopology.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0IARHk4eCp7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-432555484913378939</id><published>2009-01-06T23:23:00.005+01:00</published><updated>2009-12-21T23:45:45.730+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:45:45.730+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Topology" /><category scheme="http://www.blogger.com/atom/ns#" term="GRASS" /><title>Full planar topology in GRASS (Prima parte)</title><content type="html">&lt;h2&gt;&lt;a name="SECTION00001000000000000000"
id="SECTION00001000000000000000"&gt;Un breve
richiamo: la &lt;span class="textit"&gt;Full Planar Topology&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La &lt;span class="textit"&gt;Full Planar Topology&lt;/span&gt; è un modello
topologico poligonale
che soggiace ad alcune regole fondamentali:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Connettività:&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;gli archi sono tra loro connessi con un nodo in comune; ogni arco
inizia e termina
con un nodo (ogni arco ha due nodi); tutte le intersezioni tra archi
sono nodi.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Contiguità:&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;poligoni adiacenti hanno un solo arco in comune; ogni arco divide
due aree.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Contenimento:&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;un poligono chiuso da archi ha un'area misurabile; serie di archi
definiscono
perimetri e aree chiuse. Ogni area è circondata da archi e nodi. Ogni
nodo è contenuto in
aree.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Poste queste regole, il vettoriale &lt;code&gt;polyTopology&lt;/code&gt; della
location
&lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;
rappresentato qui di seguito,
dovrebbe avere le tabelle riportate sotto:&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/vd31KEB5zPeHXVaDXIWi4Q?authkey=WXnV94KCFd0&amp;amp;feat=embedwebsite"
target="Picasa albun"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SWPR9sRP9QI/AAAAAAAAAKQ/oy79d8BRW88/s144/polyTopology.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="c1"&gt;Le entità geometriche fondamentali: nodi, archi,
poligoni. Il verso degli
archi si riferisce al verso di digitazione.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;table width="30%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table border="1" cellpadding="3" width="100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th align="center"&gt;&lt;span class="textbf"&gt;Id (cat) nodo&lt;/span&gt;&lt;/th&gt;
&lt;th align="left"&gt;&lt;span class="textbf"&gt;Archi&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;1&lt;/td&gt;
&lt;td align="left"&gt;a1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;2&lt;/td&gt;
&lt;td align="left"&gt;a3,a5,a9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;3&lt;/td&gt;
&lt;td align="left"&gt;a8,a9,a10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;4&lt;/td&gt;
&lt;td align="left"&gt;a2,a3,a10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;5&lt;/td&gt;
&lt;td align="left"&gt;a4,a5,a6,a11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;6&lt;/td&gt;
&lt;td align="left"&gt;a4,a6,a7,a12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;7&lt;/td&gt;
&lt;td align="left"&gt;a11,a12,a13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;8&lt;/td&gt;
&lt;td align="left"&gt;a2,a7,a8,a13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
Node topology.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;table width="30%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table border="1" cellpadding="3" width="30%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th align="center"&gt;&lt;span class="textbf"&gt;Id arco&lt;/span&gt;&lt;/th&gt;
&lt;th align="left"&gt;&lt;span class="textbf"&gt;L_Poly&lt;/span&gt;&lt;/th&gt;
&lt;th align="left"&gt;&lt;span class="textbf"&gt;R_Poly&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a1&lt;/td&gt;
&lt;td align="left"&gt;polyA&lt;/td&gt;
&lt;td align="left"&gt;polyC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a2&lt;/td&gt;
&lt;td align="left"&gt;polyA&lt;/td&gt;
&lt;td align="left"&gt;polyB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a3&lt;/td&gt;
&lt;td align="left"&gt;polyA&lt;/td&gt;
&lt;td align="left"&gt;polyD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a4&lt;/td&gt;
&lt;td align="left"&gt;universe&lt;/td&gt;
&lt;td align="left"&gt;polyE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a5&lt;/td&gt;
&lt;td align="left"&gt;polyA&lt;/td&gt;
&lt;td align="left"&gt;universe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a6&lt;/td&gt;
&lt;td align="left"&gt;polyA&lt;/td&gt;
&lt;td align="left"&gt;universe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a7&lt;/td&gt;
&lt;td align="left"&gt;polyF&lt;/td&gt;
&lt;td align="left"&gt;polyA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a8&lt;/td&gt;
&lt;td align="left"&gt;universe&lt;/td&gt;
&lt;td align="left"&gt;polyB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a9&lt;/td&gt;
&lt;td align="left"&gt;universe&lt;/td&gt;
&lt;td align="left"&gt;polyD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a10&lt;/td&gt;
&lt;td align="left"&gt;polyB&lt;/td&gt;
&lt;td align="left"&gt;polyD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a11&lt;/td&gt;
&lt;td align="left"&gt;universe&lt;/td&gt;
&lt;td align="left"&gt;polyE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a12&lt;/td&gt;
&lt;td align="left"&gt;polyF&lt;/td&gt;
&lt;td align="left"&gt;polyE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;a13&lt;/td&gt;
&lt;td align="left"&gt;polyF&lt;/td&gt;
&lt;td align="left"&gt;universe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
Arc Topology
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;table width="30%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table border="1" cellpadding="3" width="100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th align="center"&gt;&lt;span class="textbf"&gt;Id (cat) poligono&lt;/span&gt;&lt;/th&gt;
&lt;th align="left"&gt;&lt;span class="textbf"&gt;label&lt;/span&gt;&lt;/th&gt;
&lt;th align="left"&gt;&lt;span class="textbf"&gt;Archi&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;1&lt;/td&gt;
&lt;td align="left"&gt;polyA&lt;/td&gt;
&lt;td align="left"&gt;a1,a2,a3,a5,a6,a7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;2&lt;/td&gt;
&lt;td align="left"&gt;polyB&lt;/td&gt;
&lt;td align="left"&gt;a2,a8,a10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;3&lt;/td&gt;
&lt;td align="left"&gt;polyC&lt;/td&gt;
&lt;td align="left"&gt;a1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;4&lt;/td&gt;
&lt;td align="left"&gt;polyD&lt;/td&gt;
&lt;td align="left"&gt;a3,a9,a10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;5&lt;/td&gt;
&lt;td align="left"&gt;polyE&lt;/td&gt;
&lt;td align="left"&gt;a4,a11,a12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;6&lt;/td&gt;
&lt;td align="left"&gt;polyF&lt;/td&gt;
&lt;td align="left"&gt;a7,a12,a13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
Polygon Topology
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;a name="SECTION00002000000000000000"
id="SECTION00002000000000000000"&gt;Obbiettivi&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a name="tex2html1"
href="http://grass.itc.it/grass64/manuals/html64_user/vectorintro.html"
id="tex2html1"&gt;&lt;span class="textsl"&gt;GRASS&lt;/span&gt;&lt;/a&gt;&amp;nbsp; è un &lt;span
class="textsl"&gt;GIS&lt;/span&gt;&amp;nbsp; topologico; le 3 tabelle fondamentali
viste sopra devono quindi
essere facilmente ottenibili.&lt;/p&gt;
&lt;p&gt;Il comando&lt;/p&gt;
&lt;pre&gt; v.build map=polyTopology opt=dump&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;consente la visualizzazione di tutti gli elementi della topologia
del vettoriale
&lt;code&gt;polyTopology&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Lo scopo di questo esercizio è didattico: nella costruzione delle
tre tabelle
topologiche, si condurrà una &lt;span class="textit"&gt;simulazione&lt;/span&gt;
senza ricorrere a
&lt;a name="tex2html2"
href="http://grass.itc.it/grass64/manuals/html64_user/v.build.html"
id="tex2html2"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.build&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;;
questo
consentirà di esplorare al meglio alcuni tools che interagiscono con le
entità
geometriche fondamentali (nodi,archi,poligoni).&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00003000000000000000"
id="SECTION00003000000000000000"&gt;Set di dati
per l'esercitazione&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La copertura poligonale scelta per l'esercitazione è &lt;code&gt;polyTopology&lt;/code&gt;,
contenuta nella location &lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Questa location è stata creata appositamente per fini didattici; per
avere maggiori
notizie vedere&amp;nbsp;&lt;a name="tex2html3"
href="http://appuntigis.blogspot.com/2008/12/simpleloc.html"
id="tex2html3"&gt;questo&lt;/a&gt;
&amp;nbsp;precedente blog.&lt;/p&gt;
&lt;p&gt;La location &lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;
può essere
scaricata da &lt;a
href="http://www.4shared.com/file/75386143/662f3cf1/simpleloc.html"
target="_blank"&gt;qui&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00004000000000000000"
id="SECTION00004000000000000000"&gt;Procedura&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Si creerà per prima la tabella &lt;span class="textit"&gt;Arc Topology&lt;/span&gt;,
quindi la
&lt;span class="textit"&gt;Node Topology&lt;/span&gt; e da ultimo la &lt;span
class="textit"&gt;Polygon
Topology&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Le fasi logiche sono le seguenti:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;creazione di un layer di archi (=boundaries) numerato
univocamente;&lt;/li&gt;
&lt;li&gt;agli attributi degli archi vengono aggiunti gli identificativi
(=cat) dei poligoni
posti a destra e a sinistra di ciascun elemento;&lt;/li&gt;
&lt;li&gt;creazione di un layer di nodi (=punti) numerati univocamente;&lt;/li&gt;
&lt;li&gt;agli attributi dei nodi vengono aggiunti gli identificativi degli
archi ai quali sono
uniti;&lt;/li&gt;
&lt;li&gt;dalla combinazione delle tabelle dei nodi e degli archi si
ottiene la &lt;span class="textit"&gt;Polygon Topology&lt;/span&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a name="SECTION00005000000000000000"
id="SECTION00005000000000000000"&gt;Arc
Topology&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I boundaries per default non hanno una categoria. Si crea un nuovo
layer aggiungendo
un valore di categoria univoco:&lt;/p&gt;
&lt;pre&gt;v.category in=polyTopology type=boundary \&lt;br /&gt; layer=2 out=arcs option=add cat=1 --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Agli attributi del layer appena creato si aggiunge una serie di
campi: alcuni
conterrano solo testo e serviranno per la visualizzazione. Inoltre
alcuni campi testuali
offorno l'occasione per fare esercizio anche con l'SQL.&lt;/p&gt;
&lt;pre&gt;v.db.addtable arcs layer=2 columns="cat integer, \&lt;br /&gt; arcLabel char(3), \&lt;br /&gt; catPolyLeft integer, \&lt;br /&gt; polyLeftLabel char(5), \&lt;br /&gt; catPolyRight int, \&lt;br /&gt; polyRightLabel char(5), \&lt;br /&gt; arcLength double precision"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si inizia a popolare il campo &lt;code&gt;arcLabel&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;v.db.update map=arcs layer=2 column=arcLabel qcolumn="'a'||cat"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'operatore SQL || concatena le stringhe; in questo caso concatena
la stringa
&lt;span class="textit"&gt;a&lt;/span&gt; con il contenuto del campo &lt;span
class="textit"&gt;cat&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Con il tool &lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.db
opt=sides&lt;/em&gt;&lt;/span&gt; si
ottengono le categorie dei poligoni rispettivamente a sinistra e a
destra di ciascun arco
(boundary):&lt;/p&gt;
&lt;pre&gt;v.to.db arcs layer=2 option=sides col=catPolyLeft,catPolyRight&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si calcola inoltre la lunghezza di ciascun arco:&lt;/p&gt;
&lt;pre&gt;v.to.db arcs layer=2 option=length col=arcLength&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Viene ora il momento di usare l'SQL: sulla base delle categorie
delle aree ottenute
con &lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.db opt=sides&lt;/em&gt;&lt;/span&gt;
si popolano i
due campi &lt;span class="textit"&gt;polyLeftLabel&lt;/span&gt; e &lt;span
class="textit"&gt;polyRightLabel&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;echo "UPDATE arcs_2 SET polyLeftLabel=IFNULL( \&lt;br /&gt; (SELECT arcs.label FROM arcs \&lt;br /&gt; WHERE arcs.cat=arcs_2.catPolyLeft),'universe')" | db.execute&lt;br /&gt;&lt;br /&gt;echo "UPDATE arcs_2 SET polyRightLabel=IFNULL( \&lt;br /&gt; (SELECT arcs.label FROM arcs \&lt;br /&gt; WHERE arcs.cat=arcs_2.catPolyRight),'universe')" | db.execute&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'operazione effettuata merita qualche spiegazione; sul layer 1 del
vettoriale
&lt;code&gt;arcs&lt;/code&gt; vi sono gli attributi delle aree:&lt;/p&gt;
&lt;pre&gt;v.db.select arcs layer=1&lt;br /&gt;cat|label|GRASSRGB&lt;br /&gt;1|polyA|141:211:199&lt;br /&gt;3|polyC|190:186:218&lt;br /&gt;2|polyB|255:255:179&lt;br /&gt;4|polyD|251:128:114&lt;br /&gt;5|polyE|128:177:211&lt;br /&gt;6|polyF|253:180:98&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Nei campi &lt;span class="textit"&gt;catPolyLeft&lt;/span&gt; e &lt;span
class="textit"&gt;catPolyRight&lt;/span&gt; del layer2 sono state memorizzate
le categorie delle aree
del layer 1: esiste quindi una relazione biunivoca fra i due campi del
layer 2 e il campo
&lt;span class="textit"&gt;cat&lt;/span&gt; del layer1. Grazie a questa relazione
si può stabilire un
&lt;span class="textit"&gt;join&lt;/span&gt; fra le due tabelle imponendo la
condizione &lt;code&gt;WHERE
arcs.cat=arcs_2.catPolyLeft&lt;/code&gt; e &lt;code&gt;WHERE
arcs.cat=arcs_2.catPolyRight&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Se tali condizioni non vengono soddisfatte significa che il valore
della &lt;span class="textit"&gt;cat&lt;/span&gt; del layer 1 non ha
corrispondenze nel layer 2: è il caso del poligono
&lt;span class="textit"&gt;universe&lt;/span&gt; (valore &lt;code&gt;-1&lt;/code&gt;), l'area
che, nel modello
topologico Full Planar Topology &lt;span class="textit"&gt;avvolge&lt;/span&gt;
idealmente ogni altro
oggetto.&lt;/p&gt;
&lt;p&gt;Dopo queste operazioni gli attributi sul layer 2 sono:&lt;/p&gt;
&lt;pre&gt;v.db.select arcs layer=2&lt;br /&gt;cat|arcLabel|catPolyLeft|polyLeftLabel|catPolyRight|polyRightLabel|arcLength&lt;br /&gt;1|a1|3|polyC|1|polyA|6.242641&lt;br /&gt;2|a2|2|polyB|1|polyA|3&lt;br /&gt;3|a3|4|polyD|1|polyA|6.708204&lt;br /&gt;4|a4|5|polyE|-1|universe|3.414214&lt;br /&gt;5|a5|-1|universe|1|polyA|5.019765&lt;br /&gt;6|a6|-1|universe|1|polyA|2.828427&lt;br /&gt;7|a7|1|polyA|6|polyF|4.162278&lt;br /&gt;8|a8|2|polyB|-1|universe|5.162278&lt;br /&gt;9|a9|4|polyD|-1|universe|10.261297&lt;br /&gt;10|a10|4|polyD|2|polyB|3&lt;br /&gt;11|a11|5|polyE|-1|universe|5.828427&lt;br /&gt;12|a12|5|polyE|6|polyF|2.414214&lt;br /&gt;13|a13|-1|universe|6|polyF|7.071068&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si verifichi anche la situazione delle categorie sui due layers:&lt;/p&gt;
&lt;pre&gt;v.category arcs opt=report&lt;br /&gt;Layer/table: 2/arcs_2&lt;br /&gt;type count min max&lt;br /&gt;point 0 0 0&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 13 1 13&lt;br /&gt;centroid 0 0 0&lt;br /&gt;area 0 0 0&lt;br /&gt;all 13 1 13&lt;br /&gt;Layer/table: 1/arcs&lt;br /&gt;type count min max&lt;br /&gt;point 0 0 0&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 0 0 0&lt;br /&gt;centroid 6 1 6&lt;br /&gt;area 0 0 0&lt;br /&gt;all 6 1 6&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;A questo punto la costruzione della tabella Arc Topology è conclusa:&lt;/p&gt;
&lt;pre&gt;v.db.select arcs layer=2 \&lt;br /&gt; col=arcLabel,polyRightLabel,polyLeftLabel&lt;br /&gt;arcLabel|polyRightLabel|polyLeftLabel&lt;br /&gt;a1|polyA|polyC&lt;br /&gt;a2|polyA|polyB&lt;br /&gt;a3|polyA|polyD&lt;br /&gt;a4|universe|polyE&lt;br /&gt;a5|polyA|universe&lt;br /&gt;a6|polyA|universe&lt;br /&gt;a7|polyF|polyA&lt;br /&gt;a8|universe|polyB&lt;br /&gt;a9|universe|polyD&lt;br /&gt;a10|polyB|polyD&lt;br /&gt;a11|universe|polyE&lt;br /&gt;a12|polyF|polyE&lt;br /&gt;a13|polyF|universe&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si procede ora alla visualizzazione :&lt;/p&gt;
&lt;pre&gt;./sl_draw.sh&lt;br /&gt;d.font.freetype font=timesbd&lt;br /&gt;d.vect -a arcs layer=1 display=shape &lt;br /&gt;d.vect arcs layer=1 display=attr attrcol=Label llayer=1 \&lt;br /&gt; color=black lsize=10 xref=center yref=bottom&lt;br /&gt;d.vect arcs layer=2 display=shape,attr,dir attrcol=arcLabel \&lt;br /&gt; type=boundary llayer=2 \&lt;br /&gt; xref=center yref=center color=grey \&lt;br /&gt; lsize=10 bgcolor=white bcolor=black&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Lo script &lt;span class="textbf"&gt;&lt;em class="slanted"&gt;sl_draw.sh&lt;/em&gt;&lt;/span&gt;
può essere
scaricato da &lt;a name="tex2html4"
href="http://www.4shared.com/file/75453673/9a067d8c/sl_draw.html"
id="tex2html4"&gt;questo
indirizzo&lt;/a&gt;; deve essere ovviamente scomapttato, reso eseguibile (&lt;code&gt;chmod
ugoa+x
sl_draw.sh&lt;/code&gt;) e posto in una directory in modo che l'interprete
dei comandi possa
trovarlo (controllare con &lt;code&gt;echo $PATH&lt;/code&gt;).&lt;/p&gt;
&lt;table class="c2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/fT4RRP7dOJ0157i7S-fKrQ?authkey=WXnV94KCFd0&amp;amp;feat=embedwebsite"
target="picasa albun"&gt;&lt;img
src="http://lh4.ggpht.com/_87lofqKSw4A/SWPR87yZbvI/AAAAAAAAAKA/4FFblIPy0jA/s144/arcTopology.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="c3"&gt;Il vettoriale arcs: sul layer 1 mantiene le aree;
sul layer 2 gli archi
(=boundaries) con gli attributi calcolati.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-432555484913378939?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/432555484913378939/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2009/01/full-planar-topology-in-grass.html#comment-form" title="1 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/432555484913378939?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/432555484913378939?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2009/01/full-planar-topology-in-grass.html" title="Full planar topology in GRASS (Prima parte)" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_87lofqKSw4A/SWPR9sRP9QI/AAAAAAAAAKQ/oy79d8BRW88/s72-c/polyTopology.png" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;D0UCRXw_eSp7ImA9WxBSFE4.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-6212297027481852816</id><published>2008-12-28T00:09:00.006+01:00</published><updated>2009-12-21T23:41:04.241+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T23:41:04.241+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GRASS" /><category scheme="http://www.blogger.com/atom/ns#" term="v.clean" /><category scheme="http://www.blogger.com/atom/ns#" term="v.to.db" /><title>Trovare i contorni duplicati con GRASS</title><content type="html">&lt;h2&gt;&lt;a name="SECTION00001000000000000000"
id="SECTION00001000000000000000"&gt;Obbiettivi&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Con questa esercitazione si vuole dimostrare come &lt;span
class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; possa individuare quali e quanti
sono, in una copertura
poligonale &lt;span class="textit"&gt;non topologica&lt;/span&gt;, i contorni
(boundaries)
duplicati.&lt;/p&gt;
&lt;p&gt;Si farà ricorso a moduli di &lt;span class="textit"&gt;alto livello&lt;/span&gt;,
senza dover
accedere ai vettoriali a &lt;span class="textit"&gt;basso livello&lt;/span&gt;,
come nel caso
del'impiego di &lt;a name="tex2html1"
href="http://grass.itc.it/grass64/manuals/html64_user/v.build.html"
id="tex2html1"&gt;v.build&lt;/a&gt;&amp;nbsp;&amp;nbsp;(&lt;span class="textit"&gt;alto&lt;/span&gt;
e &lt;span class="textit"&gt;basso&lt;/span&gt; livello vengono qui usati per
riferirsi al livello di
interfacciabilità verso l'utente).&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00002000000000000000"
id="SECTION00002000000000000000"&gt;Set di dati
per l'esercitazione&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La copertura poligonale scelta per l'esercitazione è &lt;code&gt;polyNoTopology&lt;/code&gt;,
contenuta nella location &lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Questa location è stata creata appositamente per fini didattici; per
avere maggiori
notizie vedere&amp;nbsp;&lt;a name="tex2html2"
href="http://appuntigis.blogspot.com/2008/12/simpleloc.html"
id="tex2html2"&gt;questo&lt;/a&gt;
&amp;nbsp;precedente blog.&lt;/p&gt;
&lt;p&gt;La location &lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;
può essere
scaricata da &lt;a
href="http://www.4shared.com/file/75386143/662f3cf1/simpleloc.html"
target="_blank"&gt;qui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;polyNoTopology&lt;/code&gt; è un vettoriale &lt;span class="textit"&gt;non
topologico&lt;/span&gt;
(modello CAD o &lt;span class="textit"&gt;modello spaghetti&lt;/span&gt;) con le
seguenti
caratteristiche:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;i contorni dei poligoni adiacenti sono duplicati;&lt;/li&gt;
&lt;li&gt;i contorni, se si intersecano, non generano &lt;span class="textit"&gt;nodi&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a name="SECTION00003000000000000000"
id="SECTION00003000000000000000"&gt;Prime
verifiche&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Avviare &lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; ed entrare nella
location &lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;;
si dovrebbero trovare i seguenti
vettoriali:&lt;/p&gt;
&lt;pre&gt;GRASS 6.4.svn (simpleloc):~ &amp;gt; g.list vect&lt;br /&gt;----------------------------------------------&lt;br /&gt;vector files available in mapset &amp;lt;user1&amp;gt;:&lt;br /&gt;node_grid polyBreakCat polyNoTopology punti xylabels&lt;br /&gt;polyBoundCat polyClean polyTopology vgrid&lt;br /&gt;polyBreak polyFromArc poly_arc vrastergrid&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si può verificare che vi sono lati duplicati controllando le
coordinate dei vertici
dei contorni semplicemente con &lt;a name="tex2html3"
href="http://grass.itc.it/grass64/manuals/html64_user/v.out.ascii.html"
id="tex2html3"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.out.ascii&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;v.out.ascii in=polyNoTopology \&lt;br /&gt; format=standard | sed -n '/^B/,/^C/p' | sed -n '/^C/!p'&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Leggendo le coordinate in output si può verificare che i lati in
comune sono digitati
due volte. Il &lt;span class="textit"&gt;pipe&lt;/span&gt; ('|') verso &lt;a
name="tex2html4" href="http://www.gnu.org/software/sed/manual/"
id="tex2html4"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;sed&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
non è strettamente necessario e serve solo per filtrare i
dati non utili in questo contesto.&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00004000000000000000"
id="SECTION00004000000000000000"&gt;Cercare i
contorni duplicati&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I contorni di &lt;code&gt;polyNoTopology&lt;/code&gt;, oltre ad essere
duplicati in corrispondenza
delle adiacenze tra poligoni, non sono &lt;span class="textit"&gt;spezzati&lt;/span&gt;
(&lt;span class="textit"&gt;break&lt;/span&gt;).&lt;/p&gt;
&lt;p&gt;La procedura per trovare i duplicati può essere riassunta nei
seguenti passi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;spezzare in boundaries (= contorni dei poligoni), inserendo un
nodo nei punti di
incrocio;&lt;/li&gt;
&lt;li&gt;numerare in modo univoco i boundaries;&lt;/li&gt;
&lt;li&gt;rimuovere i boundaries duplicati;&lt;/li&gt;
&lt;li&gt;attribuire nuovamente una numerazione univoca ai boundaries senza
duplicati&lt;/li&gt;
&lt;li&gt;interrogare, dallo &lt;span class="textit"&gt;strato&lt;/span&gt; dei
boundaries &lt;span class="textbf"&gt;senza&lt;/span&gt; duplicati, le geometrie
dello &lt;span class="textit"&gt;strato&lt;/span&gt;
&lt;span class="textbf"&gt;con&lt;/span&gt; i duplicati: per ciascun elemento
geometrico del primo
ottenere quanti e quali elementi del secondo esistono: se si ottiene un
valore pari ad 1
il boundaries in quel tratto non è duplicato; se si ottiene un valore
maggiore di 1 il
boundaries è duplicato.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Per spezzare i boundaries si usa il modulo&amp;nbsp; &lt;a name="tex2html5"
href="http://grass.itc.it/grass64/manuals/html64_user/v.clean.html"
id="tex2html5"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;con
il
tool &lt;span class="textbf"&gt;&lt;em class="slanted"&gt;break&lt;/em&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;v.clean in= vectInput out=polyBreak tool=break type=boundary --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si può facilmente verificare che i boundaries non hanno categoria;
nell'output di
&lt;a name="tex2html6"
href="http://grass.itc.it/grass64/manuals/html64_user/v.category.html"
id="tex2html6"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.category
opt=report&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;, infatti, vengono riportate le categorie per
i soli
centroidi:&lt;/p&gt;
&lt;pre&gt;v.category in=polyBreak opt=report&lt;br /&gt;Layer/table: 1/polyBreak&lt;br /&gt;type count min max&lt;br /&gt;point 0 0 0&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 0 0 0&lt;br /&gt;centroid 6 1 6&lt;br /&gt;area 0 0 0&lt;br /&gt;all 6 1 6&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si aggiunge allora la categoria ai boundaries &lt;span class="textit"&gt;spezzati&lt;/span&gt;
(&lt;span class="textit"&gt;break&lt;/span&gt;) creando il layer 2 ; considerato
che i centroidi
hanno categoria da 1 a 6 , per non confondere i valori, si decide di
numerare i
boundaries da 100 in poi:&lt;/p&gt;
&lt;pre&gt;v.category in=polyBreak type=boundary out=polyBreakCat \&lt;br /&gt; layer=2 opt=add cat=100 --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;La situazione dei layers e delle categorie può essere evidenziata
ancora una volta con
&lt;a name="tex2html7"
href="http://grass.itc.it/grass64/manuals/html64_user/v.category.html"
id="tex2html7"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.category
opt=report&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;v.category in=polyBreakCat opt=report&lt;br /&gt;Layer: 2&lt;br /&gt;type count min max&lt;br /&gt;point 0 0 0&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 18 100 117&lt;br /&gt;centroid 0 0 0&lt;br /&gt;area 0 0 0&lt;br /&gt;all 18 100 117&lt;br /&gt;Layer/table: 1/polyBreakCat&lt;br /&gt;type count min max&lt;br /&gt;point 0 0 0&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 0 0 0&lt;br /&gt;centroid 6 1 6&lt;br /&gt;area 0 0 0&lt;br /&gt;all 6 1 6&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;La situazione è quindi la seguente: sul layer 1 di &lt;code&gt;polyBreakCat&lt;/code&gt;
vi sono i
centroidi con categorie da 1 a 6 ; sul layer 2 vi sono i buondaries
numerati, in modo
univoco, da 100 a 117 .&lt;/p&gt;
&lt;p&gt;Occorre ora rimuovere i duplicati da &lt;code&gt;polyBreakCat&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;v.clean in=polyBreakCat out=polyClean \&lt;br /&gt; type=boundary tool=rmdupl --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; ha rimosso i &lt;span
class="textit"&gt;pezzi&lt;/span&gt;
di boundaries duplicati; il vettoriale ottenuto (&lt;code&gt;polyClean&lt;/code&gt;)
conserva sul
layer 1 le categorie dei centroidi e sul layer 2 le categorie di tutti
i boundaries,
compresi quelli duplicati; ed è proprio quest'ultima caratterisitca il &lt;span
class="textit"&gt;segreto&lt;/span&gt; di questo eserzio.&lt;/p&gt;
&lt;p&gt;Se infatti ora si rinumerano i boundaries, verrano rinumerati solo
ed esclusivamente i
boundaries senza i duplicati ma esisterà una relazione &lt;span
class="textit"&gt;uno&lt;/span&gt; a
&lt;span class="textit"&gt;molti&lt;/span&gt; tra il layer 2 e il layer 3 .&lt;/p&gt;
&lt;pre&gt;v.category in=polyClean out=polyBoundCat \&lt;br /&gt; type=boundary layer=3 opt=add cat=100 --overwrite&lt;br /&gt;v.category in=polyBoundCat opt=report&lt;br /&gt;Layer/table: 2/polyBoundCat_2&lt;br /&gt;type count min max&lt;br /&gt;point 0 0 0&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 18 100 117&lt;br /&gt;centroid 0 0 0&lt;br /&gt;area 0 0 0&lt;br /&gt;all 18 100 117&lt;br /&gt;Layer/table: 3/polyBoundCat_3&lt;br /&gt;type count min max&lt;br /&gt;point 0 0 0&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 13 100 112&lt;br /&gt;centroid 0 0 0&lt;br /&gt;area 0 0 0&lt;br /&gt;all 13 100 112&lt;br /&gt;Layer/table: 1/polyBoundCat&lt;br /&gt;type count min max&lt;br /&gt;point 0 0 0&lt;br /&gt;line 0 0 0&lt;br /&gt;boundary 0 0 0&lt;br /&gt;centroid 6 1 6&lt;br /&gt;area 0 0 0&lt;br /&gt;all 6 1 6&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Riassumendo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sul layer 1 : i centroidi (categorie da 1 a 6 );&lt;/li&gt;
&lt;li&gt;sul layer 2 : i boundaries &lt;span class="textit"&gt;spezzati&lt;/span&gt; (&lt;span
class="textit"&gt;break&lt;/span&gt;) ma con i duplicati (categorie da 100 a
117 );&lt;/li&gt;
&lt;li&gt;sul layer 3 : i boundaries &lt;span class="textit"&gt;spezzati&lt;/span&gt; (&lt;span
class="textit"&gt;break&lt;/span&gt;) e senza dupicati (categorie da 100 a 112
).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si aggiungono ora le tabelle al layer 2 e 3 di &lt;code&gt;polyBoundCat&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;v.db.addtable polyBoundCat layer=2&lt;br /&gt;&lt;br /&gt;v.db.addtable polyBoundCat layer=3 \&lt;br /&gt; col="cat integer, count integer,listarcs varchar(12)"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; offre un potente modulo per
interrogare le
geometrie e caricare i dati dell'interrogazione nella tabella degli
attributi: &lt;a name="tex2html8"
href="http://grass.itc.it/grass64/manuals/html64_user/v.to.db.html"
id="tex2html8"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.db&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nel modello vettoriale di &lt;span class="textsl"&gt;GRASS&lt;/span&gt;, per
ogni primitiva
geometrica possono venir memorizzati i numeri dei layers e, per ciascun
numero di layer,
il numero della categoria (difficilmente si capirà il meccanismo di
questo esercizio se
non si ha chiaro questo concetto; vedere il &lt;a name="tex2html9"
href="http://grass.itc.it/grass64/manuals/html64_user/vectorintro.html"
id="tex2html9"&gt;manuale&lt;/a&gt; di &lt;span class="textsl"&gt;GRASS&lt;/span&gt;).&lt;/p&gt;
&lt;p&gt;Viene ora il momento di interrogare le geometrie del layer 2 ,
popolando i due campi
&lt;code&gt;count&lt;/code&gt; e &lt;code&gt;listarcs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;v.to.db map=polyBoundCat option=query type=boundary \&lt;br /&gt; layer=3 qlayer=2 column=count qcolumn="count(*)"&lt;br /&gt;v.to.db map=polyBoundCat option=query type=boundary \&lt;br /&gt; layer=3 qlayer=2 column=listarcs qcolumn="group_concat(cat)"&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Nella seconda operazione si usa il comando di aggregazione &lt;code&gt;group_concat&lt;/code&gt;
supportato nelle recenti versioni di &lt;a name="tex2html10"
href="http://www.sqlite.org/lang_aggfunc.html" id="tex2html10"&gt;&lt;span
class="textsl"&gt;SQLite&lt;/span&gt;&lt;/a&gt;: questo comando concatena i valori
trovati, creando così
l'elenco delle categorie dei boundaries.&lt;/p&gt;
&lt;p&gt;Si passa ora alla visualizzazione della tabella:&lt;/p&gt;
&lt;pre&gt;v.db.select polyBoundCat layer=3&lt;br /&gt;cat|count|listarcs&lt;br /&gt;100|1|100&lt;br /&gt;101|1|105&lt;br /&gt;102|1|106&lt;br /&gt;103|1|107&lt;br /&gt;104|1|111&lt;br /&gt;105|1|112&lt;br /&gt;106|1|115&lt;br /&gt;107|1|117&lt;br /&gt;108|2|101,103&lt;br /&gt;109|2|102,104&lt;br /&gt;110|2|108,109&lt;br /&gt;111|2|110,113&lt;br /&gt;112|2|114,116&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; ha correttamente indviduato
quali e quanti
boundaries erano duplicati:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nella colonna &lt;code&gt;count&lt;/code&gt;, per ogni record (=per ogni
geometria) del layer 3
sono stati &lt;span class="textit"&gt;contati&lt;/span&gt; quanti elementi sono
presenti nel layer 2
;&lt;/li&gt;
&lt;li&gt;nella colonna &lt;code&gt;listarcs&lt;/code&gt;, per ogni record (=per ogni
geometria) del layer
3 sono stati &lt;span class="textit"&gt;elencati&lt;/span&gt; quali elementi sono
presenti nel layer
2 ; in questo caso sono state elencate le categorie corrispondenti ai
boundaries
contenuti nel layer 2 .&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una visualizzazione grafica renderà più chiare le idee; si può usare
la linea di
comando:&lt;/p&gt;
&lt;pre&gt;# # # disegno&lt;br /&gt;./sl_draw.sh&lt;br /&gt;d.vect polyBoundCat layer=3 display=shape,cat color=grey llayer=3 \&lt;br /&gt; xref=center yref=center lcolor=aqua \&lt;br /&gt; lsize=10 bgcolor=white bcolor=black&lt;br /&gt;# # # output del file png &lt;br /&gt;d.out.file out=polyBoundCat_l3 format=png --overwrite &lt;br /&gt;./sl_draw.sh&lt;br /&gt;d.vect polyBoundCat layer=2 display=shape,cat color=grey llayer=2 \&lt;br /&gt; xref=center yref=center lcolor=red \&lt;br /&gt; lsize=10 bgcolor=white bcolor=black&lt;br /&gt;# # # output del file png &lt;br /&gt;d.out.file out=polyBoundCat_l2 format=png --overwrite&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Lo script &lt;span class="textbf"&gt;&lt;em class="slanted"&gt;sl_draw.sh&lt;/em&gt;&lt;/span&gt;
può essere
scaricato da &lt;a name="tex2html11"
href="http://www.4shared.com/file/75453673/9a067d8c/sl_draw.html"
id="tex2html11"&gt;questo
indirizzo&lt;/a&gt;; deve essere ovviamente scomapttato, reso eseguibile (&lt;code&gt;chmod
ugoa+x
sl_draw.sh&lt;/code&gt;) e posto in una directory in modo che l'interprete
dei comandi possa
trovarlo (controllare con &lt;code&gt;echo $PATH&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Tutto il codice utilizzato in questo esercizio può esere scaricato
da &lt;a name="tex2html12"
href="http://www.4shared.com/file/78179365/48d26864/sl_findDuplicate.html"
id="tex2html12"&gt;qui&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il risultato delle ultime righe di comando dovrebbe essere la
visualizzazione dei due
layer di &lt;code&gt;polyBoundCat&lt;/code&gt; in due separati monitors:&lt;/p&gt;
&lt;table class="c1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/_RaxEsBuIcszRhyWUI8xAQ?authkey=ZTkOYLk_GNc&amp;amp;feat=embedwebsite"
target="picasa albun"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SVoKC03DXvI/AAAAAAAAAJM/LnqfZdpeIW4/s144/polyBoundCat_l2.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/4dGsu1kTDsSfY95cihGC9Q?authkey=ZTkOYLk_GNc&amp;amp;feat=embedwebsite"
target="picasa albun"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SVoKC2R_4JI/AAAAAAAAAJU/QXg9lpSdj8g/s144/polyBoundCat_l3.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;È pure possibile usare la comoda interfaccia grafica wxpython di &lt;span
class="textsl"&gt;GRASS&lt;/span&gt;:&lt;/p&gt;
&lt;table class="c1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/YdE0Y8zZSj5avVb3ZTBzVQ?authkey=ZTkOYLk_GNc&amp;amp;feat=embedwebsite"
target="picasa albun"&gt;&lt;img
src="http://lh4.ggpht.com/_87lofqKSw4A/SVavUA9xd_I/AAAAAAAAAIc/0BOS3LIFmt8/s144/mapDisp_polyBoundCatLayer2.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/K9RAYCmUCl2Hp13Wy4T-ZA?authkey=ZTkOYLk_GNc&amp;amp;feat=embedwebsite"
target="picasa albun"&gt;&lt;img
src="http://lh4.ggpht.com/_87lofqKSw4A/SVavUaGIidI/AAAAAAAAAIk/SGnTSJO6afw/s144/mapDisp_polyBoundCatLayer3.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a
href="http://picasaweb.google.com/lh/photo/fT4WqvQ_kMKUxhi8K5B7yQ?authkey=ZTkOYLk_GNc&amp;amp;feat=embedwebsite"
target="picasa albun"&gt;&lt;img
src="http://lh5.ggpht.com/_87lofqKSw4A/SVavUv2ctdI/AAAAAAAAAIs/CQJvUpYACcI/s144/tab_polyBoundCatLayer2.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;a name="SECTION00005000000000000000"
id="SECTION00005000000000000000"&gt;Il caso
dell'import di shapefiles&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tutta la procedura vista può essere utilmente applicata al caso
dell'import di
shapefiles in &lt;span class="textsl"&gt;GRASS&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Lo shapefile è una struttura dati di tipo &lt;span class="textit"&gt;non
topologico&lt;/span&gt;.
Si provi allora ad esportare in shapefile la copertura poligonale
(topologicamente
corretta) della &lt;a name="tex2html13"
href="http://appuntigis.blogspot.com/2008/12/simpleloc.html"
id="tex2html13"&gt;location
&lt;span class="textit"&gt;&lt;em class="sans"&gt;simpleloc&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
denominata
&lt;code&gt;polyTopology&lt;/code&gt; con &lt;a name="tex2html14"
href="http://grass.itc.it/grass64/manuals/html64_user/v.out.ogr.html"
id="tex2html14"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.out.ogr&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;v.out.ogr -c input=polyTopology type=area dsn=~/tmp&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'opzione &lt;code&gt;-c&lt;/code&gt; fa in modo che nell'export siano comprese
solo le features
geometriche con categorie (nel caso di &lt;code&gt;polyTopology&lt;/code&gt; tutte
le aree). Si può
ora reimportare in &lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; lo
shapefile:&lt;/p&gt;
&lt;pre&gt;v.in ogr dsn=~/tmp layer=polyTopology out=polyFromShp snap=-1 --o&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;L'esercizio visto può essere ripetuto con il vettoriale ottenuto
dall'import
(&lt;code&gt;polyFromShp&lt;/code&gt;) addivenendo ai medesimi risultati.&lt;/p&gt;
&lt;p&gt;Il modulo &lt;a name="tex2html15"
href="http://grass.itc.it/grass64/manuals/html64_user/v.clean.html"
id="tex2html15"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
offre dei
tools appositi per la &lt;span class="textit"&gt;pulizia&lt;/span&gt; dei
vettoriali importati in
&lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; da strutture dati (come gli
shapefiles)
&lt;span class="textit"&gt;non topologici&lt;/span&gt;: &lt;span class="textbf"&gt;&lt;em
class="slanted"&gt;rmdupl&lt;/em&gt;&lt;/span&gt; e &lt;span class="textbf"&gt;&lt;em
class="slanted"&gt;bpol&lt;/em&gt;&lt;/span&gt;;
il primo rimuove i duplicati; il secondo &lt;span class="textit"&gt;spezza&lt;/span&gt;
(=&lt;span class="textit"&gt;break&lt;/span&gt;) in modo topologico il contorno dei
poligoni.&lt;/p&gt;
&lt;h2&gt;&lt;a name="SECTION00006000000000000000"
id="SECTION00006000000000000000"&gt;Conclusioni&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Questa esercitazione permette di capire quali attenzioni devono
essere poste quando si
importa in un &lt;span class="textsl"&gt;GIS&lt;/span&gt;&amp;nbsp; topologico come &lt;span
class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp; una struttura dati &lt;span
class="textit"&gt;non
topologica&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Il modulo &lt;a name="tex2html16"
href="http://grass.itc.it/grass64/manuals/html64_user/v.clean.html"
id="tex2html16"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.clean&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
rappresenta
il &lt;span class="textit"&gt;passaggio obbligato&lt;/span&gt; attraverso il quale
&lt;span class="textit"&gt;pulire&lt;/span&gt; i vettoriali importati in &lt;span
class="textsl"&gt;GRASS&lt;/span&gt;: si è
vista la possibilità di rimozione dei duplicati (&lt;span class="textbf"&gt;&lt;em
class="slanted"&gt;rmdupl&lt;/em&gt;&lt;/span&gt;), l'inserimento di nodi nei punti
di intersezione
(&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;break&lt;/em&gt;&lt;/span&gt;); si è pure
accennato
all'apposito tool &lt;span class="textbf"&gt;&lt;em class="slanted"&gt;bpol&lt;/em&gt;&lt;/span&gt;
(per i
polgioni).&lt;/p&gt;
&lt;p&gt;Il modulo &lt;a name="tex2html17"
href="http://grass.itc.it/grass64/manuals/html64_user/v.to.db.html"
id="tex2html17"&gt;&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;v.to.db&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;
consente di
interrogare le geometrie tra layers diversi dello stesso vettoriale con
l'opzione
&lt;span class="textbf"&gt;&lt;em class="slanted"&gt;query&lt;/em&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Sono stati trattati solo due dei diversi tipi di errori di
topologia. Per altre
anomalie, quali &lt;span class="textit"&gt;pseudonodi&lt;/span&gt;, &lt;span
class="textit"&gt;dangles&lt;/span&gt;, &lt;span class="textit"&gt;weird polygons&lt;/span&gt;,
&lt;span class="textit"&gt;sliver polygons&lt;/span&gt;, &lt;span class="textsl"&gt;GRASS&lt;/span&gt;&amp;nbsp;
offre dei rimedi
più o meno efficaci, che si esamineranno in dettaglio in prossime
esercitazioni.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-6212297027481852816?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/6212297027481852816/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2008/12/trovare-i-contorni-duplicati-con-grass.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/6212297027481852816?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/6212297027481852816?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2008/12/trovare-i-contorni-duplicati-con-grass.html" title="Trovare i contorni duplicati con GRASS" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_87lofqKSw4A/SVoKC03DXvI/AAAAAAAAAJM/LnqfZdpeIW4/s72-c/polyBoundCat_l2.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkENSXs5fSp7ImA9WxRaEUU.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-3194163798060421438</id><published>2008-12-13T16:03:00.001+01:00</published><updated>2008-12-13T16:04:58.525+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-13T16:04:58.525+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wget" /><category scheme="http://www.blogger.com/atom/ns#" term="pft" /><title>Piani Forestali e wget</title><content type="html">&lt;p&gt;Visto che per me è ormai diventata ormai una fissazione, mi appunto il comando per scaricare, tutti insieme e in un colpo solo, i &lt;a href="http://www.regione.piemonte.it/montagna/foreste/pianifor/info.htm" target="Regione Piemonte" name="Regione Piemonte, PFT"&gt;Piani Forestali della Regione Piemonte&lt;/a&gt; (tutti i comuni e tutte le aree forestali) &lt;a href="http://www.gnu.org/software/wget/" target="wget home" name="wget_home"&gt;&lt;/a&gt;:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;wget -r -nd -nH --level=3 --accept=zip \&lt;br/&gt;&lt;br /&gt;http://www.regione.piemonte.it/montagna/foreste/pianifor/forestale.htm&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ricordarsi di registrarsi... &lt;strong&gt;prima&lt;/strong&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-3194163798060421438?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/3194163798060421438/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2008/12/piani-forestali-e-wget.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/3194163798060421438?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/3194163798060421438?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2008/12/piani-forestali-e-wget.html" title="Piani Forestali e wget" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU8GQ3k4eip7ImA9WxBXFkw.&quot;"><id>tag:blogger.com,1999:blog-238933228336531532.post-9117407253316957406</id><published>2008-12-13T15:47:00.008+01:00</published><updated>2010-01-27T18:37:02.732+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-27T18:37:02.732+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ogr2ogr" /><category scheme="http://www.blogger.com/atom/ns#" term="traspunto" /><category scheme="http://www.blogger.com/atom/ns#" term="pft" /><title>ogr2ogr, codici epsg e Piani Forestali del Piemonte</title><content type="html">&lt;p&gt;In un precedente &lt;a
href="http://appuntigis.blogspot.com/2008/12/piani-forestali-ogr2ogr-e-conversione.html"&gt;post&lt;/a&gt;
ho usato &lt;em&gt;&lt;a href="http://www.gdal.org/ogr/ogr2ogr.html"
target="ogr2ogr window" title="ogr2ogr manual"&gt;ogr2ogr&lt;/a&gt;&lt;/em&gt; per
convertire gli shapefiles dei Piani Forestali della Regione Piemonte da
&lt;strong&gt;ED50 UTM 32N&lt;/strong&gt; a &lt;strong&gt;WGS84 UTM 32N&lt;/strong&gt;.&lt;br&gt;
Quando si parla di conversione tra datum diversi divento diffidente:
forse a causa della scarsa conoscenza della materia e delle ripetute &lt;i&gt;fregature&lt;/i&gt;
avute in passato...e nel presente!&lt;br&gt;
In ogni caso voglio semplicemente provare ad usare &lt;em&gt;&lt;a
href="http://www.gdal.org/ogr/ogr2ogr.html" target="ogr2ogr window"
title="ogr2ogr manual"&gt;ogr2ogr&lt;/a&gt;&lt;/em&gt; con diversi settaggi, tanto
per chiarirmi le idee.&lt;br&gt;
La sintassi (semplificata) di &lt;a
href="http://www.gdal.org/ogr/ogr2ogr.html" target="ogr2ogr window"
title="ogr2ogr manual"&gt;ogr2ogr&lt;/a&gt; per la conversione tra sistemi di
riferimento diversi (di shapefiles) è la seguente:&lt;br&gt;
&lt;span style="font-family: monospace;"&gt;ogr2ogr -s_srs (descrizione del
sistema di riferimento dell'input)&lt;/span&gt;&lt;code&gt;&lt;span
style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br&gt;
-t_srs (descrizione del sistema di riferimento dell'output)&lt;br&gt;
(nome shapefile di output) (nome shapefile di input)&lt;/code&gt;&lt;/p&gt;
Per quanto riguarda la descrizione del sistema di riferimento
dell'imput (nel mio caso: &lt;strong&gt;ED50 UTM 32N&lt;/strong&gt;) le
possibilità che ho preso in considerazione sono:&lt;br&gt;
&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;una variabile che immagazzina una lunga stringa &lt;strong&gt;&lt;a
href="http://en.wikipedia.org/wiki/Well-known_text" target="wikipedia"
name="wkt -definizione wikipedia" title="wikipedia: definizione wkt"&gt;wkt&lt;/a&gt;&lt;/strong&gt;,
come quella riportata qui: &lt;br&gt;
&lt;p&gt;&lt;code&gt;wkt_ed50='PROJCS["UTM Zone 32, Northern
Hemisphere", GEOGCS["international",&lt;br&gt;
DATUM["European_Datum_1950",&lt;br&gt;
SPHEROID["International_1924",6378388,297],&lt;br&gt;
TOWGS84[-87.000,-98.000,-121.000]],&lt;br&gt;
PRIMEM["Greenwich",0],&lt;br&gt;
UNIT["degree",0.0174532925199433]],&lt;br&gt;
PROJECTION["Transverse_Mercator"],&lt;br&gt;
PARAMETER["latitude_of_origin",0],&lt;br&gt;
PARAMETER["central_meridian",9],&lt;br&gt;
PARAMETER["scale_factor",0.9996],&lt;br&gt;
PARAMETER["false_easting",500000],&lt;br&gt;
PARAMETER["false_northing",0],UNIT["meter",1]]' &lt;/code&gt;&lt;/p&gt;
Per ottenere questo &lt;strong&gt;&lt;a
href="http://en.wikipedia.org/wiki/Well-known_text" target="wikipedia"
name="wkt -definizione wikipedia" title="wikipedia: definizione wkt"&gt;wkt&lt;/a&gt;&lt;/strong&gt;
ho semplicemente creato una Location di GRASSS in ED50 UTM32N e da
shell ho digitato &lt;code&gt;&lt;a
href="http://grass.itc.it/grass64/manuals/html64_user/g.proj.html"
target="g.proj manual" name="g.proj manual"&gt;g.proj -w&lt;/a&gt;&lt;/code&gt;. Lo
stesso risultato potrebbe essere ottenuto da &lt;a
href="http://spatialreference.org/ref/epsg/23032/" target="epsg 23032"
title="epsg 23032 in formato wkt"&gt;qui&lt;/a&gt; (fare attenzione ai
parametri di traslazione &lt;code&gt;TOWGS84...&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;il codice &lt;a href="http://spatialreference.org/ref/epsg/23032/"
target="epsg" name="spatial reference - database codice epsg"
title="epsg database spatialreference.org"&gt;&lt;strong&gt;epsg&lt;/strong&gt;&lt;/a&gt;:&lt;br&gt;
&lt;code&gt;'+init=epsg:23032'&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;il codice &lt;a href="http://spatialreference.org/ref/epsg/23032/"
target="epsg" name="spatial reference - database codice epsg"
title="epsg database spatialreference.org/"&gt;&lt;strong&gt;epsg&lt;/strong&gt;&lt;/a&gt;
(23032) e i parametri di traslazione: &lt;code&gt;&lt;br&gt;
'+init=epsg:23032 +towgs84=-87.000,-98.000,-121.000'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;le stesse informazioni di cui sopra ma in formato &lt;a
href="http://trac.osgeo.org/proj/" target="proj home"
name="proj homepage" title="Proj home page"&gt;&lt;b&gt;proj&lt;/b&gt;&lt;/a&gt;:&lt;br&gt;
&lt;code&gt;'+proj=utm +zone=32 +ellps=intl +units=m
+towgs84=-87.000,-98.000,-121.000'&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
Per quanto riguarda l'output in &lt;strong&gt;WGS84 UTM 32N&lt;/strong&gt; ho
semplicemente settato al codice &lt;a
href="http://spatialreference.org/ref/epsg/32632/" target="epsg 32632"
title="specifiche del codice epsg 32632"&gt;epsg 32632&lt;/a&gt;.
&lt;br&gt;
Ho quindi scritto questo semplice script per testare il tutto su uno
shapefile dei &lt;a
href="http://www.regione.piemonte.it/montagna/foreste/pianifor/info.htm"
target="Regione Piemonte" name="Regione Piemonte, PFT"&gt;Piani Forestali
della Regione Piemonte&lt;/a&gt;:
&lt;code&gt;&lt;br&gt;
&lt;br&gt;
#!/bin/sh
&lt;br&gt;
dir_work="$HOME/pft"
&lt;br&gt;
shpfile="004017"
&lt;br&gt;
suffix="_wkt"
&lt;br&gt;
ogr2ogr -s_srs "$wkt_ed50" \ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -t_srs '+init=epsg:32632' \
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "$dir_work/${shpfile}${suffix}.shp" \ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "$dir_work/${shpfile}.SHP"
suffix="_epsg"
&lt;br&gt;
&lt;br&gt;
ogr2ogr -s_srs '+init=epsg:23032'\&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -t_srs '+init=epsg:32632' \
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "$dir_work/${shpfile}${suffix}.shp" \ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "$dir_work/${shpfile}.SHP"
suffix="_epsgtowg"
&lt;br&gt;
&lt;br&gt;
ogr2ogr -s_srs '+init=epsg:23032 +towgs84=-87.000,-98.000,-121.000' \
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -t_srs '+init=epsg:32632' \ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "$dir_work/${shpfile}${suffix}.shp" \
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "$dir_work/${shpfile}.SHP"
suffix="_defepsg"
&lt;br&gt;
&lt;br&gt;
ogr2ogr -s_srs '+proj=utm +zone=32 +ellps=intl +units=m
+towgs84=-87.000,-98.000,-121.000' \ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -t_srs '+init=epsg:32632' \
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "$dir_work/${shpfile}${suffix}.shp" \ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "$dir_work/${shpfile}.SHP"
suffix="traspunto"
&lt;br&gt;
&lt;br&gt;
wine /usr/local/traspunto/traspunto.exe shp pia pia \&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "${dir_work}/${shpfile}" \&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "${dir_work}/${shpfile}${suffix}" ED50 WGS84
32 32
&lt;/code&gt;
&lt;p&gt;dove nella variabile &lt;code&gt;$wkt_ed50&lt;/code&gt; è contenuto il file wkt
visto sopra.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;Da notare che uso anche &lt;i&gt;traspunto&lt;/i&gt;, disponibile &lt;a
href="http://www.cadlandia.com/showlinksw.asp?CatID=24&amp;amp;parentID=1&amp;amp;subname=GIS&amp;amp;parentname=Free"
target="download traspunto" name="traspunto download"
title="download traspunto"&gt;qui&lt;/a&gt;, con &lt;a
href="http://www.winehq.org/" target="wine home page"&gt;wine&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;Questa è una prova (&lt;em&gt;empirica&lt;/em&gt;) nella quale apprezzo
visivamente i risultati; non ho qui l'interesse di fare alcuna analisi
statistica del tipo: &lt;i&gt;esiste una differenza statistica (e se si,
quale?)nel posizionamento spaziale di una serie di punti trasformati
con traspunto rispetto a ogr2ogr?&lt;/i&gt;&lt;/p&gt;
Una volta eseguito lo script visualizzo il tutto in &lt;a
href="http://openjump.org/wiki/show/HomePage" target="open jump home"&gt;OpenJUMP&lt;/a&gt;
(ma, ovviamente, vanno bene anche &lt;a href="http://www.qgis.org/"
target="qgis home page"&gt;Quantum Gis&lt;/a&gt;, &lt;a
href="http://www.gvsig.gva.es/index.php?id=gvsig&amp;amp;L=2"
target="ghsig home"&gt;gvSIG&lt;/a&gt;, &lt;a href="http://udig.refractions.net/"
target="udig home page" name="udig"&gt;udig&lt;/a&gt;, ecc).
&lt;p&gt;&lt;b&gt;Il primo confronto&lt;/b&gt; interessante è quello tra traspunto (linee
in &lt;font color="#ff0000"&gt;&lt;b&gt;rosso&lt;/b&gt;&lt;/font&gt;) e ogr2ogr con &lt;code&gt;'+init=epsg:23032
+towgs84=-87.000,-98.000,-121.000'&lt;/code&gt; (linee in &lt;font
color="#00ff00"&gt;&lt;b&gt;verde&lt;/b&gt;).&lt;/font&gt;&lt;/p&gt;
Per apprezzare la differenza, nella figura ho settato una griglia di
sfondo con una maglia di 10 metri.
&lt;a
href="http://picasaweb.google.com/lh/photo/9wVz4E5TqoYrunIUEEDh2Q?authkey=ZTkOYLk_GNc"&gt;&lt;img
src="http://lh3.ggpht.com/_87lofqKSw4A/SUOk-0aYXlI/AAAAAAAAAG0/vyQPjvOrEck/s400/traspunto_Vs_epsgtowgs84.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;p&gt;&lt;b&gt;Il secondo confronto&lt;/b&gt; riguarda i due settagggi di ogr2ogr: il
primo con il solo codice epsg (in &lt;font color="#0000ff"&gt;&lt;b&gt;blu&lt;/b&gt;&lt;/font&gt;)
(&lt;code&gt;-s_srs '+init=epsg:23032'&lt;/code&gt;); il secondo (in &lt;font
color="#00ff00"&gt;&lt;b&gt;verde&lt;/b&gt;&lt;/font&gt;) con il codice e i parametri di
traslazione (&lt;code&gt;'+init=epsg:23032 +towgs84=-87.000,-98.000,-121.000'&lt;/code&gt;).
Ho mantenuto la griglia a 10 m.&lt;/p&gt;
&lt;br&gt;
&lt;a
href="http://picasaweb.google.com/lh/photo/m50cI2QkErFmXjwgLU3fgw?authkey=ZTkOYLk_GNc"&gt;&lt;img
src="http://lh6.ggpht.com/_87lofqKSw4A/SUOk-xs3arI/AAAAAAAAAGs/tLDn_DM-_HQ/s400/epsg_Vs_epsgtowgs84.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;p&gt;Com'era prevedibile non esistono differenze tra il risultato della
conversione effettuata con il wkt, con &lt;code&gt;'+init=epsg:23032
+towgs84=-87.000,-98.000,-121.000'&lt;/code&gt; e con &lt;br&gt;
&lt;code&gt;-s_srs '+proj=utm +zone=32 +ellps=intl +units=m
+towgs84=-87.000,-98.000,-121.000'&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Conclusioni&lt;/h2&gt;
Una prova rigorosa su modalità diverse di conversione può solo
essere condotta con una serie di punti dei quali si conoscono a priori
con esattezza le coordinate nei diversi sistemi di interesse. &lt;br&gt;
Questa è una semplice prova per fissare alcune cose:
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;non fermarsi al codice epsg: cercare, se vi sono, i parametri di
rototraslazione relativi alla zona di interesse;&lt;/li&gt;
&lt;li&gt;nella definizione di una nuova Location porsi il problema di
settare i parametri di rototraslazione (vedere &lt;a
href="http://grass.itc.it/grass64/manuals/html64_user/g.proj.html"
target="grass g.proj" name="grass manual g.proj"&gt;g.proj&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;l'uso di &lt;i&gt;traspunto&lt;/i&gt; può essere un'alternativa;&lt;/li&gt;
&lt;li&gt;l'uso del software &lt;a href="http://87.30.244.175/download.php"
target="vertogis download" name="vertogis"&gt;Verto&lt;/a&gt; unitamente ai
grigliati (in vendita presso &lt;a href="http://www.igmi.org/"
target="igm hoe page" name="igm_home"&gt;l'Istituto Geografico Militare&lt;/a&gt;
) &lt;i&gt;&lt;strong&gt;potrebbe&lt;/strong&gt; costituire la migliore tra le
alternative (?) &lt;/i&gt;... &lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/238933228336531532-9117407253316957406?l=appuntigis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://appuntigis.blogspot.com/feeds/9117407253316957406/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://appuntigis.blogspot.com/2008/12/in-un-precedente-post-ho-usato-ogr2ogr.html#comment-form" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/9117407253316957406?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/238933228336531532/posts/default/9117407253316957406?v=2" /><link rel="alternate" type="text/html" href="http://appuntigis.blogspot.com/2008/12/in-un-precedente-post-ho-usato-ogr2ogr.html" title="ogr2ogr, codici epsg e Piani Forestali del Piemonte" /><author><name>pcgis</name><uri>http://www.blogger.com/profile/09670190994377517446</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_87lofqKSw4A/SUOk-0aYXlI/AAAAAAAAAG0/vyQPjvOrEck/s72-c/traspunto_Vs_epsgtowgs84.jpeg" height="72" width="72" /><thr:total>0</thr:total></entry></feed>

