[NUUG fiksgatami] Idé til å identifisere veieier med OpenStreetmap
Petter Reinholdtsen
pere at hungry.com
Wed Apr 13 14:45:44 CEST 2011
[Petter Reinholdtsen]
> Vi kan bruke det til å sende til vegvesenet i tillegg der vi vet at
> veien er riks- eller fylkesvei, og så sende resten kun til kommunen.
Alternativt kan vi sende til begge, men legge inn informasjon i
eposten om hva vi har gjettet oss frem til av operatør for veien.
Her er første utkast til perlkode som slår opp info om en vei.
#!/usr/bin/perl
use warnings;
use strict;
use XML::Simple;
use LWP::Simple;
use Data::Dumper;
my $nominatimbase = "http://nominatim.openstreetmap.org/";
sub lookupNominatim {
my ($locationref) = shift;
my $longitude = $locationref->{longitude};
my $latitude = $locationref->{latitude};
my $url =
"${nominatimbase}reverse?format=xml&zoom=16&lat=$latitude&lon=$longitude";
my $j = LWP::Simple::get($url);
if ($j) {
my $ref = XMLin($j);
print STDERR "URL: $url\n";
print STDERR Dumper($ref);
return $ref;
} else {
print STDERR "No reply from $url\n";
}
return undef;
}
my $osmbase = "http://www.openstreetmap.org/api/";
sub getOSMWayTags {
my $wayid = shift;
# GET 0.6/way/18668212
my $url = "${osmbase}0.6/way/$wayid";
my $j = LWP::Simple::get($url);
if ($j) {
my $ref = XMLin($j);
print STDERR "URL: $url\n";
print STDERR Dumper($ref);
my %tags;
map { $tags{$_->{'k'}} = $_->{'v'} } @{$ref->{way}->{tag}};
return \%tags;
} else {
print STDERR "No reply from $url\n";
}
return undef;
}
sub guessRoadOperator {
my $inforef = shift;
my $highway = $inforef->{highway} || "unknown";
my $ref = $inforef->{ref} || "unknown";
my $operator;
if ($highway eq "trunk"
|| $ref =~ m/E \d+/
|| $ref =~ m/Fv\d+/
) {
$operator = "Statens Vegvesen";
}
print STDERR "Guessing operator $operator\n";
return $operator;
}
sub isRoadOperator {
my ($locationref, $name) = @_;
my $inforef = lookupNominatim($locationref);
if ('way' eq $inforef->{result}->{osm_type}) {
my $osmtags = getOSMWayTags($inforef->{result}->{osm_id});
print STDERR Dumper $osmtags;
my $operator = $osmtags->{operator} ||
guessRoadOperator($osmtags);
print STDERR "Claiming operator $operator\n";
return ($operator eq $name);
}
return undef;
}
my $locationref = {
latitude => $ARGV[0] || 63.37638,
longitude => $ARGV[1] || 10.37595,
};
isRoadOperator($locationref, "Statens Vegvesen");
Vennlig hilsen,
--
Petter Reinholdtsen
More information about the fiksgatami
mailing list