User:Mga geo/Adresse/Spatialite
< User:Mga geo | Adresse
Jump to navigation
Jump to search
Spatialite
J'ai décidé d'utiliser Spatialite pour tester ces fonctionnalitées. J'utilise la version 4.0 en 32 bits, la version 64 bits est buggée.
Importation des données adresse de Rennes Métropole
Facile : oui et non !
Deux types de données :
- les géographiques
- en format shapefile Lambert cc48 par exemple
- les listes
- en format csv
Pour le format csv :
- encodage : CP1252 ?
- voies : délimiteur ",", champs minuscules
- troncons : délimiteur ";", champs majuscules
- voies_troncons : délimiteur ",", champs majuscules
SELECT "osm_rva_adresses() chargement table:rva_adresses"; DROP TABLE IF EXISTS rva_adresses; .loadshp d:/web.var/geo/RENNES/rva_adresses rva_adresses CP1252 3948
Importation des données adresse d'OSM
Les pages de référence :
- http://wiki.openstreetmap.org/wiki/FR:Key:addr
- http://wiki.openstreetmap.org/wiki/Proposed_features/Fr:Num%C3%A9rotation_des_rues
Les deux clés de base sont :
- addr:housenumber
- addr:street
Sans addr:street, retrouver la rue est un peu complexe !
Les numéros sont affectés sur un tag "node" ou "way". Pour les "way", on a un tag "building" et une série de "node" représentant le contour de ce "building"
- simple pour commencer : interrogation via xapi
<union> <query type="way"> <bbox-query s="$s" n="$n" w="$w" e="$e"/> <has-kv k="highway"/> </query> <query type="way"> <bbox-query s="$s" n="$n" w="$w" e="$e"/> <has-kv k="addr:housenumber"/> </query> <recurse type="way-node"/> </union> <print order="quadtile"/>
- importation dans une base de données
- transformation des nodes en ligne
SELECT "osm_lines_way()"; -- création des lignes à partir des nodes composant une way DROP TABLE IF EXISTS lines_way; CREATE TABLE lines_way AS SELECT w.way_id AS way_id, MakeLine(n.geometry) AS geometry FROM osm_way_refs AS w JOIN osm_nodes AS n ON (n.node_id = w.node_id) GROUP BY w.way_id ORDER BY w.way_id, w.sub; SELECT RecoverGeometryColumn('lines_way', 'geometry', 4326, 'LINESTRING', 'XY');
- ajout des tags addr:housenumber et addr:street
SELECT "osm_housenumber()"; DROP TABLE IF EXISTS housenumber; CREATE TABLE housenumber AS SELECT lines_way.* , join1.v as 'housenumber' , join2.v as 'street' FROM lines_way LEFT OUTER JOIN osm_way_tags as join1 ON (lines_way.way_id = join1.way_id AND join1.k = 'addr:housenumber') LEFT OUTER JOIN osm_way_tags as join2 ON (lines_way.way_id = join2.way_id AND join2.k = 'addr:street') -- WHERE lines_way.way_id = '41896354' ; SELECT "osm_housenumber()"; SELECT COUNT(*) FROM housenumber ; SELECT * FROM housenumber LIMIT 100 ;