Archiv pro měsíc: Květen 2013

120 let SDH Ves Touškov

Čekání na odvoz nebralo konce až z čista a jasna vyjelo červené auto s majáky, zabrzdilo u nás a tůrovalo motor. Smůla byla, že motor tůrovala řídící jednotka. Kluci z Kornatic pořád s hezkým autíčkem bojují a dnes nedobíjelo baterii, takže sotva dojeli k nám. Za Stod by to šlo jen stěží. Nezbývalo, než vytáhnout bílou flotilu a pokračovat v cestě dvěma auty.
Přes notné zpoždění našeho příjezdu, jako by se nechumelilo, byly jsme zařazeni v soutěži. Stánek, křesílka a pohoda, trochu se proběhnout po trati, která povrchem připomínala tu z Horní Lukavice, byla však mírně z kopce. Na několika místech vyšňořená shluky značek pro závodníky. Běhalo se na dvě hadice B, obě kategorie dohromady, společně s okrskovou soutěží. Oceňovali jsme množství strojů o které se dbá a místní družstva nevyjíždějí jen jednou za rok do sousední vsi na pivo a klobásu.
Běžely se dva pokusy a o pořadí rozhodoval ten lepší. To bylo pro některé málo, když oba nedokončily. Možná byly přetrénovaní. My jsme se sešli dvakrát, z toho poslední trénink rozehnalo krupobití. Lehce se rozběhat a honem na start. Trochu jsem tápal na pozici levého proudaře, ale domluvená taktika zřejmě vyšla, když startér ohlásil 15.76. V tu chvíli druhé místo, těsně za Strýčkovicemi 15.74. Před námi ještě spousta prvních i druhých pokusů. Postrach z Honezovic výsledek nedal a to ani v druhém kole. I další soupeři odpadali a Strýčkovice nevylepšili. My bohužel také ne, 16.4~ a znatelně pomalejší voda nás nechala na pochybách, jak to celé dopadne. Mezitím jsme mohli vidět dva překocené stroje, to jsem ještě nezažil, poprvé jsem si mohl prohlédnou přenosnou stříkačku zespodu. Oba stroje to přežily bez viditelné úhony. Jeden se převrátil, když béčkařka nezapojila na stroj a podruhé, když napraskla první B hadice v polovině, zamířila si to rovnou k oblakům a stroj brala sebou. Lidé ve stánku jistě osvěžení v tak nízké teplotě neocenili. Nejen, že jsem si mezi útoky oblékl, vše co bylo po ruce, ale moudře sbalená čepice byla třešnička na dortu. Časem bylo okolí základny silně podmáčené, na „jednorázovém“ cvičišti je to s odvodněním horší. Po celou dobu však panovala uvolněná atmosféra a povzbuzování družstva před útokem ve formě potlesku.
Protože se jednalo o oslavu 120 let od založení sboru, odvezli jsme si za druhé místo nejen pěkně velký pohár, ale také sadu pamětních sklenic, takže konečně mám doma pěkné sklo ze závodů.

Mapování OSM

Napadlo mě, že bych si vypsal co vše používám při mapování, jednak, až si zase smažu celý disk, rád bych věděl jaký byl předchozí stav, jednak mohu někoho inspirovat a dopomoci mu k rychlejší či snazší práci.

Vstupy:
Při cíleném mapování nejčastěji jezdím na kole, dostanu se leckde a nestrávím celý den chůzí. Záznamové zařízení je běžný Androidí telefon nižší třídy, doplněný o starší kompaktní fotoaparát. Toto spojení velice urychluje mojí dosavadní práci, nezdržuji se se zadáváním bodu a jeho popisu do telefonu. Stačí mít jen přibližně srovnané časy v obou zařízeních a později fotky spárovat se záznamem trasy v počítači, já na to používám digikam. Obě zařízení mi za jízdy visí na krku, takže je kdykoliv vytáhnu z pod oblečení a kdykoliv je pustím z ruky, nestarám se o zapnuté kapsy a podobně. Fotky toho na jedno stisknutí zaznamenají velmi mnoho i tak se musím až příliš často zastavovat abych pořídil nerozmazaný snímek, na tom ještě musím zapracovat. Na záznam stopy používám Locus Pro s automatickým exportem do GPX, ale má možnost rovnou nahrávat stopu na servery OSM. GPX posílám přes Bluetooth do PC a tam je shromažďuji pomocí jednoduchého skriptu:

#!/bin/bash
mv ~/Veřejné/*.gpx ~/Dokumenty/osm/gpx
mv ~/Stažené/*.gpx ~/Dokumenty/osm/gpx

PC:
Začal jsem pracovat v JOSM a u něj také zůstal, při mapování se soustředím na budovy/adresy, které citelně chybí a já si myslím, že hned po silnicích je tohle to nejdůležitější. Druhá věc na kterou se soustředím jsou turistické a cyklotrasy. Vedle pořízených záznamů z GPX využívám tedy katastrální mapu (cuzk:km) a ortofotomapu (uhul:ortofoto), obě jsou k aktivaci v nastavení. K nezaplacení jsou pluginy Tracer a czechaddress se kterými zmapujete obec, která má digitalizované podklady v katastrální mapě během chvilky. Zároveň je dobré vytáhnout si na hlavní panel ikonku Anotace/Adresy. Do mapových podkladů jsem si pro potřeby adresování již vytvořených budov přidal ještě jednu vrstvu: wms:http://services.cuzk.cz/wms/wms.asp?FORMAT=image/png&Transparent=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DEF_BUDOVY,prehledka_kat_uz&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox} Jsou v ní jen čísla popisná/evidenční a hranice katastrů, kvůli adresnímu pluginu je nutné mít naráz stažené v aktivní vrstvě jen budovy ze zvoleného katastru, jinak dojde k chybnému přiřazení ulic/měst atd.

Dále tam mám pluginy directupload a editgpx se kterými upravím zaznamenanou stopu a rovnou ji nahraju pro další zpracování na server. Pro turistické značení zase využiji styly pro kreslení map, konkrétně Osmchiking, rovnou vidím vyznačené cesty z relací pomocí barevného proužku a preset tagů: Czech hiking routes. Po nějaké té relaci se už zajídá znovu vyplňovat tolik políček.

V poslední době jsem si oblíbil i relation toolbox pro tvoření multipolygonů. Pokud začnete vytvářet pole a louky navazující na lesy, už nestačí jediná uzavřená cesta pro les, ale je třeba tvořit multipolygony z více cest, které tvoří tu hranici les/pole tu zase les/louka a myslím, že budoucí úpravy budou mnohem jednodušší, bude li hranici tvořit jediná cesta, namísto dvou uzavřených cest, ze kterých jsem tvořil sousedící oblasti a které místy sdílejí body.

Na opravu chyb někdy nestačí jen pohled do mapy, poslouží kontrolní mechanismy na keepright.at, při brozdání po wiki jsem nalezl ještě parádní OSM Inspector, na kontrolu adresování prostě výborné.

Texas Instruments Launchpad

Až z dalekého Texasu, nebo spíše naopak z Číny, ke mě dorazila malá destička zvaná Launchpad. Poprvé jsem viděl Launchpad v loni na podzim ve článku na serveru Živě.cz, to je ale, jak nyní vidím, Stellaris Launchpad, který má blíže k Raspberry PI. Můj Launchpad je programátor a debuger, vloží se do něj 14/20 nožičkový MCU, nahraje se program, díky připraveným vývodům je možné jej hned otestovat, nakonec MCU vzít a připájet jej do DPS, kde bude plnit úkoly, na které je Raspberry PI zbytečně velké. Navíc by měly bohatě stačit dvě tužkové baterie. Zatím jsem vyzkoušel jen připojení k Ubuntu, které funguje. V budoucnu plánuji nahradit Raspberry PI v časomíře pro požární sport jedním z MCU řady MSP430G2xxx, protože i RPI je zbytečný přepych. A samozřejmě různé ty domácí práce, měření teploty, kontroly, myslím, že se toho najde dost.Launchpad a RPI
Proč jsem si vlastně vybral Launchpad? Hlavně kvůli ceně. Jsem kvidla, moc eltech. vzdělání nemám a z MCU mám strach 🙂 Raději holduji software.

  • Launchpad se připojuje rovnou do USB.
  • Nestojí ani tisíc ani pět set, ale jen 160 Kč na farnell.com (v českých obchodech tak 360 Kč) a stával ještě méně.
  • Dostanu v balení dva kusy MCU a zdá se, že deska samotná je skoro za pakatel.
  • Chtěl jsem pouzdro DIL, kvůli snadnému pájení, připojení do breadbordu atp.
  • Narozdíl od PIC a Atmel dostávám 16-bit počítač (bude to výhoda?) za stejnou cenu.
  • Vybraný MCU má AD převodník a sériové komunikační protokoly, které potřebuji.
  • Pravděpodobně nebude problém s programování v Linuxu.

Ale, rodina MCU MSP430 je mnohem širší nejvyšší řada stojí od jednoho do tří set korun a mají třeba integrovaný LCD, USB a další řadiče, ale teď už trochu vařím z vody, protože jsem vše neprozkoumal. Pointa měla být takové, že je možnost se stejnými postupy naučenými na základní řadě postoupit k lepšímu vybavení, byť si připlatíme za dražší programátory. Je třeba nějak začít a nevidím nic lepšího, než koupit tak levný hotový programátor a jen cvakat kód programu a jednoduše testovat funkčnost s vědomostmi získanými pomocí Raspberry PI.
Takže po drobném martyriu se softwarem jsem našel pěkný článek vysvětlující základy. Já musel přidělat symlink pro 64-bitovou knihovnu a pak už se otevřelo malé okénko editoru Energia, zkusil jsem příklad s blikáním diod a hned je mi jasno, jak to celé funguje, no to je paráda, do večera bych klidně zvládl zprovoznit display. Pokud se neobjeví něco zásadně velkého, budu jen tento článek jako úvodník k MSP430 rozšiřovat.

OSM a Python

Protože mám doma Raspberry PI, přirostl mi k srdci programovací jazyk Python. Při psaní je nutné dodržovat odsazování vnořených bloků, čímž je na druhou stranu možné zbavit se nepraktického závorkování a středníků na konci řádku. Syntaxe má také blíž k běžnému jazyku, a v neposlední řadě jsme zbaveni nutného kompilování a následného spouštění ve speciálním editoru.
Napsat program v Pythonu tedy není nijak těžké, dnes zveřejním k libovolnému užití kód, který používám k vytváření mapy na základě OSM do svého Androida. Původně byl vytvořen v Qt, které mám také velmi rád, ale postupně se mi na tak malém projektu přestala líbit složitost úprav a neustálé kompilování. Tvorba zabrala několik dlouhých nocí, než byl program vyladěn a urychlen z původní hodiny a půl běhu na 17 minut. V Pythonu se díky využití jeho základních struktur čas zkrátil dokonce na deset minut, ale pak jsme přidával další kontroly a vylepšováky, což běh o nějakou dobu protáhne. Protože jde o moje dítko a piplání mi zabralo nějaký čas, nejprve jsem jej zveřejňovat nechtěl, ale pak jsem si řekl, že s Linuxem měl taky kdosi spoustu práce… Stejně si myslím (mám tady jeden), že existují mnohem sofistikovanější skripty, které procházejí přímo databázi. Tu já ale k dispozici nemám, přestože jsem na stránky umístil reklamu, za měsíc lidé naklikali asi 5 Kč a za to si server nepořídím. Skript funguje jednoduše, nechá si pomocí osmconvert převést PBF do XML formátu, ten přelouská, najde relace s trasami KČT a přesype vybrané tagy z relace na všechny cesty, které jsou jejími členy. výsledek opět vrátí do osmconvert, který tedy musí ležet vedle skriptu, a ten jej převede zpět do PBF tak, aby se maximálně šetřilo místo na mém zaplněném disku osobního počítače.
Vytvořené mapy už je jiná záležitost, která zahrnuje všehovšudy jeden příkaz do osmosis, ale o tom třeba jindy.

#!/usr/bin/python
# -*- coding: utf-8 -*-

__author__="Speirs"

import sys, re, subprocess

#nodes = subprocess.Popen(["./osmconvert", "--drop-relations", "--drop-ways", sys.argv[1]], stdout=subprocess.PIPE)
#ways = subprocess.Popen(["./osmconvert", "--drop-relations", "--drop-nodes", sys.argv[1]], stdout=subprocess.PIPE)
mapFile = subprocess.Popen(["./osmconvert", sys.argv[1]], stdout=subprocess.PIPE)
relations = subprocess.Popen(["./osmconvert", "--drop-nodes", "--drop-ways", sys.argv[1]], stdout=subprocess.PIPE)

nodeStart = re.compile('\s*<node id="(\d+)" lat="([0-9.]*)" lon="([0-9.]*)"')
nodeEnd = re.compile('\s*</node>')
wayStart = re.compile('\s*<way id="(\d+)"\s')
wayEnd = re.compile('\s*</way>')
relationStart = re.compile('\s*<relation id="(\d+)"')
relationEnd = re.compile('\s*</relation>')

nodeID = re.compile( '\s*<nd ref="(\d+)"')
hikeRoute = re.compile('\s*<tag k=\"route\" v=\"(hiking|foot)\"')
kctRoute = re.compile('\s*<tag k=\"kct_.+\" v=\"')
bikeRoute = re.compile('\s*<tag k=\"route\" v=\"(bicycle|mtb)\"')
tag = re.compile('\s*<tag k=\"(.+)\" v=\"(.+)\"')
member = re.compile('\s*<member type="(.+)" ref="(.+)"\s')

stack = []
wayTags = {}

def compare(a, b):
        return cmp(int(a), int(b))
        
def combine(i, l):
	for key, value in l.items():
		if (key in ('name', 'ref')) and (key in wayTags[i]):
			if value not in wayTags[i][key].split(','):
				wayTags[i][key] = wayTags[i][key] + ',' + value
		else:
			wayTags[i][key] = value
        
def printTag(key, value):
        print '\t\t<tag k="{}" v="{}"/>'.format(key, value)
        
def hikingRoute(l):
	wayIds = []
	tags = {}
	kctKeys = ('kct_red', 'kct_blue', 'kct_green', 'kct_yellow')
	kctValues = ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'bicycle', 'ski', 'wheelchair', 'interesting_object')

	for line in l:
		t = tag.match(line)
		m = member.match(line)
		if m:
			if m.group(1) == 'way':
				wayIds.append(m.group(2))
    		elif t:
    			if t.group(1) in kctKeys:
    				kct = t.group(1).split('_')
    				typ = t.group(2).split(';')
    				tags[t.group(1)] = typ[0]
    				tags['osmc'] = 'yes'
    				tags['osmc_color'] = kct[1]
    				if typ[0] in ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'wheelchair', 'interesting_object'):
    					tags['osmc_background'] = 'white'
    				elif typ[0] == 'bicycle':
    					tags['osmc_background'] = 'yellow'
    				elif typ[0] == 'ski':
    					tags['osmc_background'] = 'orange' 					
    					
    				if typ[0] in ('major', 'bicycle', 'ski'):
    					tags['osmc_foreground'] = kct[1] + '_bar'
    				elif typ[0]== 'peak':
    					tags['osmc_foreground'] = kct[1] + '_triangle'
    				elif typ[0] == 'local':
    					tags['osmc_foreground'] = kct[1] + '_corner'
    				elif typ[0] == 'interesting_object':
    					tags['osmc_foreground'] = kct[1] + '_turned_T'
    				elif typ[0] == 'ruin':
    					tags['osmc_foreground'] = kct[1] + '_L'    					
    				elif typ[0] == 'spring':
    					tags['osmc_foreground'] = kct[1] + '_bowl'
    				elif typ[0] == 'horse':
    					tags['osmc_foreground'] = kct[1] + '_dot'
    				elif typ[0] == 'wheelchair':
    					tags['osmc_foreground'] = kct[1] + '_wheelchair'
    				elif typ[0] == 'learning':
    					tags['osmc_foreground'] = kct[1] + '_backslash'
    				
    	for i in wayIds:
    		if i in wayTags:
    			combine(i, tags)
    			#wayTags[i].update(tags)
    		else:
    			wayTags[i] = {}
    			for key, value in tags.items():
    				wayTags[i][key] = value
    	
    	tags.clear()
    	del wayIds[:]
    			
def bikingRoute(l):
	wayIds = []
	tags = {}
	for line in l:		
		t = tag.match(line)
		m = member.match(line)
		if m:
			if m.group(1) == 'way':
				wayIds.append(m.group(2))
    		elif t:
    			if t.group(1) in ('network', 'ref', 'route'):
    				tags[t.group(1)] = t.group(2)
    	
    	for i in wayIds:
    		if i in wayTags:
    			combine(i, tags)
    			#wayTags[i].update(tags)
    		else:
    			wayTags[i] = {}
    			for key, value in tags.items():
    				wayTags[i][key] = value
    	tags.clear()
    	del wayIds[:]

flag = 0
for line in relations.stdout:
	relS = relationStart.match(line)		
    	relE = relationEnd.match(line)
    	hikeR = kctRoute.match(line)
    	bikeR = bikeRoute.match(line)
    	if relS:
    	   	flag = -1
    	elif relE:
    		if flag == 1:
    			hikingRoute(stack)
    		elif flag == 2:
    			bikingRoute(stack)    		
    		del stack[:]
    		flag = 0
    	elif hikeR:
    		flag = 1
    		stack.append(line)
    	elif bikeR:
    		flag = 2
    		stack.append(line)
    	elif flag != 0:    		
    		stack.append(line)
	
id = -1
h = 0
b = 0
for line in mapFile.stdout:
	s = wayStart.match(line)
	e = wayEnd.match(line)
	hi = kctRoute.match(line)
	bi = bikeRoute.match(line)
	if s:
		id = s.group(1)
	elif hi:
		h = 1
	elif bi:
		b = 1
	elif e:
		if id != -1:
			if id in wayTags:
				for key, value in wayTags[id].items():
					if h == 0 and (value in ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'wheelchair', 'interesting_object')):
						printTag('route', 'hiking')
						h = 1
					elif key == 'route' and value == 'bicycle':
						b = 1
					elif b == 0 and value == 'bicycle':
						printTag('route', 'bicycle')
						b = 1
					printTag(key, value)
				del wayTags[id]
				h = 0
				b = 0
		id = -1
	print line.rstrip()
	
	
exit(0)

Přidám ještě druhou upravenou verzi, která umí vytvořit turistické značky pro Slovensko, ale hlavní změna spočívá v duplikaci cest. Jednoduše vezme všechny body z původní cesty a vytvoří novou cestu pouze s tagy turistických značek. Tím se zbavím několika problémů naráz. Interní vzhled Locusu používá takové značky, že najednou může cesta nést jen jednu barvu. Dále jediný Locus má opravenou nesmyslnou chybu, při které vyhledávač tag pro renderování odsouhlasí libovolnou dvojici klíč-hodnota, kterou najde. Takže měla-li cesta najednou kct_red=major i kct_green=learning, v c:geo se bez ostychu vykreslily ikonky, jako by šlo o kct_red=learning. Výsledný soubor nabyde na velikosti jen o pár MB. Při zpracování výsledného souboru je třeba v osmosis použít –sort, protože id u cest nejsou seřazena.

#!/usr/bin/python
# -*- coding: utf-8 -*-

__author__="Speirs"

import sys, re, subprocess
from datetime import datetime

#nodes = subprocess.Popen(["./osmconvert", "--drop-relations", "--drop-ways", sys.argv[1]], stdout=subprocess.PIPE)
#ways = subprocess.Popen(["./osmconvert", "--drop-relations", "--drop-nodes", sys.argv[1]], stdout=subprocess.PIPE)
mapFile = subprocess.Popen(["./osmconvert", sys.argv[1]], stdout=subprocess.PIPE)
relations = subprocess.Popen(["./osmconvert", "--drop-nodes", "--drop-ways", sys.argv[1]], stdout=subprocess.PIPE)

nodeStart = re.compile('\s*')
wayStart = re.compile('\s*')
relationStart = re.compile('\s*')

nodeID = re.compile( '\s*'.format(key, value)
        
def hikingRoute(l):
	wayIds = []
	tags = {}
	kctKeys = ('kct_red', 'kct_blue', 'kct_green', 'kct_yellow')
	kctValues = ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'bicycle', 'ski', 'wheelchair', 'interesting_object')

	for line in l:
		t = tag.match(line)
		m = member.match(line)
		if m:
			if m.group(1) == 'way':
				wayIds.append(long(m.group(2)))
    		elif t:
    			if t.group(1) in kctKeys:
    				kct = t.group(1).split('_')
    				typ = t.group(2).split(';')
    				tags[t.group(1)] = typ[0]
    				tags['osmc'] = 'yes'
    				tags['osmc_color'] = kct[1]
    				if typ[0] in ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'wheelchair', 'interesting_object'):
    					tags['osmc_background'] = 'white'
    				elif typ[0] == 'bicycle':
    					tags['osmc_background'] = 'yellow'
    				elif typ[0] == 'ski':
    					tags['osmc_background'] = 'orange' 					
    					
    				if typ[0] in ('major', 'bicycle', 'ski'):
    					tags['osmc_foreground'] = kct[1] + '_bar'
    				elif typ[0]== 'peak':
    					tags['osmc_foreground'] = kct[1] + '_triangle'
    				elif typ[0] == 'local':
    					tags['osmc_foreground'] = kct[1] + '_corner'
    				elif typ[0] == 'interesting_object':
    					tags['osmc_foreground'] = kct[1] + '_turned_T'
    				elif typ[0] == 'ruin':
    					tags['osmc_foreground'] = kct[1] + '_L'    					
    				elif typ[0] == 'spring':
    					tags['osmc_foreground'] = kct[1] + '_bowl'
    				elif typ[0] == 'horse':
    					tags['osmc_foreground'] = kct[1] + '_dot'
    				elif typ[0] == 'wheelchair':
    					tags['osmc_foreground'] = kct[1] + '_wheelchair'
    				elif typ[0] == 'learning':
    					tags['osmc_foreground'] = kct[1] + '_backslash'
    			elif t.group(1) in ('network', 'ref', 'route'):
    				tags[t.group(1)] = t.group(2)
    				
    	for i in wayIds:
    		if i in wayTags:
    			wayTags[i].append(tags.copy())
    		else:
    			wayTags[i] = []
    			wayTags[i].append(tags.copy())
    	tags.clear()
    	del wayIds[:]

def hikeRoute(l):
	wayIds = []
	tags = {}
	kstKeys = ('red', 'blue', 'green', 'yellow')
	kstValues = ('major', 'local', 'peak', 'education', 'ruin', 'spring', 'interesting_object')
	barva = ''
	symbol = ''

	for line in l:
		t = tag.match(line)
		m = member.match(line)
		
		if m:
			if m.group(1) == 'way':
				wayIds.append(long(m.group(2)))
    		elif t:
    			if t.group(1) in ('colour'):
    				tags['osmc'] = 'yes'
    				barva = t.group(2)
    				tags['osmc_color'] = t.group(2)
    			elif t.group(1) in ('network', 'ref', 'route'):
    				tags[t.group(1)] = t.group(2)    			
    			elif t.group(1) in ('symbol'):
    				if t.group(2) in kstValues:
    					tags['osmc_background'] = 'white'
    					symbol = t.group(2)
    					
    	if barva == '' or symbol == '':
    		tags.clear()
    		del wayIds[:]
    		return
    		
    	
    	if symbol == 'educational':
    		tags['kct_'+barva] = 'learning'
    	else:
    		tags['kct_'+barva] = symbol
    		
    	if symbol == 'major':
    		tags['osmc_foreground'] = barva + '_bar'
    	elif symbol == 'peak':
    		tags['osmc_foreground'] = barva + '_triangle'
    	elif symbol == 'local':
    		tags['osmc_foreground'] = barva + '_corner'
    	elif symbol == 'interesting_object':
    		tags['osmc_foreground'] = barva + '_turned_T'
    	elif symbol == 'ruin':
    		tags['osmc_foreground'] = barva + '_L'    					
    	elif symbol == 'spring':
    		tags['osmc_foreground'] = barva + '_bowl'
    	elif symbol == 'roundtrip':
    		tags['osmc_foreground'] = barva + '_dot'
    	elif symbol == 'education':
    		tags['osmc_foreground'] = barva + '_backslash'
    				
    	for i in wayIds:
    		if i in wayTags:
    			wayTags[i].append(tags.copy())
    		else:
    			wayTags[i] = []
    			wayTags[i].append(tags.copy())
    	tags.clear()
    	del wayIds[:]
    	
def bikingRoute(l):
	wayIds = []
	tags = {}
	for line in l:		
		t = tag.match(line)
		m = member.match(line)
		if m:
			if m.group(1) == 'way':
				wayIds.append(long(m.group(2)))
    		elif t:
    			if t.group(1) in ('network', 'ref', 'route'):
    				tags[t.group(1)] = t.group(2)
    	
    	for i in wayIds:
    		if i in wayTags:
    			wayTags[i].append(tags.copy())
    		else:
    			wayTags[i] = []
    			wayTags[i].append(tags.copy())
    	tags.clear()
    	del wayIds[:]

flag = 0
for line in relations.stdout:
	relS = relationStart.match(line)		
    	relE = relationEnd.match(line)
    	hikeR = kctRoute.match(line)
    	kstR = kstRoute.match(line)
    	bikeR = bikeRoute.match(line)
    	if relS:
    	   	flag = -1
    	elif relE:
    		if flag == 1:
    			hikingRoute(stack)
    		elif flag == 2:
    			bikingRoute(stack)
    		elif flag == 3:
    			hikeRoute(stack)
    		del stack[:]
    		flag = 0
    	elif hikeR:
    		flag = 1
    		stack.append(line)
    	elif bikeR:
    		flag = 2
    		stack.append(line)
    	elif kstR:
    		flag = 3
    		stack.append(line)
    	elif flag != 0:    		
    		stack.append(line)
	
id = -1
nid = 50000000000
del stack[:]
datum = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')

for line in mapFile.stdout:
	s = wayStart.match(line)
	e = wayEnd.match(line)
	n = nodeID.match(line)
	if s:
		id = long(s.group(1))
	elif n and id != -1:
		stack.append(line)
	elif e and id != -1:
		if id in wayTags:
			for i in wayTags[id]:
				print '\t'
				print '\t'.format(nid, datum)
				for li in stack:
					print li.rstrip()			
				for key, value in i.items():
					printTag(key, value)
				nid += 1
			del wayTags[id]
		del stack[:]
		id = -1
	print line.rstrip()
	
exit(0)