diff --git a/scripts/geodata/addresses/components.py b/scripts/geodata/addresses/components.py index b2766297..817e95f1 100644 --- a/scripts/geodata/addresses/components.py +++ b/scripts/geodata/addresses/components.py @@ -141,7 +141,7 @@ class AddressComponents(object): AddressFormatter.UNIT: Unit, } - def __init__(self, osm_admin_rtree, neighborhoods_rtree, quattroshapes_rtree, geonames): + def __init__(self, osm_admin_rtree, neighborhoods_rtree, places_index, quattroshapes_rtree, geonames): self.config = yaml.load(open(PARSER_DEFAULT_CONFIG)) self.setup_component_dependencies() @@ -150,6 +150,7 @@ class AddressComponents(object): self.osm_admin_rtree = osm_admin_rtree self.neighborhoods_rtree = neighborhoods_rtree + self.places_index = places_index self.quattroshapes_rtree = quattroshapes_rtree self.geonames = geonames @@ -754,9 +755,18 @@ class AddressComponents(object): val = self.name_hyphens(val) address_components[component] = val + def add_city_and_equivalent_points(self, grouped_components, containing_components, country, latitude, longitude): + city_replacements = place_config.city_replacements(country) + for props, lat, lon, dist in self.place_index.nearest_points(latitude, longitude): + component = self.categorize_osm_component(country, props, containing_components) + + if (component == AddressFormatter.CITY or component in city_replacements) and component not in grouped_components: + grouped_components[component].append(props) + def add_admin_boundaries(self, address_components, osm_components, country, language, + latitude, longitude, non_local_language=None, language_suffix='', random_key=True, @@ -810,6 +820,9 @@ class AddressComponents(object): existing_city_name = address_components.get(AddressFormatter.CITY) + if not existing_city_name and AddressFormatter.CITY not in grouped_osm_components: + self.add_city_and_equivalent_points(grouped_components, osm_components, country, latitude, longitude) + for component, components_values in grouped_osm_components.iteritems(): seen = set() @@ -1457,6 +1470,7 @@ class AddressComponents(object): self.replace_country_name(address_components, country, non_local_language or language) self.add_admin_boundaries(address_components, osm_components, country, language, + latitude, longitude, non_local_language=non_local_language, language_suffix=language_suffix) @@ -1564,6 +1578,7 @@ class AddressComponents(object): self.normalize_place_names(address_components, all_osm_components, country=country, languages=all_languages) self.add_admin_boundaries(address_components, osm_components, country, language, + latitude, longitude, language_suffix=language_suffix, non_local_language=non_local_language, random_key=False, diff --git a/scripts/geodata/places/config.py b/scripts/geodata/places/config.py index 9d617e31..739646c5 100644 --- a/scripts/geodata/places/config.py +++ b/scripts/geodata/places/config.py @@ -143,6 +143,9 @@ class PlaceConfig(object): address_components.pop(c) component_bitset ^= ComponentDependencies.component_bit_values[c] + def city_replacements(self, country): + return set(self.get_property(('city_replacements', ), country=country)) + def dropout_components(self, components, boundaries=(), country=None, population=None, unambiguous_city=False): containing_ids = set() @@ -169,7 +172,7 @@ class PlaceConfig(object): city_replacements = set() if AddressFormatter.CITY not in components: - city_replacements = set(self.get_property(('city_replacements', ), country=country)) + city_replacements = self.city_replacements(country) for component in admin_components: include = self.include_component(component, containing_ids, country=country, population=population, unambiguous_city=unambiguous_city)