spatialite cookbook ita

180

Upload: diego-fernandot-martinez-cuenca

Post on 26-Nov-2015

130 views

Category:

Documents


9 download

TRANSCRIPT

  • SpatiaLite CookbookAutore: Alessandro Furieri

    Autore: Alessandro Furieri a.furieri @ lqt.it Questo lavoro sotto licenza Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) della licenza.

    garantito il permesso di copiare, distribuire e / o modificare questo documento sotto i termini dellaGNU Free Documentation License , Versione 1.3 o ogni versione successiva pubblicata dalla Free Software Foundation;senza alcuna sezione non modificabile, senza testo di copertina e senza testo di quarta di copertina.

    FilippoTextBoxFebbraio 2011

  • utilizzare SpatiaLiteunaguidasempliceeveloceperprincipianti

    Introduzione / Sommario

    Dichiarazionediprincipio: in Informatica ci sono dueparolesfortunate: database e SQL .Entrambi i termini condividono una lungaeprofondamenteconsolidata cattivareputazione, lasemplicepronunciadeiloronomicauserreazionifortementenegative:"troppo complicato", "Non sar mai in grado di capire tutto questo", "stranezze nerd (robe da informatici schizzati di testa)" e cos via ... ...

    Se tutto questo indiscutibilmente vero per ilsempliceSQL, che dire del pi esotico Spatial SQL ?Ovviamente, questo suona di gran lunga molto pi complesso e intimidatorio:si tratta di roba complicatissima esclusivamente per ultraspecialisti, che solo pochissimi possono confrontarsi con Spatial SQL, non cosi?

    Dimenticatuttoquesto,edaprilatuamente!(Stavoquasiscrivendo: Cazzate! manoncredochel'usoditerminivolgaricontrassegnipositivamente l'inizio di un lavoro...)

    Suppongo che tutti i pregiudizi sono semplicemente la triste conseguenza delle politiche di marketing a lungo praticate. Per molti anni il mercato dei DB stato dominato da soluzioni proprietarie esageratamente costose:e loSpatilaDBcostituisce soltanto un ristretto segmento specializzato (ancora pi esageratamente costoso)all'interno del mercato generaledei DB.Cos il clima di aura sacrale volutamente indimitatorio che circonda le tecnologie DB stato molto pi un una abusata storia di copertura per giustificare prezzi anormalmente elevati piuttosto che a un fatto tecnico oggettivo. Fortunatamente la verit reale molto diversa: qualsiasipersonaconunanormalepreparazioneinformatica pu facilmenteimparareedusareconsuccessosial'SQLcheloSpatilaSQL:nonc'nulladidifficile,oscuroocomplicatonell'usarli. E quando dico gente professionista non intendo necessariamente sviluppatori , ingegneri informatici o professionisti GIS :Personalmente sono ben consapevole che molti ecologi, ingegneri del traffico, botanici, ingegneri ambientali, zoologi , funzionari della pubblica amministrazione , geologi , geografi , archeologi (e molti altri) possono usare con successo Spatial SQL nelle loro attivit quotidiane. Oravoipotetedisporre,nelmodopifacileesenzafatica,diun sofisticato,allineatoagli standardedefficaceSpatialDBassolutamentelibero.Enontutto:SpatiaLitefortementeintegratonell'ecosistemadelsoftwarelibero.Inoltrepoteteconnetterviimmediatamentea unoSpatialDBades.usandoQGis(unafamosaediffusaapplicazione Gispercomputer).

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

  • Non credete alle mie affermazioni? Beh, provate da soli: toccate con mano e vedete con i vostri occhi.Cosa potrebbe essere migliore di questo approccio per ottenere una prima esperienza neutrale, obiettiva e imparziale? Seguirequestaguidarichiedercircaun'oraoduedelvostropreziosotempo:nonuncompitotroppoimpegnativoevoinonsietechiamatiasforzieccezionalmentecomplessi.Spatialiteassolutamentelibero(neldoppiosignificato:free as a free beer and it's free as a free speech)cospotetedareunosguardoveloceallepiaggiornatetecnologiediSpatialSQLnel modo pi facile e senza fatica, efficace ed allineato agli standard.Edunavoltacheavretelavostraopinionesullabasediesperienzadiretta,potretedecideredasoliseloSpatialDBpuessereutile(inunmodoonell'altro)nellavostraattivitquotidiana.

    Lastrutturadiquestaguida:pensateaqualchelibrodicucina.Daprimaviaspettatesemplicementediapprenderequalchepiccolaesempliceconoscenzacirca:pentoleestrumentidicucina:pentole, ciotole, fruste, coltelli, cucchiai, frullini .....ingredientipicomuni:uova, pesci, farina, verdure, spezie, frutta di stagione ....tecnicheelementaridicucina:bollito, griglia, arrosti, fritture, zuppe ....Unavoltacheaveteappresoquestebasilarinozionisieteprontiamisurarviconsemplicimanutrientiegustosipiatti:potetechiamarequestolivellocucina famigliare.Permoltepersonequestolosforzomassimo:sufficienteperloro,edabbandonerannoaquestopunto. Mamoltialtriscoprirannochedopotuttocucinarepiacevoleeveramenteinteressante:questisicuramenterichiederannoqualcosadimoltopiimpegnativo.Ognibuonlibrodicucinasichiuderpresentandoqualchecomplicatopiattodialta cucina. Pudarsichenessunodivoidiventermaiunochef, macertamentevidivertireteesareteorgogliosidellavostraabilitculinaria.

    SpatiaLite Cookbook

  • 1Strumentietecnicheculinarie1.1 Breveintroduzionetecnica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pg 71.2 Periniziare(installazionedelsoftware). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.1Scaricarel'applicazione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.2Scaricareil setdaticampionen.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.3Scaricareil setdaticampionen.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.4Lanciamospatialite_gui. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.3 Costruire il tuo primo Spatial Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.4 A proposito di ESRI Shapefilee Tabelle Virtuali. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.4.1Cos'unoShapefile?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.4.2 Checosa unoShapefilevirtuale?(etabellevirtuali.....). . . . . . . . . . . . . . . . . . . . . 161.5 A proposito di codifiche Charset?(e perch diavolo devo prendermi cura di queste cose....). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.6 CosasonoquestiSRID?..nonhomaisentitoquestotermineprimad'ora... . . . . . . . . . . . 18 1.6.1Tentativodinormalizzareilcaos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.7 EseguiamoleprimeinterrogazioniSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.8 IprimirudimentisulleinterrogazioniSQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271.9 Comprenderelefunzionidiaggregazione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312Ingredientidiusocomune2.1 Lavostraprimainterrogazionespaziale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.2 Ancorasulleinterrogazionispaziali:WKTeWKB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.2.1AvvertenzeWKTandWKT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362.3 LetabelleMetaDataspaziali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.4 VisualizzareunlayerSpatiaLiteinQGis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433Cucinafamigliare3.1 Ricetta #1:CreareunDBbenfatto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.2 Ricetta #2:LevostreprimeinterrogazioniJOIN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .513.3 Ricetta # 3: Maggiori informazioni su JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.4 Ricetta # 4: ApropositodiVIEW. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583.5 Ricetta # 5: Creazione di una nuova tabella (con annessi e connessi). . . . . . . . . . . . . . . . 613.6 Ricetta # 6: CreareunanuovacolonnaGEOMETRY. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.6.1SRIDdisponibili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.6.2TipiGeometrydisponibili. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.6.3ModelliDimensionalidisponibili. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663.7 Ricetta # 7: Inserire,aggiornareecancellare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693.8 Ricetta # 8: Conoscereivincoli. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733.9 Ricetta # 9: ACIDity:conoscereletransazioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783.10Ricetta # 10: Labellezzadell'indiceR*Treespaziale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    SpatiaLiteCookbook Indicegenerale

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

  • 4Altacucina4.1 Ricetta # 11:IlGuinessdeiprimati. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.2 Ricetta # 12:Dintorni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974.3 Ricetta # 13:Leisole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024.4 Ricetta # 14:Centri abitati e Comuni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1044.5 Ricetta # 15:Centri abitati strettamente adiacenti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1074.6 Ricetta # 16:FerroviaeComuni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1094.7 Ricetta # 17:Ferrovieecentri abitati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1014.8 Recitta # 18: Zone ferroviarie come Buffers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174.9 Ricetta # 19: Unione [Merging] dei Comuni in Province e cos via ... . . . . . . . . . . . . . . . 1204.10Ricetta # 20:vistespaziali (Spatial Views). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1254.11Unaraffinataesperienzaculinaria:daDijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1295Dolci,liquori,theecaff5.1 Suggerimentisullivellodiprestazionidelsistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355.2 Importare/esportareShapefile(DBF,TXT,...). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1385.3 Linguaggidicollegamento(C/C++,Java,Python,PHP...) . . . . . . . . . . . . . . . . . . . . . . 149 5.3.1 C / C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 5.3.2 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 5.3.3 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 5.3.4 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    SpatiaLite Cookbook

  • Strumentietecnicheculinarie

    SpatiaLite Cookbook

    FilippoText BoxBreveintroduzionetecnicaPeriniziare(installazionedelsoftware)CostruiteilvostroprimoSpatialDataBaseSugliESRIShapefileseVirtualTablesChecos'unacodificadicaratteri?CosasonoquestiSRID?EseguiamoleprimeinterrogazioniSQLIprimirudimentisulleinterrogazioniSQLComprenderelefunzionidiaggregazione

    FilippoTextBoxFebbraio 2011

  • Breveintroduzionetecnica:interminitecniciSpatiaLiteunoSpatial DBMSchesupportastandardsinternazionaliqualiSQL92eOGC-SFS.Suppongochetuttigliacronimiprecedentisuonerannounposcurie(forse)vidisturberanno.Nonpreoccupatevi:moltospessooscurigerghitecnicinascondonoconcettiveramentefacilidaimparare:unDBMS(Data Base Management System)unsoftwareprogettatopermemorizzareericercaredati genericinelmodopiefficienteegeneralepossibile.Ed assai spesso si tratta di moli di dativeramente enormi.SQL(Structured Query Language)unlinguaggiostrutturatoadattoamanipolareiDB attraverso comandiSQLpotetedeciderecomeorganizzareivostridati.Epoteteinserire,cancellaree modificarei vostridatinelDB.Ovviamentepoteteinterrogareivostridatiinmodomoltoflessibile(edefficiente).OGC-SFS.(Open Geospatial Consortium Simple Feature Specification)consentediestenderele potenzialitDBMS/SQLpergestirespecialitipididatiGeometry,consentendodidisporrediuno SpatialDB.SpatiaLitesiappoggiaefaampiousodelfamosoSQLite,unDBMSleggero.Essiagisconoincoppia:SQLiteimplementaunmotoreSQL92,mentreSpatiaLiteimplementailnucleodellostandardOGCSFS.UsandolicombinatiinsiemesiavruncompletoSpatialDB. SQLite/SpatiaLitenonsibasanosullaarchitetturamoltodiffusaclient-server,essiadottanounapisemplicepersonal architecture.Ciol'interomotoreSQLincorporatoall'internodell'applicazione.Questaarchitetturasempliceepocosofisticatasemplificanotevolmenteognicompitorelativoallagestionedeldatabase:potetesemplicementeaprire(ocreare)undatabase-fileesattamentenellostessomodoincuisiete abituatiadaprireundocumentoditestoounfoglioelettronico.Nonc'assolutamentenessunacomplessitaggiuntivainquesteattivit.UnDatabasecompleto(magariunocontenentediversimilionididati)semplicemeneteunfileordinario.Lopoteteliberamentecopiare(oanchecancellare)avostropiaceresenzanessunproblema. Enontutto:queldatabasefileadottaun'architetturauniversalecospotetetrasferirel'intero databasefiledauncomputerall'altrosenzaspecialiaccorgimenti.Icomputerdiprovenienzaedidestinazionepossonoospitareanchesistemioperativicompletamenti differenti:questononhaalcuneffetto,perchidatabasefilessonoportabilisuarchitetturediverse. Chiaramentetuttaquestasempliciteleggerezzahauncosto:ilsupportodiSQLite/SpatiaLiteall'accessoconcorrente (pi accessi contemporanei)piuttostorudimentaleepovero.Questol'esattosignificatodipersonal DB:ilparadigmasottintesosingolo utente/singola applicazione/stazione di lavoro isolata.

    7

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxBreveintroduzionetecnica

  • Qualchealtroriferimentoutile:

    SQLite homeSpatiaLite homeSQL inteso da SQLite (riferimento tecnico)SpatiaLite manuale (versione obsoleta, ma ancor oggi di utile lettura)Old SpatiaLite Tutorial (versione obsoleta, ma ancor oggi di utile lettura)

    Seilsupportoadaccessiconcorrentiilvostroproblemaprincipale,alloraSQLite/SpatiaLitenonlasceltamiglioreperlevostrenecessit:unpicomplessoDBMSclientserverfortementeconsigliato.InognicasoSQLite/SpatiaLitemoltosimileaPostgreSQL/PostGis(uno spatial dbms molto potente eopensource):cospoteteliberamentepassaredaunoall'altro(in modo relativamente indolore)asecondadellevostrerealiesigenze,scegliendoognivoltailmigliorstrumentodausare.

    8

    SpatiaLite Cookbook

  • Questononunmanualediteoria:questounaguidapraticaperprincipiantitotali.L' assuntosottostantechevoiignoriatetuttorispettoaDBMS,SQLedancheGIS.QuindicominceremoascaricarealcunerisorsedalWebedinizieremoimmediatamentelasessionedilavoro:

    primoscaricheremoilsoftwarespatialitegui:questounsemplicema potentestrumento(supportalagrafica,ilmouseecosvia...)cheviconsentediinteragireconundatabaseSpatiaLitepoiscaricheremoqualcheinsiemedidati,disponibilialpubblico,necessari percostruireilDBdausarenelcorsodegliesercizi.Scarica l'applicazione

    Avviare il browser Web e accedere alla home SpatiaLite: http://www.gaia-gis.it/spatialite La versione attuale (gennaio 2011) v.2.4.0-RC4, e si pu ottenere file binari eseguibili da: http://www.gaia-gis.it/spatialite-2.4.0-4/binaries.html Comeovviol'organizzazionedelsitodeidownloadcambiaditantointanto,cosgliindirizziprecedentipossonodiventarefacilmenteobsoleti.PusuccederepergliutentiLinuxdidovercompilareibinaridirettamente daisorgenti:intalecasoleggeteattentamentelenotedirilascioprimadiiniziare.

    Scarica il set dati campione n. 1Ilprimoinsiemedidaticheuseremoilcensimentoitaliano2001,cortesementefornitodall' ISTAT( l' entestatisticoitaliano).Punta il tuo browser web su http://www.istat.it/ambiente/cartografia/ e quindi scaricare i seguenti file:

    Censimento 2001 - Regioni ( Regions ):http://www.istat.it/ambiente/cartografia/regioni2001.zipCensimento 2001 - Province ( Counties ):http://www.istat.it/ambiente/cartografia/province2001.zipCensimento 2001 - Comuni ( Local Councils ):http://www.istat.it/ambiente/cartografia/comuni2001.zip

    Scarica il set di dati campione n. 2 IlsecondoinsiemedidatinecessarioGeoNames,unacollezionemondialediCentri Abitati (Populated Places).Cisonodiverseversionidiquestidati:noiuseremocities1000(ogni luogo nel mondo con pi di 1000 persone): http://download.geonames.org/export/dump/cities1000.zip

    9

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxPer iniziare(Installazione del software)

  • Lanciamospatialite_guiIl spatialite_gui non richiede alcuna installazione: sufficiente decomprimere l'immagine compressa che avete appena scaricato e fare clic sull'icona di lancio. Questo tutto.

    10

    SpatiaLite Cookbook

  • Bene,aveteappenaavviatolavostraprimasessionedilavoroconSpatiaLite:comepotetenotare,nonc'nessunDBalmomentoconnesso.

    11

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxCostruire il tuo primo Spatial Database

  • coscreereteeviconnetteretealnuovoDB:dovetesemplicemente premereilcorrispondentebottonedallabarradeglistrumenti(apparirunafinestradidialogoper l'aperturadifiles)edefiniteunnomeper ilfile. Solo per l'uniformit, si prega di chiamare questo DB come Italy.sqlite

    Comepotetenotare,subitodopolacreazioneilDBcontienegiparecchietabelle:sonotuttetabelledisistema(diciamometatabelle),ciotabellenecessarieagarantirel' amministrazioneinterna.Almomento,lamigliorsceltadafaresemplicementeignorarledeltutto(sietedeiprincipianti,no?siatepazienti,perfavore).Inognicaso,orasieteconnessiadunDBvalido,cospoteteoracaricareilprimo

    insiemedidati:premeteilbottoneVirtualShapefilenellabarradeglistrumenti,equindiselezionateilfile com2001_s.

    12

    SpatiaLite Cookbook

  • Apparirunafinestradidialogo:selezionateperfavoreesattamenteilsettaggioevidenziatosopraeconfermate. Esamineremotuttoquestoinmaggiordettagliosuccessivamente: perorafidatevidellamiaautorit,copiatediligentementeivalorisuggeritisenzacercaredicapire:sonodeivalorimagiciperoraedtutto. Unavoltacaricatol' insieme com2001_spotetecontinuare(usandosemprelostessosettaggio)ecaricareentrambiifilesprov2001_sereg2001_s.

    13

    SpatiaLite Cookbook

  • Ilvostrodatabasedovrebbeassomigliareaquesto:usandolavistaadalberoallasinistradelvideo davverofacileesaminareletabelle(elecolonneinognitabella).

    OrasieteprontipercompletarelamessaapuntoinzialedelDB:premeteilbottoneVirtualCSV/TXTedellabarradeglistrumenti,eselezionateilfile cities1000.txt.

    14

    SpatiaLite Cookbook

  • Apparirunafinestradidialogo:selezionateperfavoreesattamenteisettaggivisualizzatisopraeconfermate.Questafinestradidialogoassomigliamoltoaquellacheavetegiusatoperconnettervia VirtualShapefiles,manonidentica.Ancheinquestocasoesamineremopitardiidettaglirelativi.Bene:adessoavetetreinsiemididatiprontidainterrogare:matempodispiegaremegliocosastiamoperfare.

    15

    SpatiaLite Cookbook

  • Cos'unoShapefile? Shapefileunsemplice,elementareformatodifileGIS(datigeografici)inventatomoltianniorsonodaESRI:benchinizialmentenatoinunambienteproprietario, questoformatostatosuccessivamenteresopubblicoecompletamentedocumentato,cospraticamentequasiunformatostandard aperto. E'piuttostovecchioadesso,mauniversalmentesupportato.CosrappresentalalinguafrancacheogniapplicazioneGISsicuramenteconosce:enondevesorprendere,SHPlargamenteusatoperscambioneutraledidatifrapiattaformediverse. Ilnomestessoabbastanza fuorviante:dopotutto,Shapefilenonunsemplicefile.Almeno3filesdistintisononecessari(identificatidaisuffissi.shp.shx.dbf):seancheunsolofilemanca(malnominato / spostato / corrotto / qualcos' altro),l'intero set corrottoedinusabile.Qualche ulterioreutileriferimento:

    http://en.wikipedia.org/wiki/Shapefile (semplice introduzione)

    http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf (riferimentitecnici)

    Che cosa un shapefile virtuale (e tabelle virtuali)? SpatiaLite supportaundriverVirtualShapefile:ciohalacapacitdiconsentireaccessiSQL(inmodalitdisolalettura)perunShapefileesterno,senzabisognodicaricarealcundatonelDBstesso.Questodavveroutileduranteipassipreliminariallacostruzionedeldatabase(comenelnostrocaso).SQLite/SpatiaLitegestisceparecchialtridriverVirtualcomeilVirtualCSV/TXT,ilVirtualDBFecosvia...Comunque,attenti:leTabelleVirtualsoffronodiparecchielimitazioni(esonospessomoltopilentedeidatimemorizzatiall' internodelDB),pertantononsonoda prendere in cosiderazioneperlavoridiproduzione seri.

    16

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxA proposito di ESRIShapefileeTabelle Virtuali

  • checos'unacodificadicaratteri?(eperchdiavolodevoprendermicuradiquestecose...) Dettomoltosemplicemente:ognicomputerinrealtunastupida macchinabasatasuunmucchiodisordinatodisilicio:possiedequalchecapacitdicapiresemplicioperazioniaritmeticheebooleane,maassolutamenteincapacedipadroneggiareiltesto.Poteteaverememorizzatodaqualchepartedelvostrocervellol' errataconvinzionecheuncomputerpossarealmentetrattaredeltesto,maquestononesattamentevero.Peresserepiprecisi,piuttostoungiocodiprestigiofinalizzataad ingannare te, stupido essere umano, che ti fidi dei tuoi sensi limitati:ognicomputermanipolasemplicementecifre,leunitperiferiche(video,tastiera,stampante..)sonoespressamenteprogettateperdarvil'(illusoria)impressionecheilvostroPCconoscaeffettivamenteiltesto.Tuttoquestounprocessoassolutamenteconvenzionale: voiedilvostroPCdoveteessered' accordo suqualetabelladicorrispondenzadebbaessere utilizzatapertrasformareoscuresequenzedigitaliinparoleleggibili. Interminitecnici,questaconvenzionaletabelladicorrispondenzanotacomeCharsetEncoding.QuantialfabetidifferentisonousatisullaTerra?centinaiaecentinaia...Latino,Greco,Cirillico,Ebraico,Arabo,Cinese,Giapponeseemolti altri...edinconformitaquesto,centinaiaecentinaiadiCharsetEncodingsdiversisonostatidefinitiduranteglianni(voisapete:l'industriaelettronica/informaticafondatasuunaincontrollataproliferazionedistandardincongruenti).SQLite/SpatiaLiteinternamenteusasemprelacodificaUTF8, cheuniversale(ciopotetesalvareconsicurezzaqualsiasialfabetoconosciutonellostessoDBnellostessomomento):sfortunatamente,Shapefiles(emoltialtriinsiemididati,comeifilesSVC/TXT)non utilizzano la codifica UTF8(essiusanoinvecealcunecodifichenazionali),cossieteobbligatiascegliereesplicitamenteilCharsetencodingdausarequandodoveteimportare(oesportare)qualsiasidato.Sonodispiaciuto diquestasituazione,ma purtroppo questa la dura realt dei fatti.Comunque,consideriamotuttoquestononcomeunagrandecomplicazione,macomeunagranderisorsa:inquestomodosaretecapacidiimportare/esportarecorrettamentequalsiasi datasetda qualsiasiesoticopaesenonlatinoprovenga,comeIsraele,Giappone,Vietnam,GreciaoRussia.Edopotutto, essereingradodivisualizzarestringheditestodimoltialfabeti(comequelloseguente)pufardiventareivostriamiciverdidall'invidia:Roma,,,...Alcuniutiliriferimentiulteriori:

    http://en.wikipedia.org/wiki/Character_encoding (semplice introduzione)http://www.gnu.org/software/libiconv/ (riferimento tecnico)

    17

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxA proposito di codificheCharset

  • Cosasonoquesti SRID? ... Non ho mai sentito questo termine prima d'ora ...IlpianetaTerraunasfera...nonesattamente,ilpianetaTerrahaunaformaellissoidica(leggermenteschiacciataaipoli)...ohno,tuttosbagliato:ilpianetaTerranonhaunaformageometricaregolare,inrealtsitrattadiungeoide.Tutteleaffermazioniprecedentipossonoessereassuntepervere,maadifferentilivellidiapprossimazione.Vicinoall' Equatoreledifferenzefralasferael' ellissoidesonopiuttostopiccoleequasinonsivedonomavicinoaiPolitalidifferenzediventanopigrandiecomincianoafarsisentire.Permoltenecessitpraticheledifferenzefraunellissoideedungeoidesonomoltopiccole:maperlanavigazionediunaereomobilealargoraggio(opeggio,perilposizionamentodeisatelliti), questotroppogrossolanoedoffreunaapprossimazioneinaccettabile.

    18

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxCosasonoquestiSRID?...nonhomaisentitoquestotermineprimad'ora...

  • Inognicaso,qualsiasisialaveraformadellaTerra,laposizionediognipuntodellasuperficiedelpianetapuesseredeterminataprecisamentemisurandodueangoli:longitudineelatitudine.PerdefinireunSistemadiRiferimentoSpazialecompleto[SpatialReferenceSystem,akaSRS]usiamoiPoliel'Equatore(chedopotuttosonoluoghinotevoliperlelorointrinsecheproprietastronomiche):scegliereunMeridianodiriferimento[Meridiano Fondamentale]d'altraparteassolutamenteconvenzionale:madamoltisecoli(Britanniarulethewaves...)adottareilMeridianodiGreenwichunasceltaovvia.OgniSRSbasatosucoordinatelonglatnotocomeSistemaGeografico[GeographicSystem].UsareunSistemaGeograficovigarantiscesicuramentelamassimaprecisioneedaccuratezza:masfortunatamentequestocomportafatalmentealcuniindesiderabilieffetticollaterali:ifoglidicarta(eglischermideivideo)sonoassolutamentepiattiessinonassomiglianopernullaaduna sferal'usodegliangolirendelamisuradelledistanzeedelleareemoltodifficileepocointuitiva.Percidamoltisecoliicartografihannoinventatoparecchisistemi(convenzionali)che permettonodirappresentaresuperficisferichesuunapiano:nessunodiloroilmiglioreinassoluto.Tuttiintroduconoqualchegradodiapprossimazioneedideformazione:lasceltadell'unoodell'altro implicaunpercorsoassolutamentearbitrarioeconvenzionale:unaproiezionecartograficaadattaa rappresentarepiccoleporzionidellaTerrapufacilmenteessereinadattaarappresentareterritorimolto vasti, e viceversa.CiaddentriamoadesaminaresubitolaproiezionecartograficaUTM [UniversalTransverseMercator],semplicementeperchlargamenteusata.

    19

    SpatiaLite Cookbook

  • Sembrachequestaproiezioneintroducagraviedinaccettabilidistorsioni:maseprestateattenzionealfusocentrale,viaccorgereteimmediatamentecheUTMpermettediavereunaquasiperfettaproiezionepianadieccellentequalit.In ognicasoquestohauncertoprezzo:ilfusocentraledeveesseremoltostretto(diciamo,deveestendersiperpochigradidaognilato).Appenailfusodiventapilargo,ledistorsionidiventanomoltopigrandiedevidenti.

    Pertutteleconsiderazioniprecedenti,ilsistemaUTMdefinisce60zonestandard,ognunaestesaper6gradiesattidilongitudine.L'accorpamentodiduefusiadiacenti(12gradi)ovviamenteriducel'accuratezza,marimaneaccettabilepermoltenecessitpratiche:andare oltrequesti limitiproducerisultatidavverocattivi,edeveessereassolutamenteevitata. TentativodinormalizzareilcaosDurantegliultimiduesecoliogniStatoNazionalehaintrodottoalmenoun(emoltospesso,pidiuno)sistemadiproiezionecartograficaerelativoSRS:ilrisultatocomplessivoassolutamentecaotico(edavverodifficiledagestire).Fortunatamente,unostandardinternazionalelargamenteusatoperrenderepiagevolelagestionedeiSistemidiRiferimentoSpaiale:laEuropeanPetroleumSurveyGroup[EPSG]mantieneungrandearchiviomondialedioltre3,700vocidiverse.Moltidiquestisonooggiobsoleti,egiocanosemplicementeunruolostorico moltialtrisonoutilisoloentropiccoliconfininazionali.Comunque,questaunastraordinariaraccolta.Edognisingolainformazionedell' archivioEPSGunivocamenteidentificatadalsuocodicenumericoIDedaunnomedescrittivo,cosdaevitareognipossibileconfusioneeambiguit.OgniSpatialDBMSrichiedequalchecodiceSRIDspecificatoperogniGeometry:maquestocodiceSRIDsemplicementeilRiferimentoSpaziale [SpatialReferenceID],e(fortunatamente)coincideconilcorrispondenteEPSGID.ProprioperfacilitarviacapiremeglioquestocaosdegliSRID,questaunalistaquasicompletadiSRIDspessousatiinuna(piccola)Nazionecomel'Italia:

    20

    SpatiaLite Cookbook

  • EPSG SRID Nome Note4326 WGS 84 Geografico [ lung at ]; mondiale usatodaglistrumentiGPS30033004

    Monte Mario / Italia zona 1Monte Mario / Italia zona 2 obsoleto (1940), ma ancora comunementeusato

    2303223033

    ED50 / UTM zone 32NED50 / UTM zone 33N superato e raramente utilizzato: European Datum 1950

    3263232633

    WGS 84 / UTM zone 32NWGS 84 / UTM zone 33N WGS84, adotta la proiezione piana UTM

    2583225833

    ETRS89 / UTM zone 32NETRS89 / UTM zone 33N evoluzione di WGS84: standard ufficiali dell'UE

    E gli esempi che seguono possono aiutare a comprendere ancora meglio:

    Citt SRIDCoordinate

    X (longitudine) Y (latitudine)

    Roma

    4326 12.483900 41.894740

    3003 1789036.071860 4644043.280244

    23032 789036.071860 4644043.280244

    32632 789022.867800 4643960.982152

    35832 789022.867802 4643960.982036

    Milano

    4326 9.189510 45.464270

    3003 1514815.861095 5034638.873050

    23032 514815.861095 5034638.873050

    32632 514815.171223 5034544.482565

    35832 514815.171223 5034544.482445

    Come si pu facilmente notare:

    lecoordinateWGS84[4326]sonoespresseingradidecimali,perchquestoun SistemaGeografico basato direttamentesuangolilonglat.inveceognialtrosistemaadottacoordinateespresseinmetri:sonotuttiproiettati,ciosistemipiani.ivaloriYsiassomiglianointuttiisistemipianiSRS: nonc' dastupirsi,perchquestovalore rappresentasemplicementeladistanzadall' Equatore.ivaloriXsonomoltodiversiperchidiversiSRSadottanoorigini(falseeasting)dicomodo:cioessicollocanoilloroMeridianodiriferimento[PrimeMeridian]indifferentiposti (convenzionali).comunque,ogniSRSbasatosuUTMdvaloristrettamentecollegati,perchtutticondividonolo stesso fusoUTMzona32.le(piccole)differenzechepotetenotarefradiversiSRSbasatisuUTMpossonoesserefacilmentespiegate: ilfusoUTMzona32semprelostesso,mal' ellissoidesottostantecambiaognivolta.Ottenereunamisuraprecisapergliassidell'ellissoidenonuncompitofacile:e,ovviamente,nelcorsodeltempo,diversi,sempremiglioriepiaccuratestimesonostate progressivamenteadottate.

    21

    SpatiaLite Cookbook

  • Distanza tra intercurringRoma e Milano

    SRID Calcolato Distanza

    4326 4.857422

    3003 477243.796305

    23032 477243.796305

    32632 477226.708868

    35832 477226.708866

    Great Circle 477109.583358

    Geodetico 477245.299993Edorapossiamovederecomel' usodeidiversiSRSinfluenzaledistanze:

    lecoordinatelonglatdelsistemageografico WGS84[4326]darannounamisuraingradidecimali[non cosi utile, davvero ...]tuttiglialtridannounamisuradelladistanzaespressainmetri: comunque,comepotetevedere,i numeri nonsonoesattamente gli stessi.conilsistemaGreatCircleledistanzesonocalcolateassumendochelaTerrasiaesattamenteunasfera: equestaovviamentelastimapeggiorechepossiamoavere.d' altrocantoledistanzenelsistemaGeodesicsonocalcolatedirettamentesull'Ellissoidedi riferimento.

    Conclusioni:Noncisonomisureesatte.Maquestononpernientesorprendentenellescienzefisicheenaturali:ognivaloremisuratointrinsecamenteaffettodaerroriedapprossimazioni. Edogni valorecalcolatosarinesorabilmenteaffettodaerroridiarrotondamentoetroncamento.Cosnumeriassolutamenteesattisemplicementenonesistononelmondoreale:doveteesserecoscientichepotetedisporresoltantodivaloripiomenoapprossimati.Maalmeno,poteteassicurarvidiridurretaliapprossimazioninelmigliormodopossibile.

    22

    SpatiaLite Cookbook

  • SpatiaLite Cookbook

    23

    FilippoTextBoxFebbraio 2011

    FilippoText BoxEseguiamoleprimeinterrogazioni SQL

  • SpatiaLite Cookbook

    24

    FilippoTextBoxPotete seguire due diverse metodologie per interrogare una tabella DB: 1. potete usare la voce di menu Query Table [Interrogare la tabella] (a) questa sicuramente la strada pi facile e veloce, del tutto amichevole (b) dovete semplicemente premere con il bottone destro del mouse sopra la tabella voluta, cos apparir un menu contestuale. (c) potete semplicemenete usare il bottone pi in basso per scorrere i risultati su e gi a vostro piacimento (d) comunque questo metodo piuttosto meccanico, e non vi consentir di sfruttare SQL al meglio delle sue possibilit. 2. in alternativa potete scrivere a mano qualsiasi comando SQL nel riquadro superiore, e quindi premere il bottone Execute (a) questo il metodo pi difficile: voi siete responsabili di quello che state facendo (anche sbagliando...) (b) ma in questo modo potete avvantaggiarvi della impressionante potenza di fuoco di SQL.

  • SELECTCOL002ASname,COL006ASlongitude,COL005ASlatitude,MakePoint(COL006,COL005,4326)ASgeomFROMcities1000WHERECOL009='IT'

    SpatiaLite Cookbook

    25

    FilippoTextBoxAvrete sicuramente notato nell' immagine precedente che la colonna Geometry riporta semplicemente un anonimo BLOB GEOMETRY: questo lungi dall'essere soddisfacente.Ma potete avere una pi ricca presentazione di ogni Geometry semplicemente premendo il tasto destro del mouse sopra il valore corrispondente, quindi selezionando la voce di menu BLOB explore.

  • PoteteprovarecomefunzionaSQLconilmetodomanualeusandoquestocomandoSQL: bastacopiarlo,quindiinserirlonell' appositopannello,epremereilbottoneExecute.Unabreveevelocespiegazione:

    latabellacities1000contieneognicentroabitato[populated place] nelmondovisonomoltecolonneinquestatabella,edillorosignificatopurisultarepiuttostooscuro(potetetrovare unadocumentazionecompletaperquestosuhttp://www.geonames.org/)maperadessopotetefidarvi della miaautoritCOL002contieneilnomediognilocalitabitata.COL006contienelacorrispondentelongitudine(espressaingradidecimali)COL005lacorrispondentelatitudineMakePoint()unafunzioneSpatialchecostruisceunageometriaditipopuntodallecorrispondenti coordinateCOL009contieneilcodice del Paese[Countrycode]dettomoltosemplicemente,laclausola WHEREfiltreririsultaticosdaescluderetutte lelocalitaldi

    fuori dall' Italia.

    Bene,sipresumesiatesufficientementeabiliperiniziareseriamenteillavoro.NelladiapositivasuccessivainizieremoadesplorareilmisteriosomondodiSQLeSpatialSQL.

    SpatiaLite Cookbook

    26

  • SELECT*FROMreg2001_s

    IseguenticomandiSQLsonocossemplici chepoteteverificaredirettamenteirisultatidasoli.SeguitesemplicementeogniesempioeseguendoilcorrispondentecomandoSQL(usatecopia&incolla).

    QuestoproprioilponsasinorumdiSQL:tuttelecolonnediognirigadellatabellaselezionatasarannovisualizzateseguendounordinecasuale.

    SELECTpop2001,regioneFROMreg2001_s

    Nonsieteobbligatiavisualizzaretuttelecolonne:potetescegliereesplicitamentelecolonnechevoleteincluderenellaricerca,stabilendoanche illororelativoposizionamento.

    SELECTCod_rEgAScode,REGIONEASname,pop2001AS"population(2001)"FROMreg2001_s

    Poteteanchedecidereunnomepiappropriatoecomprensibileallecolonne,setrovatelacosadesiderabile.Questoesempiomostradueimportantiaspettidanotareassolutamente:inomidelle tabelle e delle colonne in SQLnon sonocasesensitive(minuscolo/maiuscolo): REGIONEe regionesiriferisconoalla stessatabella.inomiSQLnonpossonocontenerecaratteriproibiti(come spazi,parentesi,duepunti,accentiecosvia). Nonsipossonoinoltreusareparolechiave(ades.nonpotetenominareunacolonnaconilnome SELECT oFROM,poichquesticreerebbero ambiguit con i corrispondenti comandi SQL)comunquepoteteesplicitamentemascherareogninomeproibito,cosdarenderlopienamentelegittimo.Perapplicarequestomascheramento,dovetesemplicementeracchiuderel'interonomefradoppiapici.poteteovviamenteracchiuderefraapiciindiscriminatamentequalsiasinomeSQLname: questo completamenteinnocuo,manonstrettamenterichiesto.nelcaso(estremamenteraro,manoimpossibile)ilvostronomeproibitocontengagiunoodueapici, doveteinserireundoppioapicesupplementareperognunodiessi,ad es.:A"Bc"Ddeveesserecorrettamente mascheratocome:"A""Bc""D".

    SELECTCOD_REG,REGIONE,POP2001FROMreg2001_sORDERBYregione

    SQLconsentediordinareirisultatinelmodopiconvenientesecondolevostrenecessit.

    SpatiaLite Cookbook

    27

    FilippoTextBoxFebbraio 2011

    FilippoText BoxIprimirudimentisulleinterrogazioniSQL

  • SELECTCOD_REG,REGIONE,POP2001FROMreg2001_sORDERBYPOP2001DESC

    Poteteordinareinordineascendenteodiscendenteavostrascelta:laspecificaASCnormalmenteomessa,perchl' ordinamentopredefinito:l'ordineascendentesignificadall'AallaZperidatitestuali:edaminoreamaggioreperivalorinumerici.l'ordinedecrescentesignificadall'ZallaAperidatitestuali:edamaggioreaminoreperivalorinumerici.

    SELECTCOD_PRO,PROVINCIA,SIGLAFROMprov2001_sWHERECOD_REG=9

    UsandolaclausolaWHEREpoteterestringerelaricerca:sololerighechesoddisfanolaclausolaWHERE sarannovisualizzateneirisultati:inquestocaso,sarannoestratteleProvincieappartenentiallaRegioneToscana.

    SELECTPRO_COM,NOME_COM,POP2001FROMcom2001_sWHERECOD_PRO=48

    Comeilprecedente:questavoltasarestrattalalistadeiComuniappartenentiallaProvinciadiFirenze.

    SELECTPRO_COM,NOME_COM,POP2001FROMcom2001_sWHERECOD_REG=9ANDPOP2001>50000ORDERBYPOP2001DESC

    PotetecombinarepicondizioninellastessaclausolaWHERE:questavoltasarestrattalalistadeiComuniconoltre50,000abitantiappartenentiallaRegioneToscana. Ilrisultatosarordinatoinmododecrescente.

    SELECTPRO_COM,NOME_COM,POP2001FROMcom2001_sWHEREnome_com='ROMA'

    Poteteovviamenteusaredellestringheditestocomevaloridiconfronto:nelpurostileSQLognistringaditestovadelimitatadasingoliapici. [SQLiteabbastanzafurbodariconoscereanchelestringhedi testofradoppiapici,mavisconsiglio vivamentedall' adottarequestocattivostilecome vostro preferito].Vipregodiosservarebene:iconfrontifrastringheditestoperSQLitesonosemprecasesensitive(minuscolo/maiuscolo).

    SELECTPRO_COM,NOME_COM,POP2001FROMcom2001_sWHEREnome_com='L''AQUILA'

    Quandoqualchetestocontienel' apostrofo,dovetemascherarlo.Unsingoloapicerichiestoanchepermascherareogniapostrofoall'internodeltesto:ades.:REGGIONELL'EMILIAdeveesseremascheratacorrettamentein'REGGIONELL''EMILIA'.

    SpatiaLite Cookbook

    28

  • SELECTPRO_COM,NOME_COM,POP2001FROMcom2001_sWHEREnome_comLIKE'roma'

    Poteteusarel' operatoredivalutazioneapprossimataLIKEperrendereilconfrontodistringheinsensibilealmaiuscole/minuscole.

    SELECTPRO_COM,NOME_COM,POP2001FROMcom2001_sWHEREnome_comLIKE'%maria%'

    Epoteteusarel'operatoreLIKEpereseguireconfrontiparziali,usandoilcarattere%comejolly:questainterrogazioneestrarrogniComunecontenentelasottostringa'maria'nelsuonome.

    SELECTPRO_COM,NOME_COM,POP2001FROMcom2001_sWHEREnome_comIN('ROMA','MILANO','NAPOLI')

    Alcunevoltepuessereutileusareunalistadivalori,comenelcasoprecedente.

    SELECTPRO_COM,NOME_COM,POP2001FROMcom2001_sWHEREPOP2001BETWEEN1990AND2010

    Unaltrocriterio,nonmoltousato,maallevolteutile,quellodidefinirel' intervallodivaloridacercare.

    SELECTPROVINCIA,SIGLA,POP2001FROMprov2001_sWHERECOD_REGIN(9,10,11,12)ANDSIGLANOTIN('LI','PI')AND(POP2001BETWEEN300000AND500000ORPOP2001>750000)

    UsandoSQLpotetescrivereclausoleWHERE diognicomplessit:noncisonolimitiimposti.Equestopropriounafantasticaprestazione,che apre potenzialmente la stradaadinfinitiscenari. Propriounabrevespiegazione:laprecedenterichiestaprodurr:l'inclusionediogniProvinciadell' ItaliaCentrale(Regioni:Toscana,Umbria,MarcheeLazio)conl'esclusionedelleProvinciediLivornoePisaquindiilfiltrodellapopolazione:includendoquellenell' intervalloda300,000a500,000includendoanchequelleconoltre750,000abitanti.

    SELECTPROVINCIA,SIGLA,POP2001FROMprov2001_sWHERECOD_REGIN(9,10,11,12)ANDSIGLANOTIN('LI','PI')ANDPOP2001BETWEEN300000AND500000ORPOP2001>750000

    Notatebeneanche:inSQLilconnettorelogicoORhaunabassissimapriorit.

    Provatedasoli:omettendodiinserirelaclausola ORfraleparentesiproducerisultatimoltodiversi, no?

    SpatiaLite Cookbook

    29

  • SELECT*FROMcom2001_sLIMIT10

    Viinfineunautile(avolte)clausolaSELECTdaspiegare:usandoLIMITpotetestabilireilnumeromassimodirighedaestrarre(moltospessononsieteinrealtinteressatialeggerecompletamenteunatabellatroppodensamentepopolata:unapiccolapreviewsarsufficienteinmolticasi).

    SELECT*FROMcom2001_sLIMIT10OFFSET1000

    Equestonontutto:SQLnonvicostringealeggereunnumerolimitatodirighepartendonecessariamente

    dall' inizio:potetedecidereilpuntodipartenzadovevolete,semplicementeusando OFFSET combinatocon

    LIMIT.

    ImparareSQLnondifficiledopotutto.Cisonodavveropocheparolechiave,lasintassidellinguaggionotevolmenteregolareeprevedibile,edicomandidiricercasonoprogettatiperassomigliareall'inglese(neilimitidelpossibile...).Orasipresumesiateabilipercercarediscriveredei(semplici)comandiSQLdasoli.

    SpatiaLite Cookbook

    30

  • AbbiamovistosinoracomeSQLconsentediricercaresingolivaloriinunatabella.E'consentitaancheunamodalitdiversa,calcolarevaloritotaliperl' interatabella,opergruppidirigheselezionate.Questoimplicaqualchetipospecialedifunzioni,conosiutecomefunzionidi aggregazione.

    SELECTMin(POP2001),Max(POP2001),Avg(POP2001),Sum(POP2001),Count(*)FROMcom2001_s

    Questainterrogazionefornirunasolariga,contenendoqualcosacomeunriepilogodell' interatabella:lafunzioneMin() restituirilvalorepipiccolotrovatonellacolonnainteressata,lafunzioneMax()restituirilvalorepigrandetrovatonellacolonnainteressata,lafunzioneAvg() restituirilvaloremediorelativoallacolonnainterrogata,lafunzioneSum()restituirlasommatotaledeivaloridellacorrispondentecolonna,lafunzioneCount() restituir ilnumerodellerighetrovate.

    SELECTCOD_PRO,Min(POP2001),Max(POP2001),Avg(POP2001),Sum(POP2001),Count(*)FROMcom2001_sGROUPBYCOD_PRO

    PoteteusarelaclausolaGROUP BYperottenereunrisultatopidettagliatodiaggregazionepersottogruppi.Questainterrogazionerestituirivaloririchiesti,distintiperProvincia.

    SELECTCOD_REG,Min(POP2001),Max(POP2001),Avg(POP2001),Sum(POP2001),Count(*)FROMcom2001_sGROUPBYCOD_REG

    Potetetrovareancheiriepiloghiper Regionecambiandosemplicementeilcriteriodiraggruppamento(GROUP BY).

    SELECTDISTINCTCOD_REG,COD_PROFROMcom2001_sORDERBYCOD_REG,COD_PRO

    C'unaltromododiaggregarelerighe,ades.usando lacalusolaDISTINCT.

    Prendetenotaperfavore:questononpernienteugualeall' usodellaclausolaGROUP BY:laclausolaDISTINCTsopprimesemplicementeognirigaduplicata,manonhanienteachevederecon lefunzionidi aggregazione. laclausolaGROUP BYassolutamentenecessariaognivoltacheaggregareleinformazioni.

    SpatiaLite Cookbook

    31

    FilippoTextBox Febbraio 2011

    FilippoText BoxComprendere le funzioni diaggregazione

  • Ingredienti di uso comune

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxLavostraprimainterrogazionespazialeAncorasulleinterrogazionispaziali:WKTeWKBLetabelleMetaDataspazialiVisualizzareunlayerSpatiaLiteinQGis

  • SpatiaLiteunoSpatialDBMS,quinditempodieseguirequalcheinterrogazioneSpatialSQL [Spatial query].Nonc'assolutamentenientedidiversoinSpatialSQL:praticamentela stessacosadellostandardSQL,ladifferenzacheadottilaesoticatipologiadidatiGeometry.NormalmentenonpoteteinterrogaredirettamenteivaloriGeometry(comeabbiamogivistoessisonosemplicementedeicampiBLOB di tipo assolutamente generico e non qualificato):occorreusarealcuneappropriatefunzionispazialiperaccedereaivaloriGeometryinmodosignificativo.

    SELECTCOD_REG,REGIONE,ST_Area(Geometry)FROMreg2001_s

    LafunzioneST_Area()unadellefunzioniSpatialnormalmentefacilericonoscerelefunzionispazialiperch hannotutteilprefissoST_ . Questaregolanonassoluta per:SpatiaLitecapacediinterpretarel' aliasArea()cheidentificalastessafunzione.Comesicapiscedalnome,questafunzionecalcolalasuperficiedellacorrispondentegeometria[Geometry].

    SELECTCOD_REGAScode,REGIONEASname,ST_Area(Geometry)/1000000.0AS"Surface(sq.Km)"FROMreg2001_sORDERBY3DESC

    Comeavretesicuramentenotato,l'interrogazione [query]precedenterestituiscedeinumerimoltograndi:

    questodovuto alfattochel' insiemedeidatiusatiusaimetricomeunitdilunghezza,econseguentementelesuperficisonomisurateinm.Mabastaapplicareunappropriatofattorediscalaperaverelapicomodaunitinkm.NotateperfavoreduecaratteristicheSQLcheintroduciamoperlaprimavolta:SQLnonimponelastampadirettadeivaloridellecolonnenelrisultato:voipotetedefinireliberamente qualsiasivalidaespressionearitmeticaavostropiacimento.usarenellaclausolaORDER BYespressionicomplessenonilmassimodellapraticit:poteteinvece riferirviallediversecolonneconl'identificativodellarelativaposizione(laprimacolonnahacodice1 , ecosvia).

    SELECTCOD_REGAScode,REGIONEASname,ST_Area(Geometry)/1000000.0AS"Surface(sq.Km)",POP2001/(ST_Area(Geometry)/1000000.0)AS"Density:Peoples/sq.Km"FROMreg2001_sORDERBY4DESC

    EpoteteeseguireanchepicomplesseinterrogazioniinSQL.Questainterrogazionecalcolerladensitdipopolazione(misuratacomeabitanti/km).

    SpatiaLite Cookbook

    33

    FilippoTextBoxFebbraio 2011

    FilippoText BoxLavostraprimainterrogazione spaziale

  • Bene,oraaveteacquisitounaconoscenzabasilarediSQL/SpatialSQL. Orasieteprontipermisurarviconpicomplesseedefficaciinterrogazioni:maquestorichiedelacostruzionediundatabaseserio.Ricordate?finoraabbiamousatotabellediVirtualShapefilesciounaimitazionediveretabelleSpatial(memorizzateinternamente).Cosneiprossimipassi,primacreeremoepopoleremounDBbencostruito(uncompitononpropriobanale), epoivedremoancorainterrogazioniSQLpicomplesseepotenti.

    SpatiaLite Cookbook

    34

  • SpatiaLitegestiscedatiditipoGeometry [geometrico] conformiallostandardinternazionale OGCSFS(OpenGeospatialConsortiumSimpleFeatureSQL).http://www.opengeospatial.org/standards/sfs. IltipoGeometryuntipoastrattoconsettesottoclassi.NonpoteteusaredirettamenteiltipoGeometry(acausadellasuanaturaastrattaallaqualenoncorrispondealcunaimplementazione):mentrepoteteusareliberamentequalsiasisottoclasse.

    Sub-Class Esempio

    POINT

    LINESTRING

    POLYGON

    MULTIPOINT

    SpatiaLite Cookbook

    35

    FilippoTextBoxFebbraio 2011

    FilippoText BoxAncorasulleinterrogazionispaziali: WKTeWKB

  • MULTILINESTRING

    MULTIPOLYGON

    GEOMETRYCOLLECTION

    AvvertenzeWKTandWKTIltipoGeometryundatomoltocomplesso:perquesto,OGCSFSdefinisceduestandardalternativiperrappresentarevaloriGeometry:....ilformatoWKT(WellKnownText)progettatoperessereamichevoleefaciledausare(noncosfaciledopotutto,maalmenofacilmente leggibile dagli esseri umani).....ilformatoWKB(WellKnownBinary)d'altrolatopiorientatoperlaprecisaedaccurataimportazione/ esportazione/scambiodiGeometries [Geometrie]frapiattaformedifferenti.

    Qualsiasiarbitrarioinsiemedisottoclassielementari.Notate,perfavore:perqualcheoscuraragionequestasembralasottoclassedigranlungapreferitadaiprincipianti:tuttisibasanosuGEOMETRYCOLLECTION:lasottoclasseGEOMETRYCOLLECTIONnonprevistadalformatoShapefile.EquestasottoclassenongeneralmentegestitadanormaliapplicativiGIS(visualizzatoriecosvia).PerquestomoltoraramenteusatanelmondoprofessionaleGIS.

    SpatiaLite Cookbook

    36

  • Geometry Type WKT examplePOINT POINT(123.45 543.21)

    LINESTRING LINESTRING(100.0 200.0, 201.5 102.5, 1234.56 123.89) three vertices [tre vertici]

    POLYGON

    POLYGON((101.23 171.82, 201.32 101.5, 215.7 201.953, 101.23 171.82)) exterior ring, no interior rings [anello esterno, nessun anello interno]

    POLYGON((10 10, 20 10, 20 20, 10 20, 10 10),(13 13, 17 13, 17 17, 13 17, 13 13)) exterior ring, one interior ring [anello esterno, un anello interno]

    MULTIPOINT MULTIPOINT(1234.56 6543.21, 1 2, 3 4, 65.21 124.78) three points [tre punti]

    MULTILINESTRINGMULTILINESTRING((1 2, 3 4), (5 6, 7 8, 9 10), (11 12, 13 14)) first and last linestrings have 2 vertices each one; [la priama e l'uktima hanno 2 vertici]the second linestring has 3 vertices [la seconda ha 3 vertici]

    MULTIPOLYGONMULTIPOLYGON(((0 0,10 20,30 40,0 0),(1 1,2 2,3 3,1 1)),((100 100,110 110,120 120,100 100))) two polygons: the first one has an interior ring [due poligoni il primo ha un anello interno]

    GEOMETRYCOLLECTIONGEOMETRYCOLLECTION(POINT(1 1),LINESTRING(4 5, 6 7, 8 9),POINT(30 30))

    Ilformato:XY(2D)(quellopicomunementeusato):

    Geometry Type WKT examplePOINT POINTZ(13.21 47.21 0.21)LINESTRING LINESTRINGZ(15.21 57.58 0.31, 15.81 57.12 0.33)POLYGON ...MULTIPOINT MULTIPOINTZ(15.21 57.58 0.31, 15.81 57.12 0.33)MULTILINESTRING ...MULTIPOLYGON ...

    GEOMETRYCOLLECTIONGEOMETRYCOLLECTIONZ(POINTZ(13.21 47.21 0.21),LINESTRINGZ(15.21 57.58 0.31,15.81 57.12 0.33))

    IlformatoXYZ(3D):

    Geometry Type WKT examplePOINT POINTM(13.21 47.21 1000.0)LINESTRING LINESTRINGM(15.21 57.58 1000.0, 15.81 57.12 1100.0)POLYGON ...MULTIPOINT MULTIPOINTM(15.21 57.58 1000.0, 15.81 57.12 1100.0)MULTILINESTRING ...MULTIPOLYGON ...GEOMETRYCOLLECTION GEOMETRYCOLLECTIONM(POINTM(13.21 47.21 1000.0),LINESTRINGM(15.21 57.58 1000.0, 15.81 57.12 1100.0))

    IlformatoXYM(2D+Misura)(Avvertenza:questanonhanienteachefareconil3D.Munvaloredimisura,nonunadimensionegeometrica):

    SpatiaLite Cookbook

    37

  • Geometry Type WKT examplePOINT POINTZM(13.21 47.21 0.21 1000.0)LINESTRING LINESTRINGZM(15.21 57.58 0.31 1000.0, 15.81 57.12 0.33 1100.0)POLYGON ...MULTIPOINT MULTIPOINTZM(15.21 57.58 0.31 1000.0, 15.81 57.12 0.33 1100.0)MULTILINESTRING ...MULTIPOLYGON ...GEOMETRYCOLLECTION GEOMETRYCOLLECTIONZM(POINTZM(13.21 47.21 0.21 1000.0),LINESTRINGZM(15.21 57.58 0.31 1000.0, 15.81 57.12 0.33 1100.0))

    IlformatoXYZM(3D+Misura)(Avvertenza:questanonhanienteachefareconil3D.Munvaloredimisura,nonunadimensionegeometrica):

    VisonoparecchiefunzioniSpatialSQLchegestisconoiformatiWKTeWKBesaminarletutteunaadunaassolutamentenoioso(enemmenoutileper l'utentemedio).Cosvedremobrevementesololeprincipali(edanchelepicomunementeusate).

    0001FFFFFFFF8D976E1283C0F33F16FBCBEEC9C302408D976E1283C0F33F16FBCBEEC9C302407C010000008D976E1283C0F33F16FBCBEEC9C30240FESELECTHex(ST_GeomFromText('POINT(1.23452.3456)'))

    SELECTST_AsText(x'0001FFFFFFFF8D976E1283C0F33F16FBCBEEC9C302408D976E1283C0F33F16FBCBEEC9C302407C010000008D976E1283C0F33F16FBCBEEC9C30240FE')

    POINT(1.23452.3456)

    SELECTHex(ST_AsBinary(x'0001FFFFFFFF8D976E1283C0F33F16FBCBEEC9C302408D976E1283C0F33F16FBCBEEC9C302407C010000008D976E1283C0F33F16FBCBEEC9C30240FE'))01010000008D976E1283C0F33F16FBCBEEC9C30240

    SELECTHex(ST_AsBinary(ST_GeomFromText('POINT(1.23452.3456)')))01010000008D976E1283C0F33F16FBCBEEC9C30240

    SELECTST_AsText(ST_GeomFromWKB(x'01010000008D976E1283C0F33F16FBCBEEC9C30240'))POINT(1.23452.3456)

    3erfavore,notateEene:entrambiiformatiWKTandWKB sonofattipergestireloscambiodeidati (importazioneesportazione)mailveroformatousatointernamentedaSpatiaLitedifferente,cio B/2B *eometr\.......1on vidovretemaipreoccuparediquestoformatointerno: dovetesemplicementeusarele appropriatefunzionidiconversionedaglistandardWKTeWKB:.... la funzioneHex()unafunzionestandardSQLcheconsentedirappresentarevaloribinaricomestringhe ditestoinformatoesadecimale. lafunzioneSpatialSQLST_GeomFromText()converteognivalidaespressioneWKT nelformato BLOBGeometryinterno. lafunzioneST_GeomFromWKB()converteognivalidaespressioneWKBnelformatoBLOBGeometry interno. lafunzioneST_AsText()converteilvaloredalformatointernoBLOBGeometrynellacorrispondente espressioneWKT. lafunzioneST_AsBinary()converteilvaloredalformatointerno BLOBGeometrynellacorrispondente espressioneWKB.

    SpatiaLite Cookbook

    38

  • SELECT ST_GeometryType(ST_GeomFromText('POINT(1.2345 2.3456)'));POINTSELECT ST_GeometryType(ST_GeomFromText('POINTZ(1.2345 2.3456 10)'));POINT ZSELECT ST_GeometryType(ST_GeomFromText('POINT ZM(1.2345 2.3456 10 20)'));POINT ZM

    LafunzioneST_GeometryType()restituirjiltipodigeometria>*eometr\@dalformatointernoBLOBGeometry.....Annotate:quandousatedatinonbidimensionali>dimensioninonD@,dichiarare'POINTZ'o'POINTZ'assolutamentelostesso:SpatiaLitericonosceentrambelenotazioni.

    SELECT ST_Srid(ST_GeomFromText('POINT(1.2345 2.3456)'));-1

    SELECT ST_Srid(ST_GeomFromText('POINT(1.2345 2.3456)', 4326));4326

    LafunzioneST_Srid()restituisceilcodiceS5IDdalformatoBL2B*eometr\.Annotate: sialafunzioneST_GeomFromText()chelaST_GeomFromWKB()accettaunargomento65,Dopzionale.Seilcodice65,Dnonspecificato(unapraticapernientecorretta),alloraassume1.(rroriSifrequenti+odichiaratounaJeometriaditipo08/7,32,17oradeYoinserireunsemplice32,17 [punto]nellataEellamariceYounseJnaledierrore2gnitipoM8/T,[[[[[puzmemorizzareelementisingoli:dovetesolousarelacorrettasintassiWKT.ComunqueesistonoparecchieutilifunzionidiconversioneditiSo.

    SELECT ST_GeometryType(ST_GeomFromText('MULTIPOINT(1.2345 2.3456)'));MULTIPOINTSELECT ST_AsText(CastToMultiLineString(ST_GeomFromText('LINESTRING(1.2345 2.3456, 12.3456 23.4567)')));MULTILINESTRING((1.2345 2.3456, 12.3456 23.4567))SELECT ST_AsText(CastToXYZM(ST_GeomFromText('POINT(1.2345 2.3456)')));POINT ZM(1.2345 2.3456 0 0)SELECT ST_AsText(CastToXY(ST_GeomFromText('POINT ZM(1.2345 2.3456 10 20)')));POINT(1.2345 2.3456)

    SpatiaLite Cookbook

    39

  • SpatiaLiterichiedel' usodiparecchietabellemetadataperfunzionarecorrettamente. Nonc'assolutamentenulladistranoin questetabelleessesonosemplicitabellecometuttelealtre.EssesonochiamatecomplessivamentemetadatiperchsonoprogettateperconsentireunestesoecompletousodelleGeometries.QuasituttelefunzioniSpatialSQLsiappoggianosutalitabelle:perquestosonoassolutamentenecessariepermotividifunzionamentointerno.Qualsiasitentativodimodificarequestatabellefinirperrendereildatabasecorrotto(emal funzionante).C' unsolomodosicurodiinteragireconletabellemetadata,ades.usandoperquantopossibileleappropriatefunzioniSpatialSQL.L'usodirettodellefunzioniINSERT,UPDATEorDELETEunamodalitcompletamenteinsicuraefortementescoraggiata.

    SELECTInitSpatialMetaData()

    LafunzioneInitSpatialMetaData()deveessereeseguitaimmediatamentedopolacreazionediunnuovodatabase,eprimadieseguirequalsiasialtrafunzioneSpatialSQL:lafunzionediquestocomandoesattamentequellodicreare(epopolare)ognitabellametadata richiesta daSpatiaLitepermotiviinterni.sequalchetabellametadataesistegi,lafunzionenoneseguealcunaoperazione:quindilaripetutaesecuzione diInitSpatialMetaData()inutilema completamenteinoffensiva.notateperfavore:l'applicativospatialite_guieseguirautomaticamentequalsiasi inizializzazione richiestaognivoltachesi creaunnuovodatabase:cio,(usandoquestostrumento)nonc' alcunbisogno dichiamareesplicitamentequestafunzione.

    SELECT*FROMspatial_ref_sys

    SpatiaLite Cookbook

    40

    FilippoTextBoxFebbraio 2011

    FilippoText BoxLetabelleMetaDataspaziali

  • SRID auth_name auth_srid ref_sys_name proj4text srs_wktPROJCS "Anguilla 1957

    / Grid British WestIndies" [,GEOGCS ["Anguilla1957",DATUM["Anguilla_1957",Sferoide ["Clarke 1880(RGS)",6378249.145,293.465,AUTHORITY ["EPSG",

    2000 EPSG 2000Anguilla 1957 /Grid BritishWest Indies

    + Proj = tmerc + lat_0 = 0 + lon_0 =- 62 + k =0,9995000000000001 + x_0 = 400.000 + y_0 = 0 +ellps = clrk80 + unit = m + no_defs

    "7.012"]],AUTHORITY ["EPSG","6600"]],PRIMEM ["Greenwich",0,AUTHORITY ["EPSG","8.901"]],UNITA '["grado",0,01745329251994328,AUTHORITY ["EPSG","9.122"]],AUTHORITY ["EPSG","4600"]],UNIT ["Meter", 1,AUTHORITY ["EPSG","9001"]],PROIEZIONE["Transverse_Mercator"],PARAMETER["latitude_of_origin", 0],PARAMETER["central_meridian", -62],PARAMETER["scale_factor", 0,9,995mila],PARAMETER["false_easting",400000],PARAMETER["false_northing", 0],AUTHORITY ["EPSG","2000"],AXIS ["Est", EST],AXIS ["Nord e Quota", anord]]

    ... ... ... ... ... ...

    SpatiaLite Cookbook

    41

  • Latabellaspatial_ref_syscontienel'interoarchivioEPSG(definizionideiSpatialReferenceSystem).lacolonnaSRIDlachiaveprimaria(PRIMARY KEY)cheidentificaunivocamenteciascunsistema.

    lecolonneauth_name < auth_srid e ref_sys_name contengononormalmenteunriferimento alladefinizioneoriginariaEPSG(principalmentepermotivididocumentazione).lacolonnaproj4textcontieneiparametrigeodesici(???)richiestidallalibreriaPROJ.4.questiparametrisonoassolutamentenecessariallafunzioneTransform(),perchogniriproiezione

    dicoordinatesareseguitainvocandol' appropriatafunzionePROJ.4.lacolonnasrs_wktcontieneunadefinizionecompletadelSRSusandoilformato(ovviamenteverboso) WKT.SpatiaLitepersnonrichiedechequestainformazionesiapresente:maquandoquestastringaWKT

    disponibile,alloracreerunfile.PRJquandoesportainformatoShapefile(moltiapplicativiGISrichiedonolapresenzadiunfile.PRJperogniShapefile).perevitareconfusioni:questoformatoWKTperiSRSnonhanienteachevedereconilpinotoWKTusatoperrappresentarelegeometrie.avvisoimportante:nonsicuroefortementescoraggiatomodificareladefinizioneEPSGoriginale,edeveessereassolutamenteevitato.Comunquesieteassolutamenteliberidiinseriredefinizionipersonalizzate apiacimento:inquestocasofortementeconsigliatousarecodiciSRID>32768.

    SELECT*FROMgeometry_columns

    f_table_name f_geometry_column type coord_dimension SRID spatial_index_enabledlocal_councilsgeometry MULTIPOLYGON XY 23032 1populated_placesgeometry POINT XY 4326 1

    Latabellageometry_columnsdescriveogniGeometrycolumndefinitaneldatabase:ognicolonnanondefinitadaunacorrispondenterigadiquestatabella,nonpu essereconsiderata una Geometrycorretta.AVVISOIMPORTANTE:ogniinquinamentodiquestatabellacausatodall' usodirettodeicomandiINSERT, UPDATE or DELETEfinirquasisicuramenteinundisastro(ades. undatabasecorrottoemalfunzionante).UsatepiuttostoleappropriatefunzioniSQL:AddGeometryColumn(),RecoverGeometryColumn()ecosvia.Latabellageometry_columnsprogettataperlagestioneditabellenormali. Inoltreesistonoaltredue

    tabellesimili:latabellaviews_geometry_columnsprogettataperconsentireleGeometryVIEW

    elavirts_geometry_columnspergestireiVirtualShapefiles.

    SpatiaLite Cookbook

    42

  • QGISunapplicativoGISdesktoppopolareelargamentediffuso:potetescaricarel' ultimaversione da:http://www.qgis.org/.....QGIScontieneunungestoreinternodidaticheabilitaSpatiaLite:inquestomodofacileesempliceinteragireconqualsiasiDBSpatiaLiteusandounprogrammaGISclassicoperdesktop.

    DovetesemplicementeconnetterviconilDBSpatiaLite,quindi sceglierelo/glistrato/ichevoleteusare.Annotate:secondolaterminologiaDBMSvoistateusandodelletabelle. ManelgergoGISsiusamoltospessoilterminestrato(layer)perindicarelastessacosa.

    SpatiaLite Cookbook

    43

    FilippoTextBoxFebbraio 2011

    FilippoText BoxVisualizzareunlayerSpatiaLiteinQGis

  • Unavoltaconnessiaivostristrati[layers] delDBSpatiaLitepoteteimmediatamenteiniziareadusareilvostroQGIS. E'tutto.

    SpatiaLite Cookbook

    44

  • Cucina familiare

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxRicetta #1:CreareunDBbenfattoRicetta #2:LevostreprimeinterrogazioniJOINRicetta # 3: Maggiori informazioni su JOINRicetta # 4: ApropositodiVIEWRicetta # 5: Creazione di una nuova tabella (con annessi e connessi)Ricetta # 6: CreareunanuovacolonnaGEOMETRYRicetta # 7: Inserire,aggiornareecancellareRicetta # 8: ConoscereivincoliRicetta # 9: ACIDity:conoscereletransazioniRicetta # 10: Labellezzadell'indiceR*Treespaziale

  • FormaNormaleOgniDBbenprogettatoaderisceadunparadigmarelazionale,edimplementalecosiddetteFormeNormali[NormalForm].Spiegatomoltosemplicementeconparolechiare:primacercatediidentificareognidistintacategoria(cioclasse)presentenelvostroinsiemedi datinellostessotempodoveteidentificareognipossibilerelazionechecollegalecategorie.laridondanzadeidatifortementesconsigliata,edeveessereevitataquandopossibile.ConsiderateidatidelCensimentoISTAT2001identificarelecategorieelerelazionideltuttosemplice:alpibassolivellodellagerarchiaabbiamoovviamenteiComuni [Local Councils].OgniComuneappartienesicuramenteadunaProvincia [County]:quindiesisteunarelazionefra Comuni eProvincia. Peresserepiprecisi,questaunarelazioneunoamolti[onetomany] (unasingolaProvinciamoltiComuni:metterelostesoComuneinpiProvincieassolutamente vietato).LostessoveroperProvincieeRegioni.Nonc'unverobisognodicollegareiComuniconleRegioniperchpossiamostabilirequestarelazione attraversoleProvincie.

    46

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxRicetta #1:CreareunDBbenfatto

  • Dettoci,abbastanzafacileidentificarediversi limitazioni concettuali nelformatooriginaleShapefile:1.perogniComune,ProvinciaeRegionepresenteunvalorePOP2001: bene,questachiaramenteuna

    ridondanzanonnecessaria.E'sufficienteconservarequestainformazioneallivellopibasso(Comuni) poichpossiamosemprecalcolareilvaloreaggregatoperleProvincie(oleRegioni).2.Esisteunasecondaridondanza:nonc'necessitdiconservareildoppiocodiceProvinciaeRegioneper ogniComune.IlcodicedellaProvinciasufficiente,perchpossibileriferirsiallaRegionesemplicemente attraversolaProvincia.3.SialeProvinciecheleRegionihannounageometriaassociata: anchequestarappresentaunaridondanza inutile,poichpossiamootteneretaligeometriesemplicementeaggregandoquelleassociateaiComuni.Poiabbiamol'archiviocities1000:chearrivadaunafontecompletamentediversa(perquestonon

    disponibileunachiaveperstabilireunarelazioneadaltreentit).Inoltrequestoarchivionelsistema4326(WGS84),mentreilCensimentoISTAT2001nelsistema23032[ED50UTMzona32]quindiperadessopossiamousarequestoarchiviodasolo.Vedremosuccessivamentecomeinrealtpossiamointegrarequestoarchivioconglialtri: dopotutto,tuttirappresentanol' Italia,no? Disicuroqualcherelazionegeograficadeveesistere...

    47

    SpatiaLite Cookbook

  • CREATETABLEregions(region_idINTEGERNOTNULLPRIMARYKEY,region_nameTEXTNOTNULL)

    Passo1a)inizieremoacrearelatabelladelleregioni(cioquellasituataallivellopialtodellagerarchia).Notate:abbiamodefinitounaPRIMARY KEY,ciounidentificatoreunico(nonduplicabile),assolutamenteinequivocabileperogniRegione.

    INSERTINTOregions(region_id,region_name)SELECTCOD_REG,REGIONEFROMreg2001_s

    Passo1b)quindiriempiamolatabelladelleregioni [regions].UsareilcomandoINSERT INTO ... SELECT ...piomenocomefareunacopia:lerigheestrattedallatabelladiinputsonosubitoinseritenellatabelladioutput. Comepotetevedere,lecorrispondenticolonnesonoidentificateperordine.

    CREATETABLEcounties(county_idINTEGERNOTNULLPRIMARYKEY,county_nameTEXTNOTNULL,car_plate_codeTEXTNOTNULL,region_idINTEGERNOTNULL,CONSTRAINTfk_county_regionFOREIGNKEY(region_id)REFERENCESregions(region_id))

    INSERTINTOcounties(county_id,county_name,car_plate_code,region_id)SELECTcod_pro,provincia,sigla,cod_regFROMprov2001_sPasso2a)creiamo(epopoliamo)latabelladelleprovincie [counties]Annotate:c'unarelazionefraprovincie e regioni.

    DefinendounaappropriataFOREIGN KEYrenderemotalerelazioneesplicitamentechiaraunavoltapertutte.

    CREATEINDEXidx_county_regionONcounties(region_id)

    Passo2b)permotividiprestazioni,dobbiamoanchecreareunINDEXcorrispondenteadogniFOREIGNKEYchedefiniamo.Inparolepovere:unPRIMARYKEYnonsoltantounvincolologico.LadefinizionediunPRIMARYKEYinSQLiteimplical' automaticagenerazionediunindiceimplicitopergestirel' accessorapidoadognisingolariga.Mad' altrolatoladefinizionediunFOREIGNKEYdefinisceunsemplicevincolologico:cossevoletegestirel' accessorapidoadognisingolarigadovetecreareesplicitamentel'indicecorrispondente.

    48

    SpatiaLite Cookbook

  • CREATETABLElocal_councils(lc_idINTEGERNOTNULLPRIMARYKEY,lc_nameTEXTNOTNULL,populationINTEGERNOTNULL,county_idINTEGERNOTNULL,CONSTRAINTfk_lc_countyFOREIGNKEY(county_id)REFERENCEScounties(county_id))

    Passo3a)creiamoadessolatabelladeicomuni [local_councils].C'unarelazionechelegaicomuni e leprovincie.PertantoinquestocasodefiniamounFOREIGNKEY,epoicreiamoilcorrispondenteindice.Annotate:nonabbiamodefinitoalcunacolonnaditipoGeometry, nonostantesiarichiestapericomuninonunerrore,assolutamentevoluto.

    CREATEINDEXidx_lc_countyONlocal_councils(county_id)

    SELECTAddGeometryColumn('local_councils','geometry',23032,'MULTIPOLYGON','XY')

    Passo3b)lacreazionediunacolonnaGeometrynonlostessodiognialtracolonnanormale.DobbiamousarelafunzionespazialeAddGeometryColumn(),specificando:

    1.ilnomedellatabella2.ilnomedellacolonnaditipogeometrico3.ilcodiceSRIDdausare.4.laclassedigeometriavoluta5.ladimensionedelmodello(inquestocaso,semplice2D).

    INSERTINTOlocal_councils(lc_id,lc_name,population,county_id,geometry)SELECTPRO_COM,NOME_COM,POP2001,COD_PRO,GeometryFROMcom2001_s

    Passo3c)inseguitosipupopolarelatabelladeicomunicomediconsueto.

    CREATETABLEpopulated_places(idINTEGERNOTNULLPRIMARYKEYAUTOINCREMENT,nameTEXTNOTNULL)

    SELECTAddGeometryColumn('populated_places','geometry',4326,'POINT','XY')

    49

    SpatiaLite Cookbook

  • INSERTINTOpopulated_places(id,name,geometry)SELECTNULL,COL002,MakePoint(COL006,COL005,4326)FROMcities1000WHERECOL009='IT'

    Passo4)doveteorafarel'ultimopasso:creare(epopolare)latabellapopulated_places [centri abitati].Cisonoparecchipuntiinteressantidastudiare:abbiamousatounaclausolaAUTOINCREMENTperilPRIMARY KEY.

    questosignifica praticamentecheSQLitepugenerareautomaticamenteilvaloreadattoperil

    PRIMARY KEY,quandononstatoesplicitamentedefinito ilsuovalore.perquestomotivo,ilcomandoINSERT INTOcontieneunvaloreNULLincorrispondenzadel

    PRIMARY KEY:equestoobbligaSQLiteadassegnareautomaticamenteivalori.

    l' archiviocities1000distribuitoinorigineconduecolonnenumericheperlalongitudine [COL006]elalatitudine[COL005]: cosabbiamousatolafunzionespazialeMakePoint()inmododacostruireunaGeometryditipo punto.

    usandoloSRID 4326collochiamoquestaGeometrynell'SRSWGS84[GeographicSystem].Giustoperricapitolare:aveteiniziatoquestaguidausandotabellediVirtualShapefiles(ediVirtualCSV/TXT)taliTabelleVirtualinonsonodelleveretabelleDB:essenonsonomemorizzateinternamente. Essesono semplicementedeifilesesternicuisiaccedetramiteappropriatidriver.UsandoleTabelleVirtualipotetedasubitotestarequalchesempliceebasilareistruzioneSQL.MapereseguirecaratteristicheSQLpisofisticateidatidevonoessereadeguatamenteimportatiinunDBMSEquestopassorichiedelacreazione(edilpopolamento)delletabelleinterne,diparipassoconunastruttura benprogettata.

    DROPTABLEcom2001_sDROPTABLEprov2001_sDROPTABLEreg2001_sDROPTABLEcities1000

    Passo5)efinalmentepoteteeliminarequalsiasiTabellaVirtuale,perchnonsonopinecessarie.Prendetenota:eliminandounVirtualShapefileoVirtualCSV/TXT noneliminatelecorrispondentisorgentiesterne,masemplicementerimuovelaconnessioneconildatabasecorrente.

    50

    SpatiaLite Cookbook

  • SELECT*FROMcounties,regions

    AveteappenaimparatolenozionibasesulleinterrogazioniSQLsemplici.Tuttigliesempiincontratiinprecedenzainterrogavanounasingolatabella:ma SQLnonimponedeilimiti,quindipotereinterrogareunnumeroarbitrarioditabellenellostessomomento. MaperfarecidoveteancoraconoscerecomeusarecorrettamenteunJOIN.

    county_id county_name car_plate_code region_id region_id region_name

    1 TORINO A 1 1 PIEMONTE

    1 TORINO A 1 2 VALLE D'AOSTA

    1 TORINO A 1 3 LOMBARDIA

    1 TORINO A 1 4 TRENTINO-ALTO ADIGE

    1 TORINO A 1 5 VENETO

    ... ... ... ... ... ...

    Apparentementequestainterrogazionefunzionaallagrande maappenadateunosguardoairisultativiaccorgeretechec'qualcosacheineffettinonva:c'unnumeroesageratodirigheedognisingola ProvinciasembraappartenereatutteleRegioni.Ogni voltacheSQLinterrogacontemporaneamenteduedifferentitabelle,restituisceilProdottoCartesianodientrambigliinsiemi cioognirigadiuninsiemevienecollegataconognirigadell'altroinsieme.Questounprocedimentocombinatorioallacieca,emoltodifficilmenteprodurrqualcherisultatoutile.Questofattoinoltrepuprodurreunrisultatomoltoesteso:deveessereassolutamenteevitato,poich:purichiederemolto,molto(molto,molto)tempoperessereportatoatermine.puaccaderediesaurirelerisorsedelsistemaoperativoprimadellafine.Dettoquesto,quasiovviocheadattecondizionidiJOINdevonoesseredefinitepermanteneresottocontrolloilProdottoCartesiano,cosdaotteneresoloinformazioniutili.

    51

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxRicetta #2:levostreprime InterrogazioniJOIN

  • SELECT*FROMcounties,regionsWHEREcounties.region_id=regions.region_id

    Questainterrogazioneesattamentequelladiprima,maquestavoltaabbiamointrodottolacondizioneJOIN.Qualchepuntodanotare:l'usodidue(opi)tabellepufacilmenteportareadambiguit:ades.inquestocasoabbiamoduediversecolonnedinomeregion_id,unanellatabellaProvincie,l'altrain quellaRegioni.doveteusaredeinomicompletamentequalificatiperevitarepossibiliambiguit:ades.counties.region_ididentificalaregion_idcolonnaappartenenteallacountiestable

    [tabella Regioni],inmodoassolutamenteinevocabile.definireilWHEREcounties.region_id = regions.region_idclausolacheimponeun adeguatocondizionedijoin.CosilProdottoCartesianosarfiltratoedinseriteneirisultatisololerighechesoddisfanolacondizioneimposta,tuttelealtresarannoignorate.

    SELECTc.county_idAScounty_id,c.county_nameAScounty_name,c.car_plate_codeAScar_plate_code,r.region_idASregion_id,r.region_nameASregion_nameFROMcountiesASc,regionsASrWHEREc.region_id=r.region_id

    county_id county_name car_plate_code region_id region_name

    1 TORINO A 1 PIEMONTE

    2 VERCELLI VC 1 PIEMONTE

    3 NOVARA NO 1 PIEMONTE

    4 CUNEO CN 1 PIEMONTE

    5 ASTI AT 1 PIEMONTE

    6 ALESSANDRIA AL 1 PIEMONTE

    ... ... ... ... ...

    Questosemprecomesopra,semplicementeinunaformaunppichiara: l' usoabbondantedellaclausolaASperdefiniredeglialiasperlecolonneeletabellerendelastesuradellecondizioniJOINmoltopiconcisaeleggibile,epifaciledacapire.

    52

    SpatiaLite Cookbook

  • SELECTlc.lc_idASlc_id,lc.lc_nameASlc_name,lc.populationASpopulation,c.county_idAScounty_id,c.county_nameAScounty_name,c.car_plate_codeAScar_plate_code,r.region_idASregion_id,r.region_nameASregion_nameFROMlocal_councilsASlc,countiesASc,regionsASrWHERElc.county_id=c.county_idANDc.region_id=r.region_id

    Uniretre(oanchepi)tabellenonmoltopidifficile:dovetesemplicementeapplicarelacondizioneJOINadattaallenecessit.

    lc_id LC_NAME population county_id county_name car_plate_code region_id region_name1001 AGLIE ' 2574 1 TORINO A 1 PIEMONTE

    1002 AIRASCA 3554 1 TORINO A 1 PIEMONTE

    1003 Ala di Stura 479 1 TORINO A 1 PIEMONTE

    ... ... ... ... ... ... ... ...

    53

    SpatiaLite Cookbook

    FilippoRectangle

  • AnalisidellePrestazioniL'esecuzionediinterrogazioni[query] checoinvolgononumerosetabelledifferentipudegenerarefacilmenteinunprocessolentissimo.Questolosipufacilmentevederecontabellechecontengonounaltonumerodirighe. Spiegarequestononpernientedifficile:percalcolareilProdottoCartesianoilmotoreSQLdeveaccederemolteemoltevolteadognitabellacoinvoltanellainterrogazione.Ilcomportamentoelementarequellodipassaretuttalatabellaognivolta:edovviamentescandireunatabellalunganumerosissimevolterichiedemoltotempo.Quindiilpuntochiaveperottimizzarelevostreinterrogazioniquellodievitarelascansionedituttalatabellaognivoltachepotete.Questodeltuttopossibile,edfacilmenterealizzabile.OgnivoltacheSQLplanner(uncomponenteinternodelmotoreSQL)trovachedisponibileunINDEXadatto,nonhabisognodiscandireinteramentelatabella,perchognisingolarigapuessereraggiuntausandoquell' Index.Equestoovviamentesarunprocessomoltopiveloce.Ognicolonna(ogruppodicolonne)usatefrequentementeincluasoleJOINuncandidatoadattoperun

    INDEXcorrispondente.PerlacreazionediunIndeximplicaparecchieconseguenzenegative:laallocazionedimemoriaaumenterlospaziorichiestodalDB(alcunevolteinmododrammatico).l'esecuzionedicomandiINSERT,UPDATE e/o DELETErichiedertempipilunghi,perchl'Indexdeveessereadeguatamenteaggiornato.Equestoovviamenteimponeunulterioresovraccarico.Pertanto(nonstupitevi)unprocessodimessaapunto:dovetevalutareattentamentequandounINDEXassolutamenterichiesto,ecercateungiustoequilibrio,ciouncompromessofraesigenzecontrastanti,sottovariecondizioniedindifferenticasispecifici.Inaltre parole,nonvilaregolaassoluta:dovetetrovarelasoluzioneottimalecasoacasofacendodiverseprovepratiche,finchtrovatelasoluzionechesoddisfamegliotuttelevostreesigenze.

    54

    SpatiaLite Cookbook

  • SQLconsenteunasintassialternativadidescrivereclausoleJOIN. Piomenoleduesonostrettamenteequivalenti,percuiusareunaol' altraunaquestionedigustopersonalenellamaggioranzadeicasi.Comunque,questosecondometodoforniscepossibilitveramenteinteressantialtrimentinondisponibili.

    SELECTlc.lc_idASlc_id,lc.lc_nameASlc_name,lc.populationASpopulation,c.county_idAScounty_id,c.county_nameAScounty_name,c.car_plate_codeAScar_plate_code,r.region_idASregion_id,r.region_nameASregion_nameFROMlocal_councilsASlc,countiesASc,..regionsASrWHERElc.county_id=c.county_idANDc.region_id=r.region_id

    Oraprovereteunasensazionedigivisto:edpichegiusto,perchavetegiincontratoquestainterrogazionenelprecedenteesempio.

    SELECTlc.lc_idASlc_id,lc.lc_nameASlc_name,lc.populationASpopulation,c.county_idAScounty_id,c.county_nameAScounty_name,c.car_plate_codeAScar_plate_code,r.region_idASregion_id,r.region_nameASregion_nameFROMlocal_councilsASlcJOINcountiesAScON(lc.county_id=c.county_id)JOINregionsASrON(c.region_id=r.region_id)Eccotutto,questalastessaidenticainterrogazioneriscrittaconlasintassialternativa:l' usodellaclausolaJOIN...ON(...)rendepiesplicito quellochestaavvenendo.lacondizioneJOINscrittadirettamentenell' espressione ON(...):inquestomodoilcomandodiinterroigazionemegliostrutturatoepileggibile.comunque,tuttoquestosemplicementeuno zuccherino a livello di sintassi:nonc' nessunadifferenza fraiduecomandiinterminifunzionali.

    55

    SpatiaLite Cookbook

    FilippoTextBoxFebrraio 2011

    FilippoText BoxRicetta # 3:Maggiori informazioni su JOIN

  • SELECTr.region_nameASregion,c.county_nameAScounty,lc.lc_nameASlocal_council,lc.populationASpopulationFROMregionsASrJOINcountiesAScON(c.region_id=r.region_id)JOINlocal_councilsASlcON(c.county_id=lc.county_idANDlc.population>100000)ORDERBYr.region_name,county_name

    ABRUZZO PESCARA PESCARA 116286

    CALABRIA REGGIO DI CALABRIA REGGIO DI CALABRIA 180353

    CAMPANIA NAPOLI NAPOLI 1004500

    CAMPANIA SALERNO SALERNO 138188

    EMILIA-ROMAGNA BOLOGNA BOLOGNA 371217

    ... ... ... ...

    regioncountylocal_councilpopulation

    Nonc'nientedistranoinquestainterrogazione:

    abbiamosemplicementeintrodottounaulterioreclausolaON (... AND lc.population < 100000),

    cosdaescludereiComunipocopopolosi.

    SELECTr.region_nameASregion,c.county_nameAScounty,lc.lc_nameASlocal_council,lc.populationASpopulationFROMregionsASrJOINcountiesAScON(c.region_id=r.region_id)LEFTJOINlocal_councilsASlcON(c.county_id=lc.county_idANDlc.population>100000)ORDERBYr.region_name,county_name

    56

    SpatiaLite Cookbook

  • ABRUZZO CHIETI NULL NULL

    ABRUZZO L'AQUILA NULL NULL

    ABRUZZO PESCARA PESCARA 116286

    ABRUZZO TERAMO NULL NULL

    BASILICATA MATERA NULL NULL

    BASILICATA POTENZA NULL NULL

    ... ... ... ...

    regioncountylocal_councilpopulation

    Apparentementequestainterrogazionelastessadellaprecedente. Mac'unasignificativadifferenza:questavoltaabbiamousatolaclausolaLEFTJOIN: edilrisultatoapparemoltodifferentedaquello precedente.laclausolaJOINnormaleincludernelrisultatosololerigheperlequalisiail terminedisinistrache quellodidestrasoddisfanopositivamentelacondizione.mentrelapisofisticataclausolaLEFTJOINincludertuttelerighedell'elementodi sinistra anche selarelazionenonsoddisfatta:inquestocasorestituisceadestrailvaloreNULL.ViunasignificativadifferenzafraunnormaleJOINeLEFT JOIN.Ritornandoall'esempioprecedente,usandolaclausolaLEFT JOIN sihalagaranziacheogni Regione ed

    ogniProvincia [County]sarannoinseritenelrisultato,anchequellechenonsoddisfanoillimiteimpostodellapopolazionecomunale.

    57

    SpatiaLite Cookbook

  • SQLdisponediunacaratteristicaveramenteutile,lecosiddetteVIEW.Inpochissimeparole,unaVIEWqualcosachestaametfraunaTABELLAedunainterrogazione:laVIEWunoggettopersistente(esattamentecomeleTABELLE).poteteinterrogareunaVIEWesattamenteallostessomododiunaTABELLA:nonc' nessunadifferenza chedistingueunaVIEWdaunaTABELLAdalpuntodivistadelcomandoSELECT.madopotuttounaVIEWassomigliaadunaspeciediinterrogazioneglorificata.UnaVIEWnonha assolutamentedatidipersstessa.IdatichesembranoappartenereallaVIEWsonosemplicementepresi daqualchealtratabellaognivoltachesononecessari.nellaimplementazionediSQLiteogniVIEWunoggettostrettamenteinsolalettura:poteteliberamentefareriferimentoadogni VIEW neicomandi SELECT . ManonconsentitoeseguirecomandiINSERT,UPDATEoDELETEsulleVIEW.Inognicaso,lacosamiglioredifarequalcheeserciziopraticoperintrodurreleViews [Viste].

    CREATEVIEWview_lcASSELECTlc.lc_idASlc_id,lc.lc_nameASlc_name,lc.populationASpopulation,c.county_idAScounty_id,c.county_nameAScounty_name,c.car_plate_codeAScar_plate_code,r.region_idASregion_id,r.region_nameASregion_name,lc.geometryASgeometryFROMlocal_councilsASlcJOINcountiesAScON(lc.county_id=c.county_id)JOINregionsASrON(c.region_id=r.region_id)

    Evoila,questalavostraprimaVIEW:banalmente,assomigliaesattamentealleinterrogazioni(query)cheavetevistofinora.salvoquestoquestavoltalaprimalinea:CREATEVIEW...ASequestal'unicadifferenzasintatticachetransformaunasempliceinterrogazioneinunaVIEW.

    58

    SpatiaLite Cookbook

    FilippoTextBoxFebbraio 2011

    FilippoText BoxRicetta # 4:ApropositodiVIEW

  • SELECTlc_name,population,county_nameFROMview_lcWHEREregion_name='LAZIO'ORDERBYlc_name

    lc_name population county_nameAccumoli 724 RIETI

    Acquafondata 316 FROSINONE

    ACQUAPENDENTE 5788 VITERBO

    ACUTO 1857 FROSINONE

    AFFILE 1644 ROMA

    ... ... ...

    AdessopoteteinterrogarequestaVIEW.

    SELECTregion_name,Sum(population)ASpopulation,(Sum(ST_Area(geometry))/1000000.0)AS"area(sq.Km)",(Sum(population)/(Sum(ST_Area(geometry))/1000000.0))AS"popDensity(peoples/sq.Km)"FROMview_lcGROUPBYregion_idORDERBY4

    region_name population area (sq.Km) popDensity (peoples/sq.Km)VALLE D'AOSTA 119548 3258.405868 36.689107

    BASILICATA 597768 10070.896921 59.355984

    ... ... ... ...

    MARCHE 1470581 9729.862860 151.140979

    TOSCANA 3497806 22956.355019 152.367656

    ... ... ... ...

    LOMBARDIA 9032554 23866,529331 378.461144

    CAMPANIA 5701931 13666.322146 417.224981

    PoteteeseguireinterrogazionianchemoltocomplessesulleVIEW.

    59

    SpatiaLite Cookbook

  • SELECTv.lc_nameASLocalCouncil,v.county_nameASCounty,v.region_nameASRegionFROMview_lcASvJOINlocal_councilsASlcON(lc.lc_name='NORCIA'ANDST_Touches(v.geometry,lc.geometry))ORDERBYv.lc_name,v.county_name,v.region_name

    LocalCouncil County RegionAccumoli RIETI LAZIO

    Arquata del Tronto ASCOLI PICENO MARCHE

    CASCIA PERUGIA UMBRIA

    Castelsantangelo SUL NERA MACERATA MARCHE

    CERRETO DI SPOLETO PERUGIA UMBRIA

    Cittareale RIETI LAZIO

    Montemonaco ASCOLI PICENO MARCHE

    PRECI PERUGIA UMBRIA

    PoteteeseguireinJOINunaVIEWeunaTABELLA(odueVIEW,ecosvia...)Unapiccolaspiegazione:questoJOINinrealtbasatosullerelazioniSpatial:ilrisultatorappresentalalistadeicomunicheconfinanoconquellodiNorcia.Potetevedereesempipicomplessiqui(ricettediAltaCucina).L'opzioneVIEWunadellepipotenti e brillanti meccanismi supportatidaSQL.El' implementazionediSQLitediVIEWsicuramentediprimolivello.DovresteusareleVIEWpispessochepotete:eviaccorgeretechemaneggiareinquestomodostruttureDBveramentecomplessediventaungiocodaragazzi.Prendetenota:interrogareunaVIEWpuesserepiveloceed efficiente rispetto all' interrogazione di unaTABELLA.MalaVIEWnonpucomunqueesserepiefficientedell'interrogazionesottostanteunainterrogazioneprogettatamaleemaleottimizzatasitradurrcertamenteinunaVIEWmoltolenta.

    60

    SpatiaLite Cookbook

  • Adesso siete consapevoli che le prestazioni e l'efficienza complessive di SQL sono strettamente legate alla struttura sottostante al database, ad es. le seguenti scelte progettuali sono critiche: la definizione delle tabelle (e delle colonne) nel modo pi appropriato. l' identificazione delle relazioni di connessione delle diverse tabelle. l' uso per le relazioni di uso frequente di appropriati indici. la definizione di utili vincoli, cos da preservare al massimo la correttezza e la consistenza dei dati. E' ora di approfondire in dettaglio questi argomenti. Avvertenza pedante: nel gergo DBMS/SQL tutto questo chiamato complessivamente come DDL [Data Def ini t ion Language Linguaggio di Def iniz ione dei Dati ] , a l contrar io del DML [Data Manipulation Language Linguaggio di Manipolazione dei Dati], come SELECT, INSERT e cos via.

    CREATE TABLE peoples (

    first_name TEXT,

    last_name TEXT,

    age INTEGER,

    gender TEXT, phone TEXT)

    Questa istruzione creer una semplice tabella di nome peoples:

    la definizione di ogni singola colonna deve almeno specificare il tipo di dato da usare, come TEXT o

    INTEGER prendete nota: la gestione dei tipi in SQLite differisce sensibilmente da quella di altri DMBS: ma lo vedremo pi in dettaglio successivamente.

    61

    SpatiaLite Cookbook

    FilippoText BoxFebbraio 2011

    FilippoText BoxRicetta # 5:Creazione di una nuova tabella(con annessi e connessi)

  • CREATE TABLE peoples2 (

    id INTEGER NOT NULL

    PRIMARY KEY AUTOINCREMENT,

    first_name TEXT NOT NULL,

    last_name TEXT NOT NULL,

    age INTEGER

    CONSTRAINT age_verify

    CHECK (age BETWEEN 18 AND 90),

    gender TEXT

    CONSTRAINT gender_verify

    CHECK (gender IN ('M', 'F')),

    phone TEXT)

    Questa una versione molto pi sofisticata della stessa tabella: abbiamo aggiunto una colonna id, dichiarata come PRIMARY KEY AUTOINCREMENT inserire l'opzione PRIMARY KEY su ogni tabella davvero una scelta fortemente consigliabile

    dichiarare una clausola AUTOINCREMENT chieder a SQLite di generare automaticamente un valore univoco per questa chiave

    abbiamo aggiunto una clausola NOT NULL per le colonne first_name e last_name: questo imporr un primo tipo di vincolo: i valori NULL non saranno accettati per queste colonne in altre parole, first_name e last_name devono assolutamente contenere qualche valore esplicito.

    abbiamo aggiunto un' istruzione CONSTRAINT ... CHECK (...) per le colonne age and gender. questo definisce un secondo tipo di vincolo: i valori che non soddisfano il criterio di CHECK (...) saranno scartati. la colonna et ora accetter solo valori ragionevoli per l'et di persone adulte e la colonna gender accetter solo i valori 'M' o 'F'. attenzione: non abbiamo dichiarato la clausola NOT NULL, cos age = NULL e gender = NULL

    saranno considerati valori ammessi.

    62

    SpatiaLite Cookbook

  • A proposito dei tipi di SQLite Detto molto velocemente: SQLite non usa per niente tipi di dati. Siete assolutamente liberi di inserire qualsiasi tipo di dato in qualsiasi colonna: il tipo dichiarato per i dati della colonna ha solo funzione estetica, me non controllato n obbligato. Questo non per niente un bug: una specifica scelta di progetto.Comunque, tutti gli altri DBMS applicano precise qualificazione e controlli di tipo, perci il comportamento di SQLite pu apparire strano e sconcertante. Siete avvertiti. In ogni caso SQLite gestisce internamente i seguenti tipi di dato: NULL: nessun dato. INTEGER : interi a 64bit, in grado di gestire valori molto grandi. DOUBLE: tipo decimale, doppia precisione.

    TEXT: qualsiasi stringa di testo con codifica UTF8, di lunghezza arbitraria.

    BLOB : qualsiasi Oggetto Binario Lungo [Binary Long Object], di lunghezza arbitraria ed illimitata.

    Ricordate: qualsiasi cella (intersezione di riga/colonna) pu memorizzare ogni tipo arbitrario di dato.Esiste una sola eccezione: le colonne dichiarate come INTEGER PRIMARY KEY richiedono assolutamente

    valori interi.

    ALTER TABLE peoples2

    ADD COLUMN cell_phone TEXT

    Potete aggiungere in qualsiasi momento altre colonne alla tabella. Ancora alcune specifiche scelte di progetto di SQLite. non consentita l' eliminazione di colonne non consentita rinominare colonne. cio una volta che avete creato la colonna non c' modo per cambiare la definizione iniziale.

    ALTER TABLE peoples2

    RENAME TO peoples_ok

    Siete invece assolutamente liberi di cambiare il nome alla tabella.

    DROP TABLE peoples

    E questo canceller completamente la tabella (e tutto il suo contenuto) dal DB.

    CREATE INDEX idx_peoples_phone

    ON peoples_ok (phone)

    Questa istruzione creer un indice.

    63

    SpatiaLite Cookbook

  • DROP INDEX idx_peoples_phone

    E questo distrugger lo stesso indice.

    CREATE UNIQUE INDEX idx_peoples_name

    ON peoples_ok (last_name, first_name)

    un indice pu essere creato su pi colonne. specificando la clausola UNIQUE si attiva un ulteriore vincolo: se il valore gi presente in tabella, non sar consentita alcuna ulteriore immissione di quel valore.

    PRAGMA table_info(peoples_ok)

    cid Name typ notnull dflt_value pk0 id INTEGER 1 NULL 1

    1 first_name TESTO 1 NULL 0

    2 last_name TESTO 1 NULL 0

    3 et INTEGER 0 NULL 0

    4 di genere TESTO 0 NULL 0

    5 telefono TESTO 0 NULL 0

    6 cell_phone TESTO 0 NULL 0

    PRAGMA index_list(peoples_ok)

    ss Nome unico

    0 idx_peoples_phone 0

    1 idx_peoples_name 1

    PRAGMA index_info(idx_peoples_name)

    seqno cid Nome

    0 2 last_name

    1 1 first_name

    E usando le istruzioni PRAGMA index_list(...) e PRAGMA index_info(...) potete facilmente

    ontrollare l' organizzazione degli indici.

    64

    SpatiaLite Cookbook

  • Ora esamineremo in maggior dettaglio come definire correttamente una colonna di tipo Geometry. SpatiaLite segue molto da vicino l' approccio adottato da PostgreSQL/PostGIS cio non consentita la creazione della Geometry contemporaneamente alla creazione della relativa tabella. Dovete sempre creare prima la tabella e poi, in un secondo momento, aggiungere la colonna Geometry con un atto separato.

    CREATE TABLE test_geom ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, measured_value DOUBLE NOT NULL)

    SELECT AddGeometryColumn('test_geom', 'the_geom',

    4326, 'POINT', 'XY')

    Questo l'unico modo disponibile per avere una Geometry completamente valida. Qualsiasi metodo diverso produrr una Geometry errata ed inaffidabile.

    SELECT AddGeometryColumn('test_geom', 'the_geom',

    4326, 'POINT', 'XY', 0)

    SELECT AddGeometryColumn('test_geom', 'the_geom',

    4326, 'POINT', 'XY', 1)

    Per quanto la precedente sia la modalit sicuramente pi usata, la forma completa disponibile di GeometryColumn() questa: l'ultimo argomento (opzionale) al momento vale: NOT NULL selezionando il valore ZERO (che il valore predefinito in caso di omissione) la colonna Geometry

    accetter valori NULL. altrimenti saranno accettati solo valori NOT NULL.

    SRID disponibili: qualsiasi SRID definito nella tabella metadata spatial_ref_sys. il valore 1 indica uno SRS ignoto o non specificato.

    65

    SpatiaLite Cookbook

    FilippoText BoxFebbraio 2011

    FilippoText BoxRicetta # 6:Creare una nuova colonnaGeometry

  • Tipi Geometry disponibiliGeometry Type Notes

    LINESTRING

    POLYGON

    MULTIPOINT

    MULTILINESTRING

    MULTIPOLYGON

    GEOMETRYCOLLECTION

    GEOMETRY

    sono le pi usate corrispondono alle specifiche Shapefile disponibili su ogni applicativo GIS per desktop

    POINT

    poco usata non disponibile nei Shapefile e sugli applicativi GIS per desktop

    un contenitore generico che consente qualsiasi classe Geometry poco usato non disponibile nei Shapefile e sugli applicativi GIS per desktop

    Modelli Dimensionali disponibili

    Dimension model Alias Notes

    XY 2 coordinate X e Y (2D semplice)

    XYZ 3 coordinate X, Y e Z (3D)

    XYM coordinate X e Y+ un valore M

    XYZM coordinate X,Y e Z + un valore M Fate attenzione: questo un errore molto frequente. Molti sviluppatori, professionisti GIS e simili pensano di essere pi furbi e spesso tendono ad inventare qualche modalit molto fantasiosa di creare le proprie

    Geometries. ad es. pasticciare in qualche modo la tabella geometry_columns sembra essere una pratica

    molto popolare.