From fcff210d77750087e0b8b7502a18c2205a17be01 Mon Sep 17 00:00:00 2001 From: Al Date: Mon, 13 Jul 2015 00:58:47 -0400 Subject: [PATCH] [rtree] Language polygon index returns polygons from most specific admin level to least specific --- scripts/geodata/polygons/language_polys.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/scripts/geodata/polygons/language_polys.py b/scripts/geodata/polygons/language_polys.py index 801f89c7..683843ac 100644 --- a/scripts/geodata/polygons/language_polys.py +++ b/scripts/geodata/polygons/language_polys.py @@ -56,15 +56,22 @@ class LanguagePolygonIndex(RTreePolygonIndex): admin_level = properties['qs_level'] + level_num = None if admin_level == 'adm1': name_key = 'qs_a1' code_key = 'qs_a1_lc' + level_num = 1 elif admin_level == 'adm1_region': name_key = 'qs_a1r' code_key = 'qs_a1r_lc' - elif admin_level != 'adm0': + level_num = 1 + elif admin_level == 'adm0': + level_num = 0 + else: continue + assert level_num is not None + if admin_level != 'adm0': admin1 = properties.get(name_key) admin1_code = properties.get(code_key) @@ -91,6 +98,7 @@ class LanguagePolygonIndex(RTreePolygonIndex): properties['languages'] = [{'lang': lang, 'default': default} for lang, default in languages] + properties['admin_level'] = level_num poly_type = rec['geometry']['type'] if poly_type == 'Polygon': @@ -110,3 +118,11 @@ class LanguagePolygonIndex(RTreePolygonIndex): i += 1 return index + + def admin_level(self, i): + props, p = self.polygons[i] + return props['admin_level'] + + def get_candidate_polygons(self, lat, lon): + candidates = OrderedDict.fromkeys(self.index.intersection((lon, lat, lon, lat))).keys() + return sorted(candidates, key=self.admin_level, reverse=True)