def __init__(self, id_):
        for attr in self.fields:
            self[attr] = None

        self['id'] = id_
        self['intnames'] = {}
        self['level'] = Network.LOC()
    def _compute_route_level(self, network):
        # Multi-modal routes might have multiple network tags
        for n in network.split(';'):
            if n in self.config.network_map:
                return self.config.network_map[n]

        return Network.LOC()
Example #3
0
def _compute_route_level(network):
    # Multi-modal routes might have multiple network tags
    for n in network.split(';'):
        if n in ROUTE_CONF.network_map:
            return ROUTE_CONF.network_map[n]

    return Network.LOC()
def filter_route_tags(outtags, tags):
    """ Additional tag filtering specifically for hiking routes.
    """
    network = tags.get('network', '')
    if network == 'uk_ldp':
        if tags.get('operator', '') == 'National Trails':
            outtags.level = Network.NAT()
        else:
            outtags.level = Network.REG()

    # Czech system
    for (k,v) in tags.items():
        if k.startswith('kct_'):
            outtags.network = 'CT'
            if network == '' and v == 'major':
                outtags.level = Network.NAT(-1) if k[4:] == 'red' else Network.REG(-1)

    # Region-specific tagging:

    # in the UK slightly downgrade nwns (to distinguish them from National Trails)
    if outtags.country == 'gb' and network == 'nwn':
        outtags.level = Network.NAT(-1)

    # find Swiss hiking network
    if outtags.country == 'ch' and network == 'lwn':
        ot = tags.get('osmc:symbol', '')
        if ot.startswith('yellow:'):
            outtags.network = 'AL1'
        if ot.startswith('red:'):
            outtags.network = 'AL2'
        if ot.startswith('blue:'):
            outtags.network = 'AL4'

    # Italian hiking network (see #266), also uses Swiss system
    cai_level = { 'T' : '1', 'E' : '2', 'EE' : '3' }
    if outtags.country == 'it' and network == 'lwn' \
        and tags.get('osmc:symbol', '').startswith('red') and 'cai_scale' in tags:
        outtags.network = 'AL' + cai_level.get(tags['cai_scale'], '4')

    # Fränkischer Albverein (around Nürnberg)
    #  too extensive regional network, so downgrade for later display
    if tags.get('operator', '') == u'Fränkischer Albverein':
        outtags.level -= 2
    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
Example #6
0
from config.common import *

MAPTYPE = 'routes'

DB_SCHEMA = 'riding'
DB_TABLES = RouteDBTables()

DB_ROUTE_SUBSET = """
    tags ? 'route' and tags->>'type' IN ('route', 'superroute')
    AND 'horse' = any(regexp_split_to_array(tags->>'route', ';'))
    AND NOT (tags ? 'state' AND tags->>'state' = 'proposed')"""

ROUTES = RouteTableConfig()
ROUTES.network_map = {
    'nhn': Network.NAT(0),
    'nwn': Network.NAT(0),
    'nwn:kct': Network.NAT(0),
    'ncn': Network.NAT(0),
    'rhn': Network.REG(0),
    'rwn': Network.REG(0),
    'rcn': Network.REG(0),
    'lhn': Network.LOC(0),
    'lwn': Network.LOC(0),
    'lcn': Network.LOC(0),
}
ROUTES.symbols = ('.osmc_symbol', '.ref_symbol', '.color_box')
ROUTES.symbol_datadir = os.path.join(MEDIA_DIR, 'symbols/riding')

GUIDEPOSTS = GuidePostConfig()
GUIDEPOSTS.subtype = 'horse'
Example #7
0
from config.common import *

MAPTYPE = 'routes'

DB_SCHEMA = 'mtb'
DB_TABLES = RouteDBTables()

DB_ROUTE_SUBSET = """
    tags ? 'route' and tags->>'type' IN ('route', 'superroute')
    AND 'mtb' = any(regexp_split_to_array(tags->>'route', ';'))
    AND NOT (tags ? 'state' AND tags->>'state' = 'proposed')"""

ROUTES = RouteTableConfig()
ROUTES.network_map = {
    'icn': Network.INT(0),
    'ncn': Network.NAT(0),
    'rcn': Network.REG(0),
    'lcn': Network.LOC(0)
}
ROUTES.symbols = ('.swiss_mobile', '.jel_symbol', '.ref_symbol', '.color_box')
ROUTES.symbol_datadir = os.path.join(MEDIA_DIR, 'symbols/cycling')

GUIDEPOSTS = GuidePostConfig()
GUIDEPOSTS.subtype = 'mtb'
GUIDEPOSTS.require_subtype = True

DEFSTYLE = RouteNetworkStyle()

SYMBOLS = WmtConfig()
SYMBOLS.swiss_mobil_bgcolor = (0.88, 0.83, 0.32)
MAPTYPE = 'routes'

DB_SCHEMA = 'hiking'
DB_TABLES = RouteDBTables()

DB_ROUTE_SUBSET = """
    tags ? 'route' and tags->>'type' IN ('route', 'superroute')
    AND array['hiking', 'foot', 'walking'] && regexp_split_to_array(tags->>'route', ';')
    AND NOT (tags ? 'state' AND tags->>'state' = 'proposed')"""

DEFSTYLE = RouteNetworkStyle()
DEFSTYLE.add_to_collector = MethodType(hiking_add_to_collector, DEFSTYLE)

ROUTES = RouteTableConfig()
ROUTES.network_map = {
        'iwn': Network.INT(),
        'nwn': Network.NAT(),
        'rwn': Network.REG(),
        'lwn': Network.LOC()
        }
ROUTES.tag_filter = filter_route_tags
ROUTES.symbols = ( '.image_symbol',
                   '.swiss_mobile',
                   '.jel_symbol',
                   '.kct_symbol',
                   '.cai_hiking_symbol',
                   '.osmc_symbol',
                   '.ref_color_symbol',
                   '.ref_symbol')
ROUTES.symbol_datadir = os.path.join(MEDIA_DIR, 'symbols/hiking')
from config.common import *

MAPTYPE = 'routes'

DB_SCHEMA = 'skating'
DB_TABLES = RouteDBTables()

DB_ROUTE_SUBSET  = """
    tags ? 'route' and tags->>'type' IN ('route', 'superroute')
    AND 'inline_skates' = any(regexp_split_to_array(tags->>'route', ';'))
    AND NOT (tags ? 'state' AND tags->>'state' = 'proposed')"""

ROUTES = RouteTableConfig()
ROUTES.network_map = {
        'national': Network.NAT(0),
        'regional': Network.REG(0),
        'rin': Network.REG(0),
        'local': Network.LOC(0)
        }
ROUTES.symbols = ( '.swiss_mobile',
                   '.ref_symbol',
                   '.color_box')
ROUTES.symbol_datadir = os.path.join(MEDIA_DIR, 'symbols/skating')

GUIDEPOSTS = GuidePostConfig()
GUIDEPOSTS.subtype = 'skating'
GUIDEPOSTS.require_subtype = True

NETWORKNODES = NetworkNodeConfig()
NETWORKNODES.node_tag = 'rin_ref'