Archiv autora: Honza

Jednoduchý střih videa

Nemnohokráte si natáčím techniku jednotlivců na překážkách běhu na 100~metrů. Vedle běžné rychlosti je pěkné mít i zpomalené záběry. Do této doby jsem používal běžné střižny jako Pitivi nebo OpenShot. Moje instalace Ubuntu je dost rozhašená, třeba vůbec nefunguje Totem a teď se k tomu přidaly oba programy na stříhání. Naštěstí všechno zachraňuje AviDemux, který požívám pro vystříhání krátkých úseků z dlouhého záznamu z kamery na stativu. Nejen, že si vystříhám úseky, můžu je snadno slepit zasebou a to je vlastně vše co potřebuji, žádné přechody, stmívání a další blbinky. Slepené kousky videa následně zpomalím a oba kusy slepím do jednoho tak, že závodníci proběhnou rychle a v druhé části zpomaleně. Takže rozdělím části tvorby videa na body.

Zdroj: dlouhé video ve formátu avi z Pentax K-r.

  • Nastavit značku A na začátek vybraného úseku.
  • Nastavit značku B na začátek vybraného úseku.
  • Uložit daný úsek na disk jen jako kopii video i audio stopy, nedochází tak ke ztrátě kvality.

Zdroj: jednotlivé krátké úseky původního videa.

  • První video otevřít v novém okně.
  • Další videa Připojit (Soubor->Připojit Ctrl+Alt+A)
  • Uložit celou stopu na disk jen jako kopii video i audio stopy, nedochází tak ke ztrátě kvality.
  • Nyní v hlavním menu Video->Snímková frekvence a zvolit nižší, já volím 5~FPS
  • V levém panelu Video namísto Kopie zvolit skutečný obsah kontejneru avi, v mém případě M-JPEG, a to jen proto, aby se jakžtakž zachovala kvalita.
  • Ve volbě Filtry zvolit Resample fps a vrátit hodnotu na původních např. 25~FPS.
  • V hlavním panelu zvolit Audio->Hlavní stopa a tam zvolit Zdroj: Nic. Jinak by pod zpomaleným videem neustále dokola běžel nezpomalený zvuk z původního kousku videa.
  • Nyní to je vše a můžeme zpomalené video uložit na disk.

Je-li třeba slepit videa různých rozlišení:

  • Video nižšího rozlišení otevřít v novém okně.
  • V levém panelu Video namísto Kopie zvolit skutečný obsah kontejneru avi, v mém případě M-JPEG, a to jen proto, aby se jakžtakž zachovala kvalita.
  • Ve volbě Filtry zvolit Add black borders a nastavit rozměry tak, aby se výsledné rozlišení shodovalo s rozměrem většího videa.
  • Uložit video na disk.

Zdroj: běžná a zpomalená stopáž.

  • Jedno video otevřít v novém okně.
  • Druhé či každé další znovu Připojit, jak už bylo popsáno.
  • Uložit jako kopii jsou-li formáty kompatibilní.

Náhledy surových fotek

Nevím jakou měrou to využiju, ale čas od času jistě. Do této doby jsem měl v Nautilu náhledy fotek v RAW jen jako šedivé obdélníky. Když jsem se potřeboval podívat, o kterou akci jde a neměl jsem zrovna spuštěný digikam, naslepo jsem pár fotek otevřel v ufraw a bylo jasno. Proč si život nezpříjemnit, tím, co jsem dnes náhodou nalezl na české diskusi k Ubuntu. Tam najdete odkaz na askubuntu, kde je napsáno, že stačí mít onen ufraw, a pak vytvořit soubor /usr/share/thumbnailers/ufraw.thumbnailer:

nano /usr/share/thumbnailers/ufraw.thumbnailer

