[addresses] adding point-based city/equivalent reverse geocoding for places that don't have as many defined polygons in OSM

This commit is contained in:
Al
2016-12-05 18:30:27 -05:00
parent 8509fe3ac0
commit 628fecea59
2 changed files with 20 additions and 2 deletions

View File

@@ -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,

View File

@@ -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)