2014-08-07 21:18 GMT+02:00 Tor <[email protected]>:
> 5. aug. 2014 kl. 08:44 skrev Geir Ove Myhr <[email protected]>:
>
>> 2014-08-04 22:37 GMT+02:00 Tor <[email protected]>:
>>> Sammen med Elveg-SOSI-filene ligger det tekstfiler med begrensninger
>>> (fart, høyde etc.). Har du sett på muligheten for å flette disse dataene
>>> inn i OSM-filene?
>>
>> Jeg har så vidt gløttet på dataene og tenkt at hvis vi beholder
>> oppdelingen i vegparseller og TRANSID som nvdb:id, så er det mulig å
>> legge disse til senere. For veger som finnes fra før og dermed ikke
>> importeres (dvs. de fleste) er dette en større jobb.
>
> Jeg hadde gjerne sett at vi fikk med disse dataene fra starten av. Da
> slipper man å legge til dette til i en senere runde for de vegene som
> importeres fra Elveg. Man vil i tillegg ha dataene lett tilgjengelig
> slik at man kan kopiere verdiene manuelt over til de vegene som allerede
> ligger i OSM, hvis man ønsker.
Jeg har sett litt mer på disse fartsdataene (som ligger i filene
<kommunenr>Fart.txt) og hvordan vi kan få med disse. Ved å bruke
python-modulen osmapis [1] er det ganske greit å lese OSM-filene som
kommer ut av sosi2osm (med default.lua), endre tags, og skrive nye
filer.
Det er et par inkonsistenser i datane (ID fra fartsfil finnes ikke i
SOS-filen, VPA tag mangler i SOS-filen), men det er så få at det ikke
er et problem. Det som kanskje er et større problem er at veldig mange
småveger står oppført med fartsgrense 50. Så vidt jeg husker fra å ha
kjørt på noen av dem er vegene uskiltet (og utenfor tettbygd strøk) og
dermed generell fartsgrense 80 (selv om det flere steder ikke er en
forsvarlig fart). I "Veileder for ajourføring av Vegnett" [2] (side
10), står det:
"Hvis ...FARTSGRENSEVERDI ikke er angitt ved innmelding av nye veger
blir den satt til 50, for både kommunal veg, privat veg, og
skogsbilveg (KPS-nettet)"
Vegnett er ikke Elveg, men de er begge produkter fra NVDB, så dette
gjelder nok også Elveg. Jeg tror det eneste fornuftige vil være å ikke
sette maxspeed der fartsgrensen er 50.
Jeg har laget et datasett så de som vil kan se på datane i josm. Det
er Elveg konvertert til OSM med sosi2osm med default.lua og maxspeed
lagt til. Jeg har foreløpig ikke gjort noe forsøk på å splitte
vegparseller med flere fartsgrenser, så der er bare alle grensene
notert på maxspeed-taggen. Fartsgrensene er i fartsfilene oppgitt med
start og stopp i meter fra starten av vegparsellen (dvs.
way-objektet). Der hele vegen har samme fartsgrense er det greit, men
der det bytter fartsgrense etter f.eks. 1071 m må det litt regning til
for å finne ut hvor vegenparsellen skal deles. Tips til hvordan
enklest mulig beregne avstander i python mottas med takk.
Python-scriptet som ble brukt i konverteringen er vedlagt.
Datasettet med kommunevise osm-filer zippet i fylkesvise pakker finnes på:
https://drive.google.com/folderview?id=0BwxPkSBawddGM2djWE9oWjRXdzA&usp=sharing#list
Jeg tar gjerne kommentarer på om fartsgrensene ser riktige ut i
områder andre kjenner til. Hvis noen har en teori om hva
"kode"-kolonna i *Fart.txt er vil jeg gjerne høre om det også. Jeg har
ikke funnet noen produktspesifikasjon for Elveg (kun et enkelt
faktaark), så vi må gjette oss litt fram.
Jeg går ut fra at andre fagdata kan tas inn på lignende måte. Er det
noen som har sett nok på dataene til å kunne gjette på riktige
OSM-tags?
[1]: https://github.com/xificurk/osmapis
[2]:
http://kartverket.no/Documents/Om%20Kartverket/Fylkeskartkontorene/Oslo/Fagomr%C3%A5der/Basis%20geodata/Veileder_Ajourf%C3%B8ring%20av%20VEGNETT_Del1%20-%20Generell%20-22jan_2013.pdf
#! /usr/bin/env python2
import sys
import osmapis
import csv
osm_input = sys.argv[1]
elveg_fart = sys.argv[2]
osm_output = sys.argv[3]
# Read OSM file
osmobj = osmapis.OSM.load(osm_input)
# Generate dict with TRANSID as key and is as value
wayid_dict = {}
for wayid,way in osmobj.ways.iteritems():
transid = way.tags['TRANSID']
wayid_dict[transid] = wayid
# Loop over speed limits and add to objects
with open(elveg_fart, 'rb') as ef:
# Read first four header lines
ef_header = ef.next()
ef_export_line = ef.next()
ef_some_number = ef.next()
ef_empty_line = ef.next()
# Then use csv module for reading data
reader = csv.DictReader(ef, delimiter=';')
for row in reader:
transid = row[' TransID']
fart_start = int(row['Fra'])
fart_stop = int(row[' Til'])
fart_length = fart_stop - fart_start
fart_limit = row[' Fart']
try:
wayid = wayid_dict[transid]
except KeyError as e:
sys.stderr.write('TRANSID not found for the following speed line:\n')
sys.stderr.write(str(row) + '\n')
continue
way = osmobj.ways[wayid]
try:
vpa = way.tags['VPA'].split(':')
except KeyError as e:
sys.stderr.write('Missing VPA for the following way:\n')
sys.stderr.write(str(way.tags) + '\n')
continue
#raise e
vpa = [int(s.strip()) for s in vpa]
hovedparsell,vpa_start,vpa_stop = vpa
vpa_length = vpa_stop - vpa_start
if fart_length == vpa_length:
# The whole way has the same maxspeed
way.tags['maxspeed'] = fart_limit
else:
if way.tags.has_key('maxspeed'):
way.tags['maxspeed'] += " " + fart_limit
else:
way.tags['maxspeed'] = "Several limits: " + fart_limit
osmobj.save(osm_output)
_______________________________________________
kart mailing list
[email protected]
http://lists.nuug.no/mailman/listinfo/kart