Stations Vélib’ : v2.0
Par Olivier Mengué le dimanche 12 août 2007, 23:15 - Code - Lien permanent
Voici une nouvelle version de mon script de conversion des stations Vélib’ en base POI pour Maemo Mapper sur Nokia N800 (voir mon post précédent).
Parmi les améliorations :
- un script pour automatiser le processus de transformation
- le renseignement du champ
poi_id
, ce qui corrige le problème d'édition des POI - un index sur la table
POI
sur les champs latitude, longitude en espérant que cela améliore les temps d'accès. En pratique, je n'ai constaté aucune amélioration ; - 4 catégories de POI au lieu d'une seule, pour créer votre propre base des stations : Station Vélib’, Station Vélib’ corrigée, Station Vélib’ validée, Station Vélib’ erronée ;
- des modifications d'implémentaiton XSLT : l'utilisation de
xsl:foreach
et un traitement exhaustif des caractères de l'adresse de la station.
Lisez la suite pour le nouveau code...
Relisez d'abord le post précédent comme introduction.
Voici le script pour Windows stations2mm.cmd
:
@echo off xsltproc -o %~dpn1.sql %~dpn0.xslt %1 || goto :EOF if exist velib-poi.db del velib-poi.db echo .q| sqlite3 -batch -init %~dpn1.sql velib-poi.db
Pour le lancer :
C:\Users\Moi\Documents\Vélib'>stations2mm stations.xml
Voici la nouvelle feuille de style stations2mm.xslt
. Le nombre de lignes a doublé simplement pour l'échappement correct des apostrophes.
<?xml version="1.0" encoding="UTF-8"?> <!-- stations2mm.xslt --> <!-- Copyright (c) 2007 Olivier Mengué http://o.mengue.free.fr/ --> <!-- Maemo Mapper POI format: http://eko.one.pl/index.php?page=Nokia770_software#Details --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:strip-space elements="*"/> <xsl:template match="/markers">-- Script SQLite pour construire une base POI des stations Vélib pour Maemo -- Mapper http://gnuite.com:8080/nokia770/maemo-mapper/ (Nokia 770, N800). -- See http://eko.one.pl/index.php?page=Nokia770_software#Details -- -- Créé avec stations2mm.xslt (http://o.mengue.free.fr/) -- -- Pour céer le fichier: -- echo .q | sqlite3 -batch -init stations.sql poi.db PRAGMA encoding = "UTF-8"; CREATE TABLE IF NOT EXISTS category (cat_id INTEGER PRIMARY KEY, label TEXT NOT NULL, desc TEXT, enabled INTEGER NOT NULL); CREATE TABLE IF NOT EXISTS poi (poi_id INTEGER PRIMARY KEY, lat REAL NOT NULL, lon REAL NOT NULL, label TEXT NOT NULL, desc TEXT, cat_id INTEGER NOT NULL); CREATE INDEX IF NOT EXISTS poi_idx_latlon ON poi (lat ASC, lon ASC); -- Placez 'Velib.jpg' dans un sous-répertoire 'poi' de votre dépôt de cartes -- Pas d'accent dans label INSERT INTO category (cat_id, label, desc, enabled) VALUES (30001, 'Velib', 'Station Vélib''', 1); INSERT INTO category (cat_id, label, desc, enabled) VALUES (30002, 'Velib2', 'Station Vélib'' corrigée', 1); INSERT INTO category (cat_id, label, desc, enabled) VALUES (30003, 'Velib3', 'Station Vélib'' validée', 1); INSERT INTO category (cat_id, label, desc, enabled) VALUES (30004, 'Velib4', 'Station Vélib'' erronée', 1); <!-- Ignore les stations dont les coordonnées ne sont pas définies lat=27.1409733745, lng=-3.40456062425 --> <xsl:for-each select="marker[@lat!='27.1409733745']"> <xsl:sort select="@lat" data-type="number"/> <xsl:sort select="@lng" data-type="number"/><!-- -->INSERT INTO poi (poi_id, lat, lon, label, desc, cat_id) VALUES (<xsl:value-of select="30000+position()"/>, <xsl:value-of select="@lat"/>, <xsl:value-of select="@lng"/>, '<xsl:value-of select="@number"/>', '<xsl:call-template name="globalReplace"> <xsl:with-param name="input" select="@address"/> <xsl:with-param name="search" select=""'""/> <xsl:with-param name="replacement" select=""''""/> </xsl:call-template>', 30001); </xsl:for-each> </xsl:template> <!-- Voir http://www.xml.com/pub/a/2002/06/05/transforming.html --> <xsl:template name="globalReplace"> <xsl:param name="input"/> <xsl:param name="search"/> <xsl:param name="replacement"/> <xsl:choose> <xsl:when test="contains($input, $search)"> <xsl:value-of select= "concat(substring-before($input, $search), $replacement)"/> <xsl:call-template name="globalReplace"> <xsl:with-param name="input" select="substring-after($input, $search)"/> <xsl:with-param name="search" select="$search"/> <xsl:with-param name="replacement" select="$replacement"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$input"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
Commentaires
Salut
Merci pour ton script, il m'a rendu de grands services !
2 petites choses : le format du fichier xml semble avoir changé, l'arborescence des balises est maintenant carto/markers au lieu de /markers
avec maemo mapper 2.0, je n'arrive plus à gérer mes POI ! je ne sais pas quel est le format actuel, mais en tout cas impossible d'importer la base de données...
Ah oui, il va effectivement que je publie une nouvelle version. J'avais déjà remarqué le changement et modifié mes pipes Yahoo! puisqu'ils ne marchaient plus.
Concernant Maemo Mapper 2.0, ma base de données de POI fonctionne sans changement. Mis à part tous les bugs de la 2.0 : les POIs ne s'affichent pas quand la carte tourne (mon rapport de bug). Il existe déjà une 2.0.1 qui corrige certains bugs (la fonction "reset" pour la rotation de la carte), mais pas encore ce bug.
Interessant, meme si ca ne marche pas pour moi (mais j'ai essaye que depuis 5 minutes)
Pourquoi pas faire un script kml -> poi.db ? J'aimerai bien transferer mes infos de googleearth sur mon maemomapper ^^