On 2010.02.15 11:03, Albertas Agejevas wrote:
> > On Sun, Feb 14, 2010 at 05:30:24PM +0200, Aidas Kasparas wrote:
>> >> On 2010.02.14 16:50, Albertas Agejevas wrote:
>> >>
>> >> Taip pat nematau, kad būtų tuo pačiu upgradinami link'ai:
primary-link į
>> >> trunk-link ir pan. Be to, įtariu kad gausis baisus margumynas apie
>> >> sankryžas.
> >
> > Bijau, kad automatiškai to nelabai sutvarkysi, nebent pilnai
> > modeliuoti visus kelius ir taškus, kiekvienam linkui žiūrėti, su
> > kokiais keliais jis galuose jungiasi.

O negi tai taip jau ir baisu? :-) Kaip sakoma, find attached, skriptuką,
kuris peržiūri praėjusios nakties dump'ą, suranda visus linkus ir
roundabout'us [nes pastaruosiuose ref'as dažniausiai ne į temą], ir
išveda sąrašiuką, ką kaip reikėtų keisti. Pakeitimai niekur nėra
siunčiami, nes reikėtų patyrusių žmonių paprotinimo, kaip tokius dalykus
testuoti, kad malkų nepriskaldyčiau.

Statistika (pakeitimų skaičius, kaip keisti):

    209  motorway to trunk
     58  primary to trunk
     10  primary to trunk (roundabout)
      2  residential to not connected (roundabout)
      2  secondary to primary
      9  secondary to primary (roundabout)
     19  secondary to trunk
      1  secondary to trunk (roundabout)
      1  tertiary to trunk (roundabout)
     17  trunk to primary
      2  unclassified to not connected (roundabout)

not connected šiuo atveju yra tie, kurie neturi bendrų taškų su
highway'ais nuo tertiary iki motorway. Mano supratimu jų keisti nereikėtų.

Tiesa, dabartiniame dump'e nebėra nei vieno motorway. Aš suprantu, kad
šaukštai po pietų, bet sunkiai man sekasi save įtikinti, kad toks
išnaikinimas buvo teisingas žingsnis. Gal, ten kur jie buvo, nereikėjo
nužeminti iki trunk'o?

> >
> > Nieko, bus smagaus darbelio rankomis taisant visas sankryžas ir kelius
> > miestuose.  Man tai toks vozojimasis su žemėlapiu patinka.

O kas blogai gavosi miestuose?

-- Aidas Kasparas


#!/usr/bin/env python
"""link-convert.py -- retag link ways and roundabouts in Lithuania

Level of the link/roundabout is the same as highest level of the road/link 
it is connected to.

"""
from lxml.etree import parse, tostring
from bz2 import BZ2File
import re
from StringIO import StringIO
from httplib import HTTPConnection



changeset_body = """\
<osm>
  <changeset>
    <tag k="created_by" v="osm-convert.py"/>
    <tag k="comment" v="Promoting magistraliniai to trunk, krasto to primary, rajoniniai to secondary by an automated script."/>
  </changeset>
</osm>
"""

classes = ['motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'unclassified', 'residential', 'not connected']
cllevel = dict(zip(classes, range(len(classes))))
for cl in classes:
    cllevel[cl+'_link'] = cllevel[cl]

links = dict()
linknodes = dict()
nodeinlinks = dict()
emptyset = set()

def main():

    #dump = parse(BZ2File("lithuania.osm.2010-02-14.bz2"))
    dump = parse(BZ2File("lithuania-0215.osm.bz2"))

    """ fill up data structure
    """
    for way in dump.xpath("//way[t...@k='highway' and contains(@v,'_link')]]|//way[t...@k='highway'] and t...@k='junction' and @v='roundabout']]"):
	wayid = way.xpath("@id")[0]
	links[wayid] = dict({ 'currlevel': cllevel[way.xpath("t...@k='highway']/@v")[0]],
		'newlevel': len(classes)-1,
		'wayid': wayid,
		'roundabout': len(way.xpath("t...@k='junction']"))>0 })
	nodeset = set(way.xpath("nd/@ref"))
	linknodes[wayid] = nodeset
	for node in nodeset:
	    nl = nodeinlinks.get(node, set())
	    nl.add(wayid)
	    nodeinlinks[node] = nl

    for way in dump.xpath("//way[t...@k='highway' and @v='motorway']]"):
	upgrade_links(way.xpath("nd/@ref"), cllevel['motorway'])

    for way in dump.xpath("//way[t...@k='highway' and @v='trunk']]"):
	upgrade_links(way.xpath("nd/@ref"), cllevel['trunk'])

    for way in dump.xpath("//way[t...@k='highway' and @v='primary']]"):
	upgrade_links(way.xpath("nd/@ref"), cllevel['primary'])

    for way in dump.xpath("//way[t...@k='highway' and @v='secondary']]"):
	upgrade_links(way.xpath("nd/@ref"), cllevel['secondary'])

    for way in dump.xpath("//way[t...@k='highway' and @v='tertiary']]"):
	upgrade_links(way.xpath("nd/@ref"), cllevel['tertiary'])

    for l in links:
	link = links[l]
	if link['currlevel'] != link['newlevel']:
	    print "To site: %s change from %s to %s%s" % (link['wayid'], classes[link['currlevel']], classes[link['newlevel']], " (roundabout)" if link['roundabout'] else "")

"""	upgrade_links -- recursively traverse connected links and 
	upgrade their level to one supplied in second argument.
	Level is degraded in any case.
"""
def upgrade_links(nodes, level):
    for node in nodes:
	for link in nodeinlinks.get(node, emptyset):
	    if links[link]['newlevel'] > level:
		#print "Link %s need updating from %d to %d" % (link, links[link]['newlevel'], level) 
		links[link]['newlevel'] = level
		upgrade_links(linknodes[links[link]['wayid']], level)


if __name__ == '__main__':
    main()
_______________________________________________
Talk-lt mailing list
[email protected]
http://lists.openstreetmap.org/listinfo/talk-lt

Atrašyti