{"id":317,"date":"2013-05-09T09:15:55","date_gmt":"2013-05-09T08:15:55","guid":{"rendered":"http:\/\/honza.paws.cz\/?p=317"},"modified":"2013-05-21T08:22:10","modified_gmt":"2013-05-21T07:22:10","slug":"osm-a-python","status":"publish","type":"post","link":"http:\/\/honza.paws.cz\/?p=317","title":{"rendered":"OSM a Python"},"content":{"rendered":"<p style=\"text-align: justify;\">Proto\u017ee m\u00e1m doma Raspberry PI, p\u0159irostl mi k srdci programovac\u00ed jazyk Python. P\u0159i psan\u00ed je nutn\u00e9 dodr\u017eovat odsazov\u00e1n\u00ed vno\u0159en\u00fdch blok\u016f, \u010d\u00edm\u017e je na druhou stranu mo\u017en\u00e9 zbavit se nepraktick\u00e9ho z\u00e1vorkov\u00e1n\u00ed a st\u0159edn\u00edk\u016f na konci \u0159\u00e1dku. Syntaxe m\u00e1 tak\u00e9 bl\u00ed\u017e k b\u011b\u017en\u00e9mu jazyku, a v neposledn\u00ed \u0159ad\u011b jsme zbaveni nutn\u00e9ho kompilov\u00e1n\u00ed a n\u00e1sledn\u00e9ho spou\u0161t\u011bn\u00ed ve speci\u00e1ln\u00edm editoru.<br \/>\nNapsat program v Pythonu tedy nen\u00ed nijak t\u011b\u017ek\u00e9, dnes zve\u0159ejn\u00edm k libovoln\u00e9mu u\u017eit\u00ed k\u00f3d, kter\u00fd pou\u017e\u00edv\u00e1m k vytv\u00e1\u0159en\u00ed mapy na z\u00e1klad\u011b OSM do sv\u00e9ho Androida. P\u016fvodn\u011b byl vytvo\u0159en v Qt, kter\u00e9 m\u00e1m tak\u00e9 velmi r\u00e1d, ale postupn\u011b se mi na tak mal\u00e9m projektu p\u0159estala l\u00edbit slo\u017eitost \u00faprav a neust\u00e1l\u00e9 kompilov\u00e1n\u00ed. Tvorba zabrala n\u011bkolik dlouh\u00fdch noc\u00ed, ne\u017e byl program vylad\u011bn a urychlen z p\u016fvodn\u00ed hodiny a p\u016fl b\u011bhu na 17 minut. V Pythonu se d\u00edky vyu\u017eit\u00ed jeho z\u00e1kladn\u00edch struktur \u010das zkr\u00e1til dokonce na deset minut, ale pak jsme p\u0159id\u00e1val dal\u0161\u00ed kontroly a vylep\u0161ov\u00e1ky, co\u017e b\u011bh o n\u011bjakou dobu prot\u00e1hne. Proto\u017ee jde o moje d\u00edtko a pipl\u00e1n\u00ed mi zabralo n\u011bjak\u00fd \u010das, nejprve jsem jej zve\u0159ej\u0148ovat necht\u011bl, ale pak jsem si \u0159ekl, \u017ee s Linuxem m\u011bl taky kdosi spoustu pr\u00e1ce&#8230; Stejn\u011b si mysl\u00edm (m\u00e1m tady jeden), \u017ee existuj\u00ed mnohem sofistikovan\u011bj\u0161\u00ed skripty, kter\u00e9 proch\u00e1zej\u00ed p\u0159\u00edmo datab\u00e1zi. Tu j\u00e1 ale k dispozici nem\u00e1m, p\u0159esto\u017ee jsem na str\u00e1nky um\u00edstil reklamu, za m\u011bs\u00edc lid\u00e9 naklikali asi 5 K\u010d a za to si server nepo\u0159\u00edd\u00edm. Skript funguje jednodu\u0161e, nech\u00e1 si pomoc\u00ed <em>osmconvert<\/em> p\u0159ev\u00e9st PBF do XML form\u00e1tu, ten p\u0159elousk\u00e1, najde relace s trasami K\u010cT a p\u0159esype vybran\u00e9 tagy z relace na v\u0161echny cesty, kter\u00e9 jsou jej\u00edmi \u010dleny. v\u00fdsledek op\u011bt vr\u00e1t\u00ed do <em>osmconvert<\/em>, kter\u00fd tedy mus\u00ed le\u017eet vedle skriptu, a ten jej p\u0159evede zp\u011bt do PBF tak, aby se maxim\u00e1ln\u011b \u0161et\u0159ilo m\u00edsto na m\u00e9m zapln\u011bn\u00e9m disku osobn\u00edho po\u010d\u00edta\u010de.<br \/>\nVytvo\u0159en\u00e9 mapy u\u017e je jin\u00e1 z\u00e1le\u017eitost, kter\u00e1 zahrnuje v\u0161ehov\u0161udy jeden p\u0159\u00edkaz do <em>osmosis<\/em>, ale o tom t\u0159eba jindy.<\/p>\n<p style=\"text-align: justify;\">\n<pre>\r\n#!\/usr\/bin\/python\r\n# -*- coding: utf-8 -*-\r\n\r\n__author__=\"Speirs\"\r\n\r\nimport sys, re, subprocess\r\n\r\n#nodes = subprocess.Popen([\".\/osmconvert\", \"--drop-relations\", \"--drop-ways\", sys.argv[1]], stdout=subprocess.PIPE)\r\n#ways = subprocess.Popen([\".\/osmconvert\", \"--drop-relations\", \"--drop-nodes\", sys.argv[1]], stdout=subprocess.PIPE)\r\nmapFile = subprocess.Popen([\".\/osmconvert\", sys.argv[1]], stdout=subprocess.PIPE)\r\nrelations = subprocess.Popen([\".\/osmconvert\", \"--drop-nodes\", \"--drop-ways\", sys.argv[1]], stdout=subprocess.PIPE)\r\n\r\nnodeStart = re.compile('\\s*&lt;node id=\"(\\d+)\" lat=\"([0-9.]*)\" lon=\"([0-9.]*)\"')\r\nnodeEnd = re.compile('\\s*&lt;\/node&gt;')\r\nwayStart = re.compile('\\s*&lt;way id=\"(\\d+)\"\\s')\r\nwayEnd = re.compile('\\s*&lt;\/way&gt;')\r\nrelationStart = re.compile('\\s*&lt;relation id=\"(\\d+)\"')\r\nrelationEnd = re.compile('\\s*&lt;\/relation&gt;')\r\n\r\nnodeID = re.compile( '\\s*&lt;nd ref=\"(\\d+)\"')\r\nhikeRoute = re.compile('\\s*&lt;tag k=\\\"route\\\" v=\\\"(hiking|foot)\\\"')\r\nkctRoute = re.compile('\\s*&lt;tag k=\\\"kct_.+\\\" v=\\\"')\r\nbikeRoute = re.compile('\\s*&lt;tag k=\\\"route\\\" v=\\\"(bicycle|mtb)\\\"')\r\ntag = re.compile('\\s*&lt;tag k=\\\"(.+)\\\" v=\\\"(.+)\\\"')\r\nmember = re.compile('\\s*&lt;member type=\"(.+)\" ref=\"(.+)\"\\s')\r\n\r\nstack = []\r\nwayTags = {}\r\n\r\ndef compare(a, b):\r\n        return cmp(int(a), int(b))\r\n        \r\ndef combine(i, l):\r\n\tfor key, value in l.items():\r\n\t\tif (key in ('name', 'ref')) and (key in wayTags[i]):\r\n\t\t\tif value not in wayTags[i][key].split(','):\r\n\t\t\t\twayTags[i][key] = wayTags[i][key] + ',' + value\r\n\t\telse:\r\n\t\t\twayTags[i][key] = value\r\n        \r\ndef printTag(key, value):\r\n        print '\\t\\t&lt;tag k=\"{}\" v=\"{}\"\/&gt;'.format(key, value)\r\n        \r\ndef hikingRoute(l):\r\n\twayIds = []\r\n\ttags = {}\r\n\tkctKeys = ('kct_red', 'kct_blue', 'kct_green', 'kct_yellow')\r\n\tkctValues = ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'bicycle', 'ski', 'wheelchair', 'interesting_object')\r\n\r\n\tfor line in l:\r\n\t\tt = tag.match(line)\r\n\t\tm = member.match(line)\r\n\t\tif m:\r\n\t\t\tif m.group(1) == 'way':\r\n\t\t\t\twayIds.append(m.group(2))\r\n    \t\telif t:\r\n    \t\t\tif t.group(1) in kctKeys:\r\n    \t\t\t\tkct = t.group(1).split('_')\r\n    \t\t\t\ttyp = t.group(2).split(';')\r\n    \t\t\t\ttags[t.group(1)] = typ[0]\r\n    \t\t\t\ttags['osmc'] = 'yes'\r\n    \t\t\t\ttags['osmc_color'] = kct[1]\r\n    \t\t\t\tif typ[0] in ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'wheelchair', 'interesting_object'):\r\n    \t\t\t\t\ttags['osmc_background'] = 'white'\r\n    \t\t\t\telif typ[0] == 'bicycle':\r\n    \t\t\t\t\ttags['osmc_background'] = 'yellow'\r\n    \t\t\t\telif typ[0] == 'ski':\r\n    \t\t\t\t\ttags['osmc_background'] = 'orange' \t\t\t\t\t\r\n    \t\t\t\t\t\r\n    \t\t\t\tif typ[0] in ('major', 'bicycle', 'ski'):\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_bar'\r\n    \t\t\t\telif typ[0]== 'peak':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_triangle'\r\n    \t\t\t\telif typ[0] == 'local':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_corner'\r\n    \t\t\t\telif typ[0] == 'interesting_object':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_turned_T'\r\n    \t\t\t\telif typ[0] == 'ruin':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_L'    \t\t\t\t\t\r\n    \t\t\t\telif typ[0] == 'spring':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_bowl'\r\n    \t\t\t\telif typ[0] == 'horse':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_dot'\r\n    \t\t\t\telif typ[0] == 'wheelchair':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_wheelchair'\r\n    \t\t\t\telif typ[0] == 'learning':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_backslash'\r\n    \t\t\t\t\r\n    \tfor i in wayIds:\r\n    \t\tif i in wayTags:\r\n    \t\t\tcombine(i, tags)\r\n    \t\t\t#wayTags[i].update(tags)\r\n    \t\telse:\r\n    \t\t\twayTags[i] = {}\r\n    \t\t\tfor key, value in tags.items():\r\n    \t\t\t\twayTags[i][key] = value\r\n    \t\r\n    \ttags.clear()\r\n    \tdel wayIds[:]\r\n    \t\t\t\r\ndef bikingRoute(l):\r\n\twayIds = []\r\n\ttags = {}\r\n\tfor line in l:\t\t\r\n\t\tt = tag.match(line)\r\n\t\tm = member.match(line)\r\n\t\tif m:\r\n\t\t\tif m.group(1) == 'way':\r\n\t\t\t\twayIds.append(m.group(2))\r\n    \t\telif t:\r\n    \t\t\tif t.group(1) in ('network', 'ref', 'route'):\r\n    \t\t\t\ttags[t.group(1)] = t.group(2)\r\n    \t\r\n    \tfor i in wayIds:\r\n    \t\tif i in wayTags:\r\n    \t\t\tcombine(i, tags)\r\n    \t\t\t#wayTags[i].update(tags)\r\n    \t\telse:\r\n    \t\t\twayTags[i] = {}\r\n    \t\t\tfor key, value in tags.items():\r\n    \t\t\t\twayTags[i][key] = value\r\n    \ttags.clear()\r\n    \tdel wayIds[:]\r\n\r\nflag = 0\r\nfor line in relations.stdout:\r\n\trelS = relationStart.match(line)\t\t\r\n    \trelE = relationEnd.match(line)\r\n    \thikeR = kctRoute.match(line)\r\n    \tbikeR = bikeRoute.match(line)\r\n    \tif relS:\r\n    \t   \tflag = -1\r\n    \telif relE:\r\n    \t\tif flag == 1:\r\n    \t\t\thikingRoute(stack)\r\n    \t\telif flag == 2:\r\n    \t\t\tbikingRoute(stack)    \t\t\r\n    \t\tdel stack[:]\r\n    \t\tflag = 0\r\n    \telif hikeR:\r\n    \t\tflag = 1\r\n    \t\tstack.append(line)\r\n    \telif bikeR:\r\n    \t\tflag = 2\r\n    \t\tstack.append(line)\r\n    \telif flag != 0:    \t\t\r\n    \t\tstack.append(line)\r\n\t\r\nid = -1\r\nh = 0\r\nb = 0\r\nfor line in mapFile.stdout:\r\n\ts = wayStart.match(line)\r\n\te = wayEnd.match(line)\r\n\thi = kctRoute.match(line)\r\n\tbi = bikeRoute.match(line)\r\n\tif s:\r\n\t\tid = s.group(1)\r\n\telif hi:\r\n\t\th = 1\r\n\telif bi:\r\n\t\tb = 1\r\n\telif e:\r\n\t\tif id != -1:\r\n\t\t\tif id in wayTags:\r\n\t\t\t\tfor key, value in wayTags[id].items():\r\n\t\t\t\t\tif h == 0 and (value in ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'wheelchair', 'interesting_object')):\r\n\t\t\t\t\t\tprintTag('route', 'hiking')\r\n\t\t\t\t\t\th = 1\r\n\t\t\t\t\telif key == 'route' and value == 'bicycle':\r\n\t\t\t\t\t\tb = 1\r\n\t\t\t\t\telif b == 0 and value == 'bicycle':\r\n\t\t\t\t\t\tprintTag('route', 'bicycle')\r\n\t\t\t\t\t\tb = 1\r\n\t\t\t\t\tprintTag(key, value)\r\n\t\t\t\tdel wayTags[id]\r\n\t\t\t\th = 0\r\n\t\t\t\tb = 0\r\n\t\tid = -1\r\n\tprint line.rstrip()\r\n\t\r\n\t\r\nexit(0)\r\n<\/pre>\n<p>P\u0159id\u00e1m je\u0161t\u011b druhou upravenou verzi, kter\u00e1 um\u00ed vytvo\u0159it turistick\u00e9 zna\u010dky pro Slovensko, ale hlavn\u00ed zm\u011bna spo\u010d\u00edv\u00e1 v duplikaci cest. Jednodu\u0161e vezme v\u0161echny body z p\u016fvodn\u00ed cesty a vytvo\u0159\u00ed novou cestu pouze s tagy turistick\u00fdch zna\u010dek. T\u00edm se zbav\u00edm n\u011bkolika probl\u00e9m\u016f nar\u00e1z. Intern\u00ed vzhled Locusu pou\u017e\u00edv\u00e1 takov\u00e9 zna\u010dky, \u017ee najednou m\u016f\u017ee cesta n\u00e9st jen jednu barvu. D\u00e1le jedin\u00fd Locus m\u00e1 opravenou nesmyslnou chybu, p\u0159i kter\u00e9 vyhled\u00e1va\u010d tag pro renderov\u00e1n\u00ed odsouhlas\u00ed libovolnou dvojici kl\u00ed\u010d-hodnota, kterou najde. Tak\u017ee m\u011bla-li cesta najednou kct_red=major i kct_green=learning, v c:geo se bez ostychu vykreslily ikonky, jako by \u0161lo o kct_red=learning. V\u00fdsledn\u00fd soubor nabyde na velikosti jen o p\u00e1r MB. P\u0159i zpracov\u00e1n\u00ed v\u00fdsledn\u00e9ho souboru je t\u0159eba v osmosis pou\u017e\u00edt <em>&#8211;sort<\/em>, proto\u017ee id u cest nejsou se\u0159azena.<\/p>\n<pre>\r\n#!\/usr\/bin\/python\r\n# -*- coding: utf-8 -*-\r\n\r\n__author__=\"Speirs\"\r\n\r\nimport sys, re, subprocess\r\nfrom datetime import datetime\r\n\r\n#nodes = subprocess.Popen([\".\/osmconvert\", \"--drop-relations\", \"--drop-ways\", sys.argv[1]], stdout=subprocess.PIPE)\r\n#ways = subprocess.Popen([\".\/osmconvert\", \"--drop-relations\", \"--drop-nodes\", sys.argv[1]], stdout=subprocess.PIPE)\r\nmapFile = subprocess.Popen([\".\/osmconvert\", sys.argv[1]], stdout=subprocess.PIPE)\r\nrelations = subprocess.Popen([\".\/osmconvert\", \"--drop-nodes\", \"--drop-ways\", sys.argv[1]], stdout=subprocess.PIPE)\r\n\r\nnodeStart = re.compile('\\s*<node id=\"(\\d+)\" lat=\"([0-9.]*)\" lon=\"([0-9.]*)\"')\r\nnodeEnd = re.compile('\\s*<\/node>')\r\nwayStart = re.compile('\\s*<way id=\"(\\d+)\"\\s')\r\nwayEnd = re.compile('\\s*<\/way>')\r\nrelationStart = re.compile('\\s*<relation id=\"(\\d+)\"')\r\nrelationEnd = re.compile('\\s*<\/relation>')\r\n\r\nnodeID = re.compile( '\\s*<nd ref=\"(\\d+)\"')\r\nhikeRoute = re.compile('\\s*<tag k=\\\"route\\\" v=\\\"(hiking|foot)\\\"')\r\nkctRoute = re.compile('\\s*<tag k=\\\"kct_.+\\\" v=\\\"')\r\nkstRoute = re.compile('\\s*<tag k=\\\"operator\\\" v=\\\"KST\\\"')\r\nbikeRoute = re.compile('\\s*<tag k=\\\"route\\\" v=\\\"(bicycle|mtb)\\\"')\r\ntag = re.compile('\\s*<tag k=\\\"(.+)\\\" v=\\\"(.+)\\\"')\r\nmember = re.compile('\\s*<member type=\"(.+)\" ref=\"(.+)\"\\s')\r\n\r\nstack = []\r\nwayTags = {}\r\n        \r\ndef printTag(key, value):\r\n        print '\\t\\t<tag k=\"{}\" v=\"{}\"\/>'.format(key, value)\r\n        \r\ndef hikingRoute(l):\r\n\twayIds = []\r\n\ttags = {}\r\n\tkctKeys = ('kct_red', 'kct_blue', 'kct_green', 'kct_yellow')\r\n\tkctValues = ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'bicycle', 'ski', 'wheelchair', 'interesting_object')\r\n\r\n\tfor line in l:\r\n\t\tt = tag.match(line)\r\n\t\tm = member.match(line)\r\n\t\tif m:\r\n\t\t\tif m.group(1) == 'way':\r\n\t\t\t\twayIds.append(long(m.group(2)))\r\n    \t\telif t:\r\n    \t\t\tif t.group(1) in kctKeys:\r\n    \t\t\t\tkct = t.group(1).split('_')\r\n    \t\t\t\ttyp = t.group(2).split(';')\r\n    \t\t\t\ttags[t.group(1)] = typ[0]\r\n    \t\t\t\ttags['osmc'] = 'yes'\r\n    \t\t\t\ttags['osmc_color'] = kct[1]\r\n    \t\t\t\tif typ[0] in ('major', 'local', 'peak', 'learning', 'ruin', 'spring', 'horse', 'wheelchair', 'interesting_object'):\r\n    \t\t\t\t\ttags['osmc_background'] = 'white'\r\n    \t\t\t\telif typ[0] == 'bicycle':\r\n    \t\t\t\t\ttags['osmc_background'] = 'yellow'\r\n    \t\t\t\telif typ[0] == 'ski':\r\n    \t\t\t\t\ttags['osmc_background'] = 'orange' \t\t\t\t\t\r\n    \t\t\t\t\t\r\n    \t\t\t\tif typ[0] in ('major', 'bicycle', 'ski'):\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_bar'\r\n    \t\t\t\telif typ[0]== 'peak':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_triangle'\r\n    \t\t\t\telif typ[0] == 'local':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_corner'\r\n    \t\t\t\telif typ[0] == 'interesting_object':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_turned_T'\r\n    \t\t\t\telif typ[0] == 'ruin':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_L'    \t\t\t\t\t\r\n    \t\t\t\telif typ[0] == 'spring':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_bowl'\r\n    \t\t\t\telif typ[0] == 'horse':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_dot'\r\n    \t\t\t\telif typ[0] == 'wheelchair':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_wheelchair'\r\n    \t\t\t\telif typ[0] == 'learning':\r\n    \t\t\t\t\ttags['osmc_foreground'] = kct[1] + '_backslash'\r\n    \t\t\telif t.group(1) in ('network', 'ref', 'route'):\r\n    \t\t\t\ttags[t.group(1)] = t.group(2)\r\n    \t\t\t\t\r\n    \tfor i in wayIds:\r\n    \t\tif i in wayTags:\r\n    \t\t\twayTags[i].append(tags.copy())\r\n    \t\telse:\r\n    \t\t\twayTags[i] = []\r\n    \t\t\twayTags[i].append(tags.copy())\r\n    \ttags.clear()\r\n    \tdel wayIds[:]\r\n\r\ndef hikeRoute(l):\r\n\twayIds = []\r\n\ttags = {}\r\n\tkstKeys = ('red', 'blue', 'green', 'yellow')\r\n\tkstValues = ('major', 'local', 'peak', 'education', 'ruin', 'spring', 'interesting_object')\r\n\tbarva = ''\r\n\tsymbol = ''\r\n\r\n\tfor line in l:\r\n\t\tt = tag.match(line)\r\n\t\tm = member.match(line)\r\n\t\t\r\n\t\tif m:\r\n\t\t\tif m.group(1) == 'way':\r\n\t\t\t\twayIds.append(long(m.group(2)))\r\n    \t\telif t:\r\n    \t\t\tif t.group(1) in ('colour'):\r\n    \t\t\t\ttags['osmc'] = 'yes'\r\n    \t\t\t\tbarva = t.group(2)\r\n    \t\t\t\ttags['osmc_color'] = t.group(2)\r\n    \t\t\telif t.group(1) in ('network', 'ref', 'route'):\r\n    \t\t\t\ttags[t.group(1)] = t.group(2)    \t\t\t\r\n    \t\t\telif t.group(1) in ('symbol'):\r\n    \t\t\t\tif t.group(2) in kstValues:\r\n    \t\t\t\t\ttags['osmc_background'] = 'white'\r\n    \t\t\t\t\tsymbol = t.group(2)\r\n    \t\t\t\t\t\r\n    \tif barva == '' or symbol == '':\r\n    \t\ttags.clear()\r\n    \t\tdel wayIds[:]\r\n    \t\treturn\r\n    \t\t\r\n    \t\r\n    \tif symbol == 'educational':\r\n    \t\ttags['kct_'+barva] = 'learning'\r\n    \telse:\r\n    \t\ttags['kct_'+barva] = symbol\r\n    \t\t\r\n    \tif symbol == 'major':\r\n    \t\ttags['osmc_foreground'] = barva + '_bar'\r\n    \telif symbol == 'peak':\r\n    \t\ttags['osmc_foreground'] = barva + '_triangle'\r\n    \telif symbol == 'local':\r\n    \t\ttags['osmc_foreground'] = barva + '_corner'\r\n    \telif symbol == 'interesting_object':\r\n    \t\ttags['osmc_foreground'] = barva + '_turned_T'\r\n    \telif symbol == 'ruin':\r\n    \t\ttags['osmc_foreground'] = barva + '_L'    \t\t\t\t\t\r\n    \telif symbol == 'spring':\r\n    \t\ttags['osmc_foreground'] = barva + '_bowl'\r\n    \telif symbol == 'roundtrip':\r\n    \t\ttags['osmc_foreground'] = barva + '_dot'\r\n    \telif symbol == 'education':\r\n    \t\ttags['osmc_foreground'] = barva + '_backslash'\r\n    \t\t\t\t\r\n    \tfor i in wayIds:\r\n    \t\tif i in wayTags:\r\n    \t\t\twayTags[i].append(tags.copy())\r\n    \t\telse:\r\n    \t\t\twayTags[i] = []\r\n    \t\t\twayTags[i].append(tags.copy())\r\n    \ttags.clear()\r\n    \tdel wayIds[:]\r\n    \t\r\ndef bikingRoute(l):\r\n\twayIds = []\r\n\ttags = {}\r\n\tfor line in l:\t\t\r\n\t\tt = tag.match(line)\r\n\t\tm = member.match(line)\r\n\t\tif m:\r\n\t\t\tif m.group(1) == 'way':\r\n\t\t\t\twayIds.append(long(m.group(2)))\r\n    \t\telif t:\r\n    \t\t\tif t.group(1) in ('network', 'ref', 'route'):\r\n    \t\t\t\ttags[t.group(1)] = t.group(2)\r\n    \t\r\n    \tfor i in wayIds:\r\n    \t\tif i in wayTags:\r\n    \t\t\twayTags[i].append(tags.copy())\r\n    \t\telse:\r\n    \t\t\twayTags[i] = []\r\n    \t\t\twayTags[i].append(tags.copy())\r\n    \ttags.clear()\r\n    \tdel wayIds[:]\r\n\r\nflag = 0\r\nfor line in relations.stdout:\r\n\trelS = relationStart.match(line)\t\t\r\n    \trelE = relationEnd.match(line)\r\n    \thikeR = kctRoute.match(line)\r\n    \tkstR = kstRoute.match(line)\r\n    \tbikeR = bikeRoute.match(line)\r\n    \tif relS:\r\n    \t   \tflag = -1\r\n    \telif relE:\r\n    \t\tif flag == 1:\r\n    \t\t\thikingRoute(stack)\r\n    \t\telif flag == 2:\r\n    \t\t\tbikingRoute(stack)\r\n    \t\telif flag == 3:\r\n    \t\t\thikeRoute(stack)\r\n    \t\tdel stack[:]\r\n    \t\tflag = 0\r\n    \telif hikeR:\r\n    \t\tflag = 1\r\n    \t\tstack.append(line)\r\n    \telif bikeR:\r\n    \t\tflag = 2\r\n    \t\tstack.append(line)\r\n    \telif kstR:\r\n    \t\tflag = 3\r\n    \t\tstack.append(line)\r\n    \telif flag != 0:    \t\t\r\n    \t\tstack.append(line)\r\n\t\r\nid = -1\r\nnid = 50000000000\r\ndel stack[:]\r\ndatum = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')\r\n\r\nfor line in mapFile.stdout:\r\n\ts = wayStart.match(line)\r\n\te = wayEnd.match(line)\r\n\tn = nodeID.match(line)\r\n\tif s:\r\n\t\tid = long(s.group(1))\r\n\telif n and id != -1:\r\n\t\tstack.append(line)\r\n\telif e and id != -1:\r\n\t\tif id in wayTags:\r\n\t\t\tfor i in wayTags[id]:\r\n\t\t\t\tprint '\\t<\/way>'\r\n\t\t\t\tprint '\\t<way id=\"{}\" version=\"1\" timestamp=\"{}\" changeset=\"-1\" uid=\"-1\" user=\"none\">'.format(nid, datum)\r\n\t\t\t\tfor li in stack:\r\n\t\t\t\t\tprint li.rstrip()\t\t\t\r\n\t\t\t\tfor key, value in i.items():\r\n\t\t\t\t\tprintTag(key, value)\r\n\t\t\t\tnid += 1\r\n\t\t\tdel wayTags[id]\r\n\t\tdel stack[:]\r\n\t\tid = -1\r\n\tprint line.rstrip()\r\n\t\r\nexit(0)\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Proto\u017ee m\u00e1m doma Raspberry PI, p\u0159irostl mi k srdci programovac\u00ed jazyk Python. P\u0159i psan\u00ed je nutn\u00e9 dodr\u017eovat odsazov\u00e1n\u00ed vno\u0159en\u00fdch blok\u016f, \u010d\u00edm\u017e je na druhou stranu mo\u017en\u00e9 zbavit se nepraktick\u00e9ho z\u00e1vorkov\u00e1n\u00ed a st\u0159edn\u00edk\u016f na konci \u0159\u00e1dku. Syntaxe m\u00e1 tak\u00e9 bl\u00ed\u017e k b\u011b\u017en\u00e9mu jazyku, a v neposledn\u00ed \u0159ad\u011b jsme zbaveni nutn\u00e9ho kompilov\u00e1n\u00ed a n\u00e1sledn\u00e9ho spou\u0161t\u011bn\u00ed ve speci\u00e1ln\u00edm [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/317"}],"collection":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=317"}],"version-history":[{"count":7,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/317\/revisions"}],"predecessor-version":[{"id":343,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/317\/revisions\/343"}],"wp:attachment":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=317"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}