a do něj vložit:
[Thumbnailer Entry]
Exec=/usr/bin/ufraw-batch --embedded-image --out-type=png --size=%s %u --overwrite --silent --output=%o
MimeType=image/x-3fr;image/x-adobe-dng;image/x-arw;image/x-bay;image/x-canon-cr2;image/x-canon-crw;image/x-cap;image/x-cr2;image/x-crw;image/x-dcr;image/x-dcraw;image/x-dcs;image/x-dng;image/x-drf;image/x-eip;image/x-erf;image/x-fff;image/x-fuji-raf;image/x-iiq;image/x-k25;image/x-kdc;image/x-mef;image/x-minolta-mrw;image/x-mos;image/x-mrw;image/x-nef;image/x-nikon-nef;image/x-nrw;image/x-olympus-orf;image/x-orf;image/x-panasonic-raw;image/x-pef;image/x-pentax-pef;image/x-ptx;image/x-pxn;image/x-r3d;image/x-raf;image/x-raw;image/x-rw2;image/x-rwl;image/x-rwz;image/x-sigma-x3f;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-sr2;image/x-srf;image/x-x3f;

A je to, díky.

Okresní soutěž v Němčovicích

Na tento závod neproběhla nijak oslnivá příprava, jeden trénink útoků ve čtvrtek, na stovku individuální příprava a štafetu jsme si domluvili až na místě. Organizace se od minulých ročníků příliš nezměnila, na začátku zpoždění, mezi disciplínami, které kvůli pětici mužských a čtveřici ženských družstev odsýpaly rychle, byly nesmyslně dlouhé prostoje. Na druhou stranu jsme měli k dispozici tvrdý podklad s krátce střiženou trávou a kvalitní překážky. Jen časomíře se muselo chvíli domlouvat a průhledné terče mě dvakrát nenadchly.
Začínalo se štafetou mužů, přestože jsme moc netrénovali, byla připravena jen jedna štafeta a bylo na ní, aby zaběhla pořádný čas. To se nakonec podařilo v čase 67 s. Na člunkovou štafetu to není špatné, ale bude co zlepšovat.
Během prvních rozběhů v disciplíně 100 m s překážkami se ukázalo, že se soutěžní družstva probudila z dlouhého spánku a zamakala na svých výkonech. V posledních letech se neustále zlepšující Volduchy doplnili pěknými výkony borci z Mirošova a disciplína konečně dostala nádech soutěže. Já jsem letos na závodech nebyl. Zúčastnil jsem pouze tréninkového víkendu SDH Horní Kamenice a po čtvrtečním tréninku jsem si zaběhl několik pokusů na deštěm rozměklé půdě v Kornaticích. Proto bylo překvapivé, že jsem dokončil v čase 17.30, což by byl můj nový osobák (před tím 17.40 z krajské soutěže). Časomíra není certifikovaná, ale úspěch bych přisoudil drobnostem, které postupně nalézám a především tomu, že mám konečně svůj styl na rozdělovači, který mi tak dlouho chyběl. Za to můžu poděkovat Milanovi Netrvalovi a hlavně Jindrovi Harasimovičovi. V prvním kole jsme se pod 20 sekund vešli jen dva, já společně s Radkem Levým s časem 19.52. Ostatním kornatickým závodníkům se příliš nedařilo. Vylepšili však druhé pokusy, když se Marek s časem 18.76 odsunul Radka na třetí a Libora s časem 19.72 na čtvrté místo. Jen my čtyři z celkového počtu sedmnácti závodníků jsme zaběhli do dvaceti sekund. Já běžel téměř poslední a chtěl jsem samozřejmě vylepšit čas pro týmový součet. Nechtěl jsem u rozdělovače tlačit moc na pilu, ale podle záznamu, který jsem měl možnost později shlédnout, jsem zapojil dost nevybíravým způsobem a proběhl v čase 16.95. V hlavě jsem měl „To to trvalo…“ (pozn. osobák 17.40 jsem měl nějaké dva roky) a pak se na mě všichni sesypali s tvářemi plnými radosti. Placáky, podávání rukou a velice příjemná chvilka. Dal jsem si práci a tu trochu dat jsem zpracoval statisticky. Medián výsledných časů je 22.45 a průměr je ještě horší: 22.94. Už jen kvůli atraktivitě soutěže bych si představoval tyto hodnoty kolem jednadvacáté vteřiny.
Po stovkách mě přepadla únava z parádního koncertu Brutusu v Plzenci a prudkého slunce. Útok jsem absolvoval v mírné letargii, ze které mě vytrhla sprška vody rozptýlené na terčích, které ne a ne sepnout. 29.98 je nic moc a na druhý útok máme připravený opravdu rychlý náběr. Před druhými pokusy scénu oživili místní Soptíci a podívaná to byla skvostná. Druhý útok byl rozběhnutý rychleji, ale i kvůli rychle napravené chybě na rozdělovači nebyl dokončen, protože mě praskla hadice. Síla vody mě odtáhla jen kousek vzad, nic vážného se nestalo. Napjatě jsme čekali až na konec, kdy šli oba protestující, kteří mohli rozhodnout o konečném pořadí. Nikdo však náš bídný čas nepřekonal a mohli jsme slavit vítězství se součtem tří bodů.

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)

