OSM Download als svg?

Hey, früher konnte man ja bei http://www.flosm.de/ kostenlos die kartendaten als verktordatei runterladen.
Dieser Service wird jetzt dort wohl nur noch per Bezahlung angeboten.

Gibt es eine Alternative, wo man die Karten schnell und umsonst als Vektordaten downloaden kann?

SVG-Download geht grundsätzlich auch bei www.openstreetmap.org im “Export”-Tab. Die SVGs lassen sich mit Inkscape oder rsvg zu hochauflösenden Bitmaps verarbeiten, sind aber für die Nachbearbeitung in Inkscape nur beschränkt (und für die Nachbearbeitung in Illustrator überhaupt nicht) geeignet.

Ansonsten der etwas aufwendigere, aber auch kostenlose Schritt: “Maperitive” installieren, Daten von download.geofabrik.de besorgen (bei Bedarf Bereich ausschneiden mit geeignetem Tool) und dann in Maperitive als SVG ausgeben lassen. Dort können auch SVGs produziert werden, die sehr gut im AI bearbeitbar sind.

Und ein freies (“free” as in “free speech” not as in “free beer”) tool geht nicht?

Natürlich: Du mußt nur PostgreSQL, PostGIS, Python, osm2pgsql und Mapnik installieren, alles konfigurieren, Daten in die Datenbank importieren und schwupps hast Du nach wenigen Stunden/Tagen Dein fertiges SVG.

Irgendwie erscheint mir da die Lösung mit Maperitive doch ETWAS einfacher, wenn man nur ein paar SVGs braucht.

Christian

Hochschulen und gemeinnützige Vereine können weiterhin kostenlos SVG-Dateien für Illustrator herunterladen. Einige Hochschulen nutzen das schon - bitte meldet Euch dazu bei der hier angegebenen Rufnummer http://www.stepmap.de/123stepmap.php
Detlev

Ich habe auf beide beschriebenen Arten (direkt von www.openstreetmap.org als svg exportieren und mit maperitive svg erstellen) schon svg-Dateien erstellt und dann mit Inkscape weiter bearbeitet. Übrigens kann man in maperitive jetzt die osm-Roh-Daten direkt via Internet importieren.

Die Bearbeitung der mit maperitive erzeugten svg-Dateien hat den Nachteil, dass die Wege (Pfade) in der zugrunde liegenden xml-Datei irgendwie in Gruppen zusammengefasst sind und dann die Knoten nicht mehr verschoben werden können. Das sind aber keine “Gruppen” im Sinne einer Objekt-Gruppierung von Inkscape, die man dann ja aufheben könnte. Bei geschlossenen Wegen (also den Rändern von Flächen) ist das anders. Hier kann man wie gewohnt die Pfade bearbeiten.

Beim Export einer svg-Datei direkt aus www.openstreetmap.org sind die Wege als Pfade bearbeitbar. Dafür muss man dann aber den vorgegebenen Stil der Karte übernehmen. Bei maperitive kann ich den Stil in einer rules-Datei anpassen.

Die Ergebnisse meiner Arbeiten sind auf http://wiki.openstreetmap.org/wiki/Montabaur zu sehen.

Thomas

Für Deine 5 Programme (samt Abhängigkeiten) benötige ich auf meinem Debian nur einen Befehl:


apt-get install gis-workstation

(folgendes hab’ ich an dieser, glaube ich, schon mal erzählt:)
Es gibt bei Debian ein sub-projekt (“Pure Blend” fuer Insider :wink: namens Debian-GIS.
Leider stammen jene Leute eher aus der “grass-Ecke” und haben osm erst relativ spät “entdeckt”.
Ansonsten wäre die Integration vielleicht schon weiter fortgeschritten …

Und was ist mit dieser Zusammenstellung?

http://wiki.openstreetmap.org/wiki/SVG

veraltet?

Ja, veraltet. Der Link zu “cloudmade’s vector map API” stimmt nicht mehr. Das wär halt genau das, was ich brauche. Kein Pseudo-Screenshot von einer blöden Mapnik-Karte, sondern die blanken, unzensierten Linien und Punkte, die ich dann in Inkscape stylen und beschriften kann.

Maperative funktioniert bei mir leider nicht. Am liebsten wär mir ein Commandline-Utility wie:

$ gpsbabel -i GPX -o SVG karte.gpx karte.svg
Output type 'SVG' not recognized
$

…wenn es den Dateityp kennen würde.

Inzwischen hab ich selber ein Script dafür geschrieben. Es gibt zwar noch viel zu verbessern, aber zumindest ist mal was da, worauf man aufbauen kann. Da kommt richtig die Lust, einen Renderer drauf aufzusetzen.

#!/usr/bin/perl
# (c) Friedrich Volkmann 2012

use strict;
use LWP::Simple;
use Math::Trig ':pi';

sub usage {
        print "usage: $0: left right bottom top outfile\n";
        exit 1;
}

my $left = shift @ARGV;
usage() unless $left =~ /^\d+(?:\.\d*)?$/;
my $right = shift @ARGV;
usage() unless $right =~ /^\d+(?:\.\d*)?$/;
my $bottom = shift @ARGV;
usage() unless $bottom =~ /^\d+(?:\.\d*)?$/;
my $top = shift @ARGV;
usage() unless $top =~ /^\d+(?:\.\d*)?$/;
my $outfile = shift @ARGV;
usage() unless $outfile;

my $med_y = ($top + $bottom) / 2;
my $ratio = cos ($med_y * pi / 180);
my ($tot_x,$tot_y);
if ($right - $left > $top - $bottom) {
        $tot_x = 1000;
        $tot_y = ($top - $bottom) / ($right - $left) * 1000;
} else {
        $tot_y = 1000;
        $tot_x = ($right - $left) / ($top - $bottom) * 1000;
}
sub transform_x {
        my $x = $_[0];
        return ($x - $left) * $ratio * $tot_x / ($right - $left);
}

sub transform_y {
        my $y = $_[0];
        return ($top - $y) * $tot_y / ($top - $bottom);
}

my $osm = get("http://www.openstreetmap.org/api/0.6/map?bbox=$left,$bottom,$right,$top");
#print $osm;

exit unless $osm;
my @lines = split /\n/, $osm;
my %nodes;
my @ways;
for (@lines) {
        if (/^\s*<node id="(\d+)" lat="(\d*(?:\.\d*)?)" lon="(\d*(?:\.\d*)?)"/) {
                $nodes{$1} = {x => $3, y => $2};
        } elsif (/^\s*<way /) {
                push @ways, [];
        } elsif (/^\s*<nd ref="(\d+)"/) {
                push @{$ways[$#ways]}, {x => $nodes{$1}->{x}, y => $nodes{$1}->{y}};
                $nodes{$1}->{in_a_way} = 1;
        }
}
open SVG, ">$outfile" or die "could not open $outfile for writing";
print SVG "<?xml version='1.0' standalone='no'?>\n";
print SVG "<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>\n";
print SVG "<svg width='$tot_x' height='$tot_y' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>\n";
print SVG "  <title>OSM export</title>\n";

for (@ways) {
        print SVG '<polyline fill="none" stroke="blue" stroke-width=".5" points="';
        print SVG transform_x($_->{x}) . ", " . transform_y($_->{y}) . " " for @$_;
        print SVG '"/>' . "\n";
}
for (values %nodes) {
        next if $_->{in_a_way};
        print SVG '<circle fill="red" cx="' . transform_x($_->{x}) . '" cy="' . transform_y($_->{y}) . '" r=".5" />' . "\n";
}

print SVG "</svg>\n";
close SVG;