opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

[GIS] dataset puntuale province italiane #64

Closed pigreco closed 5 years ago

pigreco commented 5 years ago

Cerco il dataset puntuale dei capoluoghi di provincia italiani e non riesco a trovarlo, ho cercato:

  1. sito ISTAT - Località puntuali italiane; è un dataset (shp) pesante con tutte le località e riesce difficile (se non impossibile) capire come selezionare solo i capoluoghi;
  2. sito Geonames è un dataset testuale (txt) con le coordinate ma è senza intestazione e riesce difficile seguire il relativo readme con le spiegazioni dei campi;

come posso ovviare a questi problemi? dove posso scaricare questo dataset??

aborruso commented 5 years ago

EDIT: ho modificato un po' la query SPARQL


Caro @pigreco, questa richiesta mi fa venire il nervoso, perché penso che in Italia l'Istituto Geografico Militare non offre nessun servizio, nemmeno per fare una richiesta di base come la tua. E poi ci domandiamo perché i dati aperti in Italia non "sfondano"?

geonames

Nel readme trovi i nomi dei campi:

geonameid         : integer id of record in geonames database
name              : name of geographical point (utf8) varchar(200)
asciiname         : name of geographical point in plain ascii characters, varchar(200)
alternatenames    : alternatenames, comma separated, ascii names automatically transliterated, convenience attribute from alternatename table, varchar(10000)
latitude          : latitude in decimal degrees (wgs84)
longitude         : longitude in decimal degrees (wgs84)
feature class     : see http://www.geonames.org/export/codes.html, char(1)
feature code      : see http://www.geonames.org/export/codes.html, varchar(10)
country code      : ISO-3166 2-letter country code, 2 characters
cc2               : alternate country codes, comma separated, ISO-3166 2-letter country code, 200 characters
admin1 code       : fipscode (subject to change to iso code), see exceptions below, see file admin1Codes.txt for display names of this code; varchar(20)
admin2 code       : code for the second administrative division, a county in the US, see file admin2Codes.txt; varchar(80) 
admin3 code       : code for third level administrative division, varchar(20)
admin4 code       : code for fourth level administrative division, varchar(20)
population        : bigint (8 byte int) 
elevation         : in meters, integer
dem               : digital elevation model, srtm3 or gtopo30, average elevation of 3''x3'' (ca 90mx90m) or 30''x30'' (ca 900mx900m) area in meters, integer. srtm processed by cgiar/ciat.
timezone          : the iana timezone id (see file timeZone.txt) varchar(40)
modification date : date of last modification in yyyy-MM-dd format

L'elenco di feature class e feature code è come scritto sopra qui http://www.geonames.org/export/codes.html

Tu sei interessato alla feature class P, city, village,...

In questa, potresti guardare la feature code PPLA2, perché in "letteratura" le province sono le suddivisioni di secondo livello e partire dal file geonames per l'Italia e dare (con Miller):

mlr --n2c --ifs "\t"  filter -S '$8=="PPLA2"' IT.txt  >provinceIT.csv

Non è ancora la risposta che cerchi e magari lì dentro non c'è, ma magari ti è utile come ragionamento.

Ti potrebbe essere utile, per risalire alle gerarchie un altro file citato nel readme: admin2Codes.txt.

wikidata

Wikidata è la base dati forse più preziosa, ma anche tra le meno utilizzate. Potresti fare una query che ti da in output gli elementi classificati come Q15089 ovvero "provincia d'Italia": https://w.wiki/3Hb

È frutto di una questa query SPARQL (io sono una schiappa, chiedo correzioni a @gpirrotta e @dataibi ):

SELECT ?provincia ?provinciaLabel ?capoluogo ?capoluogoLabel ?coordinate ?istatIDProvincia ?GeoNamesIDCapoluogo WHERE {
?provincia wdt:P31 wd:Q15089.
?provincia wdt:P635 ?istatIDProvincia.
?provincia p:P31 ?statement .    
OPTIONAL { ?provincia wdt:P36 ?capoluogo.
          OPTIONAL { ?capoluogo wdt:P625 ?coordinate;
          wdt:P1566 ?GeoNamesIDCapoluogo. } 
} 
FILTER NOT EXISTS { ?statement pq:P582 ?x } 
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". }
}
ORDER BY ?istatIDProvincia

