Ejemplo n.º 1
0
    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(' ', '_')))
Ejemplo n.º 3
0
    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