spatialite cookbook ita
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.