Se vuoi scaricare il risultato in CSV con curl è:

curl "https://query.wikidata.org/sparql?query=SELECT%20%3Fprovincia%20%3FprovinciaLabel%20%3Fcapoluogo%20%3FcapoluogoLabel%20%3Fcoordinate%20%3FistatIDProvincia%20%3FGeoNamesIDCapoluogo%20WHERE%20%7B%0A%3Fprovincia%20wdt%3AP31%20wd%3AQ15089%20.%0A%3Fprovincia%20wdt%3AP635%20%3FistatIDProvincia.%0A%20%20OPTIONAL%20%7B%0A%20%20%20%20%3Fprovincia%20wdt%3AP36%20%3Fcapoluogo%20.%0A%20%20%20%20%3Fcapoluogo%20wdt%3AP625%20%3Fcoordinate%20.%0A%20%20%20%20%3Fcapoluogo%20wdt%3AP1566%20%3FGeoNamesIDCapoluogo%20.%0A%20%20%20%20%7D%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22it%2Cit%22.%20%7D%0A%7D%0AORDER%20BY%20%3FistatIDProvincia" \
-H "Accept: text/csv"

Ho inserito, per fare verifiche con i dati aggiornati sulle province, anche il codice a tre caratteri ISTAT. E poi ho aggiunto anche il codice geonames, sempre per incroci, ecc., ecc.. Tutto grazie alla ricchezza di wikidata.


La prima modalità, verificato che c'è quello che cerchi, la puoi gestire in modo egregio in autonomia. La seconda richiede un po' di studio di SPARQL e di WikiData, cosa che non posso esplodere in una issue :)

aborruso commented 5 years ago

@dataibi perché in questa query non si ha in output il capoluogo della provincia di Genova?

Di Aosta, ci sta, perché credo non esista più come provincia, ma di Genova non capisco, perché la provincia ha la sua capital.

Grazie

aborruso commented 5 years ago

@dataibi l'ho modificata un po', gestendo gli OPTIONAL, e adesso ho la "capitale" della provincia, ma non le coordinate. Cosa sbaglio ancora?

pigreco commented 5 years ago

@aborruso grazie per le due soluzioni;

geonames

ho usato:

mlr --n2c --ifs "\t"  filter -S '$8=="PPLA2"||$8=="PPLA"||$8=="PPLC"' IT.txt  >provinceIT2.csv

per migliorare il filtro e ottenere 110 record

image

wikidata

ho usato la tua ultima query che resituisce 111 record

dataibi commented 5 years ago

Ho visto meglio la struttura di Wikidata e la query andrebbe scritta così:

SELECT ?provincia ?provinciaLabel ?capoluogo ?capoluogoLabel ?coordinate ?istatIDProvincia ?GeoNamesIDCapoluogo WHERE { ?provincia wdt:P31 wd:Q15089. ?provincia wdt:P635 ?istatIDProvincia. OPTIONAL { ?provincia wdt:P36 ?capoluogo. ?capoluogo p:P625 ?p . ?p ps:P625 ?coordinate . ?capoluogo wdt:P1566 ?GeoNamesIDCapoluogo. }

SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". } } ORDER BY ?istatIDProvincia

Questa restituisce 117 risultati.

Rimane fuori sempre Aosta, ma come hai detto tu ci potrebbe stare.

Spero sia utile.

Davide

Il giorno 24 apr 2019, alle ore 21:55, Salvatore Fiandaca notifications@github.com<mailto:notifications@github.com> ha scritto:

@aborrusohttps://github.com/aborruso grazie per le due soluzioni;

geonames

ho usato:

mlr --n2c --ifs "\t" filter -S '$8=="PPLA2"||$8=="PPLA"||$8=="PPLC"' IT.txt >provinceIT2.csv

per migliorare il filtro e ottenere 110 record

[image]https://user-images.githubusercontent.com/7631137/56689324-1eac7380-66db-11e9-97d5-e368ae9d37ab.png

wikidata

ho usato la tua ultima queryhttps://query.wikidata.org/#SELECT%20?provincia%20?provinciaLabel%20?capoluogo%20?capoluogoLabel%20?coordinate%20?istatIDProvincia%20?GeoNamesIDCapoluogo%20WHERE%20%7B%0A?provincia%20wdt:P31%20wd:Q15089.%0A?provincia%20wdt:P635%20?istatIDProvincia.%0A?provincia%20p:P31%20?statement.%0AOPTIONAL%20%7B%20?provincia%20wdt:P36%20?capoluogo.%0A%20%20%20%20%20%20%20%20%20%20OPTIONAL%20%7B%20?capoluogo%20wdt:P625%20?coordinate;%0A%20%20%20%20%20%20%20%20%20%20wdt:P1566%20?GeoNamesIDCapoluogo.%20%7D%0A%7D%20%0AFILTER%20NOT%20EXISTS%20%7B%20?statement%20pq:P582%20?x%20%7D%0ASERVICE%20wikibase:label%20%7B%20bd:serviceParam%20wikibase:language%20%22%5BAUTO_LANGUAGE%5D,it%22.%20%7D%0A%7D%0AORDER%20BY%20?istatIDProvincia che resituisce 111 record

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/opendatasicilia/tansignari/issues/64#issuecomment-486401640, or mute the threadhttps://github.com/notifications/unsubscribe-auth/ADVGOYUZMPQPJE6SSV6HUMTPSC3MLANCNFSM4HIDDFMQ.

aborruso commented 5 years ago

Caro @dataibi innanzitutto benvenuto!

Ho modificato la tua query aggiungendo i criteri che (se non ho fatto errori) escludono tutte le provincie - come Aosta - che hanno un end time.

SELECT ?provincia ?provinciaLabel ?capoluogo ?capoluogoLabel ?coordinate ?istatIDProvincia ?GeoNamesIDCapoluogo WHERE {
?provincia wdt:P31 wd:Q15089.
?provincia wdt:P635 ?istatIDProvincia.
?provincia p:P31 ?statement.
OPTIONAL { ?provincia wdt:P36 ?capoluogo.
          ?capoluogo p:P625 ?p .
          ?p ps:P625 ?coordinate .
          ?capoluogo wdt:P1566 ?GeoNamesIDCapoluogo.
}
FILTER NOT EXISTS { ?statement pq:P582 ?x }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". }
}
ORDER BY ?istatIDProvincia

Nella tua query per puntare alle coordinate usi come qualifier p:. Aggiungo per tutti questa nota dalla guida ufficiale:

So far, we’ve used the wdt: prefix for our statement triples, which points directly to the object of the statement. But there’s also another prefix: p:, which points not to the object, but to a statement node. This node then is the subject of other triples: the prefix ps: (for property statement) points to the statement object, the prefix pq: (property qualifier) to qualifiers, and prov:wasDerivedFrom points to reference nodes (which we’ll ignore for now).

Il caso Genova

Ma visto che abbiamo il privilegio di averti tra noi, ne approfitto per capire un po' di più. La mia prima versione di query aveva questa struttura:

SELECT ?provincia ?provinciaLabel ?capoluogo ?capoluogoLabel ?coordinate  WHERE {
?provincia wdt:P31 wd:Q15089.
?provincia wdt:P635 ?istatIDProvincia.
OPTIONAL { ?provincia wdt:P36 ?capoluogo.
          ?capoluogo wdt:P625 ?coordinate.
}

SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". }
}

ORDER BY ?coordinate

La domanda che ti faccio è: perché con la "mia" sintassi non ho le coordinate del capoluogo di provincia di Genova?

L'utilizzo di OPTIONAL

Nella bella guida a SPARQL di Wikidata c'è una sezione su OPTIONAL. Con OPTIONAL (lo dico per chi sa poco, come me) consente di inserire alcuni parametri della query come opzionali, e avere risultati anche per quegli elementi che non li rispettano (avere tutti i capoluoghi di provincia, anche quelli per cui non è stata aggiunta una coppia di coordinate).

Nella guida, in quella sezione si legge:

Note: it’s very important to use separate OPTIONAL clauses here.

Se io cambio l'ultima query pertanto in

SELECT ?provincia ?provinciaLabel ?capoluogo ?capoluogoLabel ?coordinate  WHERE {
?provincia wdt:P31 wd:Q15089.
?provincia wdt:P635 ?istatIDProvincia.
OPTIONAL { ?provincia wdt:P36 ?capoluogo.}
OPTIONAL { ?capoluogo wdt:P625 ?coordinate.}

SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". }
}

ORDER BY ?coordinate

Wikidata vai in timeout. Immagino che sia corretto e che quest'ultima sia in qualche modo sbagliata. Mi aiuti a capire perché e come conciliare la cosa con il suggerimento letto nella guida.

Grazie

dataibi commented 5 years ago

Ciao Andrea,

la risposta alla prima domanda è semplice Wikidata non contiene la tripla

wd:Q1449 wdt:P625 ?o

(wd:Q1449 è la città di Genova)

L’assenza di questa tripla la puoi vedere anche da qui:

select distinct ?p where { wd:Q1449 ?p ?o } order by ?p

Per come riportano loro nella nota con wdt: non dovrebbe essere necessario passare da p: e ps: (se ho capito bene) però sembra che Genova faccia eccezione :-)

