x

Re: OSM Download als svg?


Geschrieben von fkv (Gast) am 16. August 2012 08:57:47: [flux]

Als Antwort auf: OSM Download als svg? geschrieben von Jayjay01 (Gast) am 15. März 2012 22:06:

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;