[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