skela
5
Ei ollut ihan tarpeeksi sateista, mutta täältä tulee:
#!/usr/bin/perl
use strict;
my $id = 0;
sub node
{
my($lon,$lat,$name,$wiki,$desc) = @_;
my %desc;
$desc =~ s|<b>\s*(.*?)\s*</b>:\s*(.*?)\s*<br\s*/>|$desc{$1}=$2|goes;
print " <node id='", --$id, "' lat='$lat' lon='$lon'>\n";
print " <tag k='shop' v='bicycle' />\n";
print " <tag k='name' v='$name' />\n";
if (defined($_ = $desc{Katuosoite})) {
my ($str, $num) = split /\s+/, $_, 2;
$str = ucfirst(lc($str)) if $str =~ /^[[:upper:]]+$/;
print " <tag k='addr:street' v='$str' />\n";
print " <tag k='addr:housenumber' v='$num' />\n" if defined $num;
}
if (defined($_ = $desc{Postinumero})) {
my ($zip, $city) = split /\s+/, $_, 2;
$city = ucfirst(lc($city)) if $city =~ /^[[:upper:]]+$/;
print " <tag k='addr:postcode' v='$zip' />\n";
print " <tag k='addr:city' v='$city' />\n";
}
print " <tag k='addr:country' v='FI' />\n";
if (defined($_ = $desc{Internet})) {
print " <tag k='url' v='$1' />\n" if /href="([^\"]*)"/;
}
if (defined($_ = $desc{Auki})) {
tr /./:/;
s/\s+-\s+/-/g;
if (/^ark:\s*(ma\s*-pe\s*)?([0-9-:]*)\s+la:\s*([0-9-:]*)/i) {
my $open;
my ($ark, $la) = ($2, $3);
$ark =~ s|^ma\s*-pe\s*||gi;
if ($ark ne '') {
$open = "Mo-Fr $ark";
$open .= ";Sa $la" if ($la ne '');
} elsif ($la ne '') {
$open = "Sa $la";
} else {
undef $open;
}
print " <tag k='opening_hours' v='$open' />\n" if defined $open;
}
}
if (defined($_ = $desc{Puhelin})) {
s/\s+-\s+/-/g;
my(@phones) = map {
if (/^\(0([0-9]+)\)([0-9 -]+)/ ||
/^0([^0][0-9]*)([0-9 -]+)/) {
my($area, $num) = ($1, $2);
$num =~ tr/ -//d;
"+358 $area $num";
} else {
undef;
}
}
split /[\/,;]/;
print " <tag k='phone' v='", join(";", @phones), "' />\n";
}
print " <tag k='source' v='http://www.polkupyoraily.net$wiki' />\n";
print " </node>\n";
}
undef $/;
$_=<>;
print "<?xml version='1.0' encoding='UTF-8'?>\n<osm version='0.6'>\n";
s|<Placemark>\s*
<name>(.*?)</name>
(\s*<Style>.*?</Style>)?\s*
<Point><coordinates>([0-9.]+),\s*([0-9.]+),\s*0</coordinates></Point>\s*
<description><!\[CDATA\[<a\s*
href="(/wiki/.*?)"\s*
title="(.*?)">(.*?)</a>
(\s*<br\s*/>)*
(.*?)
(\s*<br\s*/>)*\s*
\]\]></description>\s*</Placemark>|node $3,$4,$1,$5,$9|goesx;
print "</osm>\n";
Ei ihan kauneinta mahdollista Perliä, mutta kyllä se asiansa ajaa. Väänsin skriptiä pari tuntia. 70 kaupasta 68 on Suomessa, ja niistä muutama on jo kartalla tarkemmin.