Locus umí

Navážu na článek o geocachingu, kde jsem krátce zmínil Locus. V Locus Pro je dostupná hlasová navigace, ale jak na navigaci bez připojení na internet? Připravíte se doma a vyrazíte, ale co když ve shonu zapomenete, nebo Locus zhavaruje a jste v půli cesty.
Nejjednodušší je v klidu předem spustit navigaci, zadat start a cíl a nejdůležitější je zcela dole zatrhnout volbu „Trvalé uložení“. Tímto způsobem si uložíte gpx trasu i s pokyny pro hlasovou navigaci. V nabídce Data/Stopy pak můžete kdykoliv vybrat u trasy možnost „Navigovat“ a jet.
Další pomůckou pro zapomnětlivce jako já je spojení Locus a Mapy.cz. Mapy.cz mají mnoho podkladů, turistické trasy, cyklotrasy, nově běžkařské trasy a tam jsem si všiml příležitosti. Během plánování výletu, které je vážně jednoduché v podobě přetahování waypointů po mapě, jsem nalezl možnost exportu zobrazené trasy v gpx. Pošlete-li si tuto stopu do telefonu a zobrazíte v Locus jako každou jinou stopu, pravděpodobně již nezapomenete odbočit na správnou pěšinu mezi stromy.

PPA repozitáře pro Ubuntu

To je velmi užitečná věc, zejména během přidávání nové funkcionality, zejména nějaké stěžejní, nechci čekat, než se software dostane do repozitáře distribuce. Instalovat si jednorázový balík je také otrava. A tak tu je přídavný repozitář spravovaný tvůrci aplikace nebo jinými nadšenci. Dneska jsem ale doplatil na novou verzi xbmc z jejich Unstable repozitáře, který jsem si přidal ve chvíli šachování s PVR pluginy a já chtěl verzi Eden (12), ta už je nějakou dobu s námi, a já jsem si bohužel repozitář nechal zapnutý. Dnes jsem na to doplatil, když mi televize vypověděla službu. Díky článečku jsem odstranil unstable, přidal stable, přeinstaloval a pustil si televizi, a možná tenhle odkaz někomu ušetří tři čtvrtě hodiny hledání, jak se vrátit k nižší verzi přes aptitude.

sudo add-apt-repository ppa:someppa/ppa
sudo add-apt-repository --remove ppa:someppa/ppa

Kometa PanSTARRS

Od pondělí 11.3.2013 chodím pravidelně mezi 18. a 19. hodinou koukat z okna směrem k západu, kde má být nízko nad horizontem kometa C/2011 L4 PanSTARRS, někdy je zataženo, a když není, tak se nad západním obzorem povaluje oblačnost. Ani včera jsem nebyl úspěšný, ale po stažení fotek jsem přecijen v počítači kometu objevil. Bylo to na přehledové fotografii ze čtvrtka 14.3.2013, kterou jsem pořizoval se záměrem kometu nejprve najít a pak se na ni lépe zaměřit, okem totiž vidět není, nebo jsem špatně hledal. Nicméně teď vím, kam příště zamířit objektiv a snad dnes obloha dovolí pozorování opakovat.

Pořízeno fotoaparátem Pentax K-r, 1 s, ISO 400, F4, při 108 mm (ekvivalent 168 mm), skrz okno, protože šlo primárně jen o nalezení. Čas pořízení je 19:12 SEČ (18:12 UTC). Jedná se o výřez z neupravované fotografie a doufám, že příště budu mít větší štěstí a pořídím lépe.

PanSTARRS

PanSTARRS