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()
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
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'
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'