Comunque per le altre città la tripla

wdt:P625 ?o la trovo. A dopo, Davide Il giorno 25 apr 2019, alle ore 09:04, Andrea Borruso > ha scritto: Caro @dataibi innanzitutto benvenuto! Ho modificato la tua query aggiungendo i criteri che (se non ho fatto errori) escludono tutte le provincie - come Aosta - che hanno un end time. SELECT ?provincia ?provinciaLabel ?capoluogo ?capoluogoLabel ?coordinate ?istatIDProvincia ?GeoNamesIDCapoluogo WHERE { ?provincia wdt:P31 wd:Q15089. ?provincia wdt:P635 ?istatIDProvincia. ?provincia p:P31 ?statement. OPTIONAL { ?provincia wdt:P36 ?capoluogo. ?capoluogo p:P625 ?p . ?p ps:P625 ?coordinate . ?capoluogo wdt:P1566 ?GeoNamesIDCapoluogo. } FILTER NOT EXISTS { ?statement pq:P582 ?x } SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". } } ORDER BY ?istatIDProvincia Nella tua query per puntare alle coordinate usi come qualifier p:. Aggiungo per tutti questa nota dalla guida ufficiale: So far, we’ve used the wdt: prefix for our statement triples, which points directly to the object of the statement. But there’s also another prefix: p:, which points not to the object, but to a statement node. This node then is the subject of other triples: the prefix ps: (for property statement) points to the statement object, the prefix pq: (property qualifier) to qualifiers, and prov:wasDerivedFrom points to reference nodes (which we’ll ignore for now). Il caso Genova Ma visto che abbiamo il privilegio di averti tra noi, ne approfitto per capire un po' di più. La mia prima versione di query aveva questa struttura: SELECT ?provincia ?provinciaLabel ?capoluogo ?capoluogoLabel ?coordinate WHERE { ?provincia wdt:P31 wd:Q15089. ?provincia wdt:P635 ?istatIDProvincia. OPTIONAL { ?provincia wdt:P36 ?capoluogo. ?capoluogo wdt:P625 ?coordinate. } SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". } } ORDER BY ?coordinate La domanda che ti faccio è: perché con la "mia" sintassi non ho le coordinate del capoluogo di provincia di Genova? L'utilizzo di OPTIONAL Nella bella guida a SPARQL di Wikidata c'è una sezione su OPTIONAL. Con OPTIONAL (lo dico per chi sa poco, come me) consente di inserire alcuni parametri della query come opzionali, e avere risultati anche per quegli elementi che non li rispettano (avere tutti i capoluoghi di provincia, anche quelli per cui non è stata aggiunta una coppia di coordinate). Nella guida, in quella sezione si legge: Note: it’s very important to use separate OPTIONAL clauses here. Se io cambio l'ultima query pertanto in SELECT ?provincia ?provinciaLabel ?capoluogo ?capoluogoLabel ?coordinate WHERE { ?provincia wdt:P31 wd:Q15089. ?provincia wdt:P635 ?istatIDProvincia. OPTIONAL { ?provincia wdt:P36 ?capoluogo.} OPTIONAL { ?capoluogo wdt:P625 ?coordinate.} SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". } } ORDER BY ?coordinate Wikidata vai in timeout. Immagino che sia corretto e che quest'ultima sia in qualche modo sbagliata. Mi aiuti a capire perché e come conciliare la cosa con il suggerimento letto nella guida. Grazie — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.
aborruso commented 5 years ago

Caro @dataibi

Per come riportano loro nella nota con wdt: non dovrebbe essere necessario passare da p: e ps: (se ho capito bene) però sembra che Genova faccia eccezione :-)

quindi c'è "puzza di bruciato", non sono completamente scemo.

Vado a chiedere ai wikidatatiani e poi vi dico.

Grazie

aborruso commented 5 years ago

@dataibi mi hanno risposto da wikidata su questo

Per come riportano loro nella nota con wdt: non dovrebbe essere necessario passare da p: e ps: (se ho capito bene) però sembra che Genova faccia eccezione :-)

Mi hanno invitato a leggere questa pagina https://m.mediawiki.org/wiki/Wikibase/Indexing/RDF_Dump_Format#Truthy_statements , ma leggendola io non capisco perché soltanto per Genova non avviene quello che avviene per gli altri casi.

aborruso commented 5 years ago

@pigreco le suddivisioni amministrative in Italia sono complesse. Ho creato una query in cui ho aggiunto le città metropolitane.

SELECT ?UA ?UALabel ?tipoLabel ?istatIDUA ?capoluogo ?capoluogoLabel ?istatIDCapoluogo ?coordinate ?GeoNamesIDCapoluogo WHERE {
{# le "province di Italia"
    ?UA wdt:P31 wd:Q15089.
    ?UA wdt:P635 ?istatIDUA.
    ?UA p:P31 ?statement.
    ?UA wdt:P31 ?tipo.
    OPTIONAL { ?UA wdt:P36 ?capoluogo.}
    OPTIONAL { ?capoluogo p:P625 ?pc .}
    OPTIONAL { ?pc ps:P625 ?coordinate .}
    OPTIONAL { ?capoluogo p:P1566 ?pg.}
    OPTIONAL { ?pg ps:P1566 ?GeoNamesIDCapoluogo.}
    OPTIONAL { ?capoluogo p:P635 ?pi.}
    OPTIONAL { ?pi ps:P635 ?istatIDCapoluogo.}
    FILTER(REGEX(STR(?istatIDUA), "^[0-9]{3}$"))
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". }
  }
  UNION {
# le "città metropolitane"
    ?UA wdt:P31 wd:Q15110.
    ?UA p:P31 ?statement.
    ?UA wdt:P31 ?tipo.
    ?UA p:P635 ?p.
    ?p ps:P635 ?istatIDUA .
    OPTIONAL { ?UA wdt:P36 ?capoluogo.}
    OPTIONAL { ?capoluogo p:P625 ?pc .}
    OPTIONAL { ?pc ps:P625 ?coordinate .}
    OPTIONAL { ?capoluogo p:P1566 ?pg.}
    OPTIONAL { ?pg ps:P1566 ?GeoNamesIDCapoluogo.}
    OPTIONAL { ?capoluogo p:P635 ?pi.}
    OPTIONAL { ?pi ps:P635 ?istatIDCapoluogo.}
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],it". }
  }
  FILTER NOT EXISTS { ?statement pq:P582 ?x }
}

order by ?istatIDUA
pigreco commented 5 years ago

@aborruso ricordo che volevi aggiungere qualcosa, altrimenti chiudiamo issue??

ricetta è pronta e in github :-)

aborruso commented 5 years ago

se è pronta, la chiudo

Grazie