def overpass_filter(self): nodes = set() ways = set() relations = set() def add_where(filters,key): geom_types = self.geom_types(key) if 'points' in geom_types: for e in filters: nodes.add(e) if 'lines' in geom_types: for e in filters: ways.add(e) if 'polygons' in geom_types: for e in filters: ways.add(e) relations.add(e) for key in self.themes: theme = self.doc[key] if 'where' in theme: if isinstance(theme['where'],list): for clause in theme['where']: add_where(OverpassFilter(clause).filter(),key) else: add_where(OverpassFilter(theme['where']).filter(),key) else: add_where(("['" + x + "']" for x in theme['select']),key) return (list(nodes), list(ways), list(relations))
def test_and_or(self): s = OverpassFilter("name1 = 'foo' or name2 = 'bar'") self.assertEqual(s.filter(), ["[name1='foo']", "[name2='bar']"]) s = OverpassFilter( "(name1 = 'foo' and name2 = 'bar') or name3 = 'baz'") self.assertEqual(s.filter(), ["[name1='foo']", "[name2='bar']", "[name3='baz']"])
def test_notnull(self): s = OverpassFilter("name is not null") self.assertEqual(s.filter(),["[name]"])
def test_whitespace(self): s = OverpassFilter("name = 'some value'") self.assertEqual(s.filter(),["[name='some value']"])
def test_basic_list(self): s = OverpassFilter("name IN ('val1','val2')") self.assertEqual(s.filter(),["[name~'val1|val2']"])
def test_basic(self): s = OverpassFilter("name = 'somename'") self.assertEqual(s.filter(),["[name='somename']"]) s = OverpassFilter("level > 4") self.assertEqual(s.filter(),["[level]"])