User:Mga geo/Adresse/Spatialite

From OpenStreetMap Wiki
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 :

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
;