From 28d1c471a79d6e67cbe47624adcc6984f2f5920b Mon Sep 17 00:00:00 2001 From: Al Date: Tue, 13 Oct 2015 10:55:17 -0400 Subject: [PATCH] [polygons] Property transforms/validation in Quattroshapes reverse geocoder --- scripts/geodata/polygons/reverse_geocode.py | 130 +++++++++++--------- 1 file changed, 69 insertions(+), 61 deletions(-) diff --git a/scripts/geodata/polygons/reverse_geocode.py b/scripts/geodata/polygons/reverse_geocode.py index 8837c3e1..2393c4cb 100644 --- a/scripts/geodata/polygons/reverse_geocode.py +++ b/scripts/geodata/polygons/reverse_geocode.py @@ -30,62 +30,63 @@ class ReverseGeocoder(RTreePolygonIndex): sort_levels = {k: i for i, k in enumerate(sorted_levels)} - include_properties_by_file = { - COUNTRIES_FILENAME: set([ - 'qs_a0', - 'qs_iso_cc', - 'qs_level', - 'qs_gn_id', - 'qs_woe_id', - ]), - ADMIN1_FILENAME: set([ - 'qs_a1', - 'qs_a1_lc', - 'qs_level', - 'qs_gn_id', - 'qs_woe_id', - ]), - ADMIN1_REGION_FILENAME: set([ - 'qs_a1r', - 'qs_a1r_lc', - 'qs_level', - 'qs_gn_id', - 'qs_woe_id', - ]), - ADMIN2_FILENAME: set([ - 'qs_a2', - 'qs_a2_lc', - 'qs_level', - 'qs_gn_id', - 'qs_woe_id' - ]), - ADMIN2_REGION_FILENAME: set([ - 'qs_a2r', - 'qs_a2r_lc', - 'qs_level', - 'qs_gn_id', - 'qs_woe_id', - ]), - LOCAL_ADMIN_FILENAME: set([ - 'qs_la', - 'qs_la_lc', - 'qs_level', - 'qs_gn_id', - 'qs_woe_id', - ]), - LOCALITIES_FILENAME: set([ - 'qs_loc', - 'qs_loc_alt', - 'qs_level', - 'qs_gn_id', - 'qs_woe_id', - ]), - NEIGHBORHOODS_FILENAME: set([ - 'name', - 'name_en', - 'woe_id', - 'gn_id' - ]) + polygon_properties = { + COUNTRIES_FILENAME: { + 'qs_a0': safe_decode, + 'qs_iso_cc': safe_decode, + 'qs_level': safe_decode, + 'qs_gn_id': int, + 'qs_woe_id': int, + }, + ADMIN1_FILENAME: { + 'qs_a1': safe_decode, + 'qs_a1_lc': safe_decode, + 'qs_level': safe_decode, + 'qs_gn_id': int, + 'qs_woe_id': int, + }, + ADMIN1_REGION_FILENAME: { + 'qs_a1r': safe_decode, + 'qs_a1r_lc': safe_decode, + 'qs_level': safe_decode, + 'qs_gn_id': int, + 'qs_woe_id': int, + }, + ADMIN2_FILENAME: { + 'qs_a2': safe_decode, + 'qs_a2_lc': safe_decode, + 'qs_level': safe_decode, + 'qs_gn_id': int, + 'qs_woe_id': int, + }, + ADMIN2_REGION_FILENAME: { + 'qs_a2r': safe_decode, + 'qs_a2r_lc': safe_decode, + 'qs_level': safe_decode, + 'qs_gn_id': int, + 'qs_woe_id': int, + }, + LOCAL_ADMIN_FILENAME: { + 'qs_la': safe_decode, + 'qs_la_lc': safe_decode, + 'qs_level': safe_decode, + 'qs_gn_id': int, + 'qs_woe_id': int, + }, + LOCALITIES_FILENAME: { + 'qs_loc': safe_decode, + 'qs_loc_alt': safe_decode, + 'qs_level': safe_decode, + 'qs_gn_id': int, + 'qs_woe_id': int, + }, + NEIGHBORHOODS_FILENAME: { + 'name': safe_decode, + 'name_en': safe_decode, + 'qs_level': safe_decode, + 'woe_id': int, + 'gn_id': int, + } } @classmethod @@ -103,10 +104,7 @@ class ReverseGeocoder(RTreePolygonIndex): for input_file in input_files: f = fiona.open(input_file) - if include_only_properties is not None: - include_props = include_only_properties.get(input_file, cls.include_only_properties) - else: - include_props = cls.include_only_properties + include_props = polygon_properties.get(input_file) filename = os.path.split(input_file)[-1] @@ -114,8 +112,18 @@ class ReverseGeocoder(RTreePolygonIndex): if not rec or not rec.get('geometry') or 'type' not in rec['geometry']: continue + properties = rec['properties'] + if filename == cls.NEIGHBORHOODS_FILENAME: - rec['properties']['qs_level'] = 'neighborhood' + properties['qs_level'] = 'neighborhood' + + if include_props: + for k, func in include_props.iteritems(): + v = properties.get(k, None) + if v is not None: + properties[k] = func(v) + + include_props = set(include_props.keys()) poly_type = rec['geometry']['type'] if poly_type == 'Polygon':