def create_wikilink_response(self, res): if res is None: raise cherrpy.NotFound() wikientries = TagStore(res['tags']).get_wikipedia_tags() if not wikientries: raise cherrypy.NotFound() wikilink = 'https://%s.wikipedia.org/wiki/%s' for lang in cherrypy.request.locales: if lang in wikientries: title = urllib.parse.quote(wikientries[lang].replace(' ', '_')) raise cherrypy.HTTPRedirect(wikilink % (lang, title)) for k, v in wikientries.items(): url = "https://%s.wikipedia.org/w/api.php?action=query&prop=langlinks&titles=%s&llprop=url&&lllang=%s&format=json" % ( k, urllib.parse.quote(v.encode('utf8')), lang) try: req = urllib.request.Request( url, headers={'User-Agent': 'Python-urllib/2.7 Routemaps'}) data = urllib.request.urlopen(req).read().decode('utf-8') data = jsonlib.loads(data) except: continue # oh well, we tried (pgid, data) = data["query"]["pages"].popitem() if 'langlinks' in data: raise cherrypy.HTTPRedirect(data['langlinks'][0]['url']) else: # given up to find a requested language k, v = wikientries.popitem() raise cherrypy.HTTPRedirect( wikilink % (k, urllib.parse.quote(v.replace(' ', '_'))))
def get_wikipedia_link(tags, locales): """ Create a wikipedia link from a list of OSM tags. It scans for wikipedia tags and reformats them to form a full URL. Wikipedia tags with URLs already formed are not accepted. """ wikientries = TagStore(tags or {}).get_wikipedia_tags() if not wikientries: return None for lang in locales: if lang in wikientries: title = quote(wikientries[lang].replace(' ', '_')) return WIKIPEDIA_BASEURL.format(lang, title) for k, v in wikientries.items(): url = WIKIPEDIA_TRANSLATEURL.format(k, quote(v.encode('utf8')), lang) try: req = urllib.request.Request( url, headers={'User-Agent': 'waymarkedtrails.org'}) data = urllib.request.urlopen(req).read().decode('utf-8') data = json.loads(data) except: continue # oh well, we tried (pgid, data) = data["query"]["pages"].popitem() if 'langlinks' in data: return data['langlinks'][0]['url'] else: # given up to find a requested language k, v = wikientries.popitem() return WIKIPEDIA_BASEURL.format(k, quote(v.replace(' ', '_')))
def _construct_row(self, obj, conn): tags = TagStore(obj['tags']) outtags = RouteRow(obj['id']) # determine name and level for k, v in tags.items(): if k in ('name', 'ref'): outtags[k] = v elif k.startswith('name:'): outtags.intnames[k[5:]] = v elif k == 'network': outtags.level = self._compute_route_level(v) if tags.get('network:type') == 'node_network': outtags.level = Network.LOC.min() # child relations relids = [ r['id'] for r in obj['members'] if r['type'] == 'R'] members = obj['members'] if len(relids) > 0: # Is this relation part of a cycle? Then drop the relation members # to not get us in trouble with geometry building. h1 = self.rtree.data.alias() h2 = self.rtree.data.alias() sql = sa.select([h1.c.parent])\ .where(h1.c.parent == obj['id'])\ .where(h1.c.child == h2.c.parent)\ .where(h2.c.child == obj['id']) if (self.thread.conn.execute(sql).rowcount > 0): members = [ m for m in obj['members'] if m['type'] == 'W' ] relids = [] # geometry geom = build_route_geometry(conn, members, self.ways, self.data) if geom is None: return None if geom.geom_type not in ('MultiLineString', 'LineString'): raise RuntimeError("Bad geometry %s for %d" % (geom.geom_type, obj['id'])) # if the route is unsorted but linear, sort it if geom.geom_type == 'MultiLineString': fixed_geom = linemerge(geom) if fixed_geom.geom_type == 'LineString': geom = fixed_geom outtags.geom = from_shape(geom, srid=self.data.c.geom.type.srid) # find the country if len(relids) > 0: sel = sa.select([self.c.country], distinct=True)\ .where(self.c.id.in_(relids)) else: c = self.countries sel = sa.select([c.column_cc()], distinct=True)\ .where(c.column_geom().ST_Intersects(outtags.geom)) cur = self.thread.conn.execute(sel) # should be counting when rowcount > 1 if cur.rowcount >= 1: cntry = cur.scalar() else: cntry = None outtags.country = cntry sym = self.symbols.create(tags, cntry, style=Network.from_int(outtags.level).name) if sym is None: outtags.symbol = 'None' else: outtags.symbol = sym.uuid() sym.to_file(os.path.join(self.config.symbol_datadir, outtags.symbol + '.svg'), format='svg') # custom filter callback if self.config.tag_filter is not None: self.config.tag_filter(outtags, tags) if outtags.network is None: if tags.get('network:type') == 'node_network': outtags.network = 'NDS' if outtags.top is None: if 'network' in tags and tags.get('network:type') != 'node_network': h = self.rtree.data r = self.rels.data sel = sa.select([sa.text("'a'")]).where(h.c.child == obj['id'])\ .where(r.c.id == h.c.parent)\ .where(h.c.depth == 2)\ .where(r.c.tags['network'].astext == tags['network'])\ .limit(1) top = self.thread.conn.scalar(sel) outtags.top = (top is None) else: outtags.top = True return outtags