Files
libpostal/scripts/geodata/osm/definitions.py

62 lines
1.5 KiB
Python

import os
import re
import six
from collections import defaultdict
this_dir = os.path.realpath(os.path.dirname(__file__))
DEFAULT_SCRIPT_PATH = os.path.join(this_dir, 'fetch_osm_address_data.sh')
valid_key_regex = re.compile('VALID_(.*?)_KEYS="(.*)"')
kv_regex = re.compile('([^\s]*)=([^\s]*)')
class OSMDefinitions(object):
ALL = '*'
ADMIN_BORDER = 'admin_border'
AEROWAY = 'aeroway'
AMENITY = 'amenity'
BUILDING = 'building'
HISTORIC = 'historic'
LANDUSE = 'landuse'
NATURAL = 'natural'
NEIGHBORHOOD = 'neighborhood'
OFFICE = 'office'
PLACE = 'place'
SHOP = 'shop'
TOURISM = 'tourism'
WATERWAY = 'waterway'
def __init__(self, filename=DEFAULT_SCRIPT_PATH):
script = open(filename).read()
definitions = {}
for definition, text in valid_key_regex.findall(script):
definition = definition.lower()
kvs = defaultdict(set)
for k, v in kv_regex.findall(text):
if v != '':
kvs[k].add(v)
else:
kvs[k].add(self.ALL)
definitions[definition] = kvs
self.definitions = definitions
def meets_definition(self, props, category):
defs = self.definitions.get(category, {})
if not defs:
return False
for k, v in six.iteritems(props):
if v in defs.get(k, set()):
return True
return False
osm_definitions = OSMDefinitions()