On 01/20/10 Tiziano D'Angelo wrote: > Volevo chiedervi un paio di questioni. > 1- C'è un modo per ricercare in OSM tutte le relazioni di un dato tipo o con > un dato tag eventualmente in una data area?
Usa XAPI come suggerito, per esempio per una zona di Padova: wget http://www.informationfreeway.org/api/0.6/relation[route=bus][bbox=11.867423989753554,45.41459045126265,11.88459689726845,45.425251791743904] -O padova-routes.xml > 2- Come ho chiesto sulla lista public transport, c'è un modo per esportare > in formato CSV/TXT/Excel/Database i dati delle relation (ad esempio già > selezionate per tipo con la ricerca di cui al punto 1)? Vorrei ottenere una > lista linea per linea con tutte le fermate in ordine andata e ritorno e in > una colonna la lat/long associata. Devi farti un programmino che legga l'XML. > 3- A partire dai dati OSM, vorrei costruire delle mappe del percorso linea > per linea (sullo stile di > http://en.wikipedia.org/wiki/File:Bakerloo_line_Topological_map.svg e > http://en.wikipedia.org/wiki/File:Bakerloo_Line.svg) ed eventualmente > dell'intera rete (solo con la rete, senza mappa sullo sfondo, o > eventualmente quasi trasparente) sia corrispondente alle coordinate > geografiche, sia come schema in stile Parigi/Londra. In pausa pranzo ho scritto un programmino per la versione lineare (non e' completamente parametrizzata ma l'output e' quasi decente e gestisce automaticamente le fermate di linee multiple in base al tag route_ref). La versione in forma di mappa non e' molto piu' complicata. In attach il programma (serve mono e la libreria OpenStreetMap di cui ho postato anche in questa lista tempo fa) e un esempio di rendering. lupus -- ----------------------------------------------------------------- [email protected] debian/rules [email protected] Monkeys do it better
using System;
using System.IO;
using System.Collections.Generic;
using Cairo;
using OpenStreetMap;
class Route {
// gmcs route2svg.cs -r:OpenStreetMap.dll -r:Mono.Cairo
// ./route2svg.exe /tmp/padova-routes.xml 10 linea10.svg
List<Node> stops = new List<Node> ();
Relation route;
public Route (List<OsmObject> data, string routename) {
Dictionary<long,Node> nodes = new Dictionary<long,Node> ();
foreach (OsmObject obj in data) {
Node node = obj as Node;
if (node != null) {
nodes [node.ID] = node;
continue;
}
Relation rel = obj as Relation;
if (rel != null && (rel ["name"] == routename || rel
["ref"] == routename)) {
route = rel;
break;
}
}
if (route == null)
throw new Exception ("Can't find route " + routename);
foreach (RelationMember m in route.Members) {
if (m.Role == "forward_stop")
stops.Add (nodes [m.Ref]);
}
}
static bool HasCrossing (string refs)
{
if (refs == null)
return false;
string[] lines = refs.Split (new char[] {';', ' '}, 2,
StringSplitOptions.RemoveEmptyEntries);
return lines.Length > 1;
}
public void Render (string output) {
int xlen = 40;
int width = (1 + stops.Count) * xlen + 40;
int heigth = 200;
SvgSurface svg = new SvgSurface (output, width, heigth);
using (Context cr = new Context (svg)) {
cr.MoveTo (20, 20);
string desc = string.Format ("Linea: {0} Da {1} a {2}",
route ["name"], route ["from"], route ["to"]);
cr.SetFontSize (15);
cr.ShowText (desc);
int xpos = 20;
cr.LineWidth = 4;
cr.MoveTo (xpos, heigth - 30);
cr.LineTo (xpos + stops.Count * xlen, heigth - 30);
cr.Stroke ();
xpos += xlen / 2;
cr.SetFontSize (10);
foreach (Node n in stops) {
cr.Color = new Color (0, 0, 0, 1);
cr.MoveTo (xpos, heigth - 50);
cr.Save ();
cr.Rotate (-Math.PI / 4);
cr.ShowText (n ["name"]);
cr.Restore ();
cr.MoveTo (xpos, heigth - 30);
if (HasCrossing (n ["route_ref"]))
cr.Color = new Color (0, 0, 1, 1);
else
cr.Color = new Color (1, 0.1, 0.1, 1);
cr.Arc (xpos, heigth - 30, 4, 0, Math.PI * 2);
cr.Fill ();
xpos += xlen;
}
svg.Flush ();
svg.Finish ();
}
}
}
class Route2Svg {
static int Main (string[] args) {
// arguments: osmfile routename/routeref outfile
List<OsmObject> data = DataBase.Load (args [0]);
Route route = new Route (data, args [1]);
route.Render (args [2]);
return 0;
}
}
10.svg.gz
Description: Binary data
_______________________________________________ Talk-it mailing list [email protected] http://lists.openstreetmap.org/listinfo/talk-it

