[osm] during place formatting, add point-based cities for any places/polygons that are smaller than cities e.g. suburb or city_district, use admin_center as the point for reverse geocoding if available (instead of representative_point() which can be expensive or centroid which can be inaccurate)

This commit is contained in:
Al
2016-12-12 05:29:33 -05:00
parent 33dd9223dc
commit bf3e9749ca

View File

@@ -8,6 +8,7 @@ import sys
import yaml import yaml
from collections import defaultdict, OrderedDict, Counter from collections import defaultdict, OrderedDict, Counter
from shapely.geometry import Point
from six import itertools from six import itertools
this_dir = os.path.realpath(os.path.dirname(__file__)) this_dir = os.path.realpath(os.path.dirname(__file__))
@@ -624,6 +625,9 @@ class OSMAddressFormatter(object):
cldr_country_prob = float(nested_get(self.config, ('places', 'cldr_country_probability'), default=0.0)) cldr_country_prob = float(nested_get(self.config, ('places', 'cldr_country_probability'), default=0.0))
component_order = AddressFormatter.component_order[component_name]
sub_city = component_order < AddressFormatter.component_order[AddressFormatter.CITY]
for name_tag in ('name', 'alt_name', 'loc_name', 'short_name', 'int_name', 'name:simple', 'official_name'): for name_tag in ('name', 'alt_name', 'loc_name', 'short_name', 'int_name', 'name:simple', 'official_name'):
if more_than_one_official_language: if more_than_one_official_language:
name = tags.get(name_tag) name = tags.get(name_tag)
@@ -649,7 +653,8 @@ class OSMAddressFormatter(object):
latitude, longitude, latitude, longitude,
random_key=num_references > 1, random_key=num_references > 1,
language_suffix=language_suffix, language_suffix=language_suffix,
drop_duplicate_city_names=False) drop_duplicate_city_names=False,
add_city_points=sub_city)
place_tags.append((address_components, None, True)) place_tags.append((address_components, None, True))
for alt_name in alt_names: for alt_name in alt_names:
@@ -693,7 +698,8 @@ class OSMAddressFormatter(object):
latitude, longitude, latitude, longitude,
random_key=is_default, random_key=is_default,
language_suffix=language_suffix, language_suffix=language_suffix,
drop_duplicate_city_names=False) drop_duplicate_city_names=False,
add_city_points=sub_city)
place_tags.append((address_components, language, is_default)) place_tags.append((address_components, language, is_default))
for alt_name in alt_names: for alt_name in alt_names:
@@ -731,7 +737,8 @@ class OSMAddressFormatter(object):
random_key=False, random_key=False,
non_local_language=language, non_local_language=language,
language_suffix=language_suffix, language_suffix=language_suffix,
drop_duplicate_city_names=False) drop_duplicate_city_names=False,
add_city_points=sub_city)
place_tags.append((address_components, language, False)) place_tags.append((address_components, language, False))
for alt_name in alt_names: for alt_name in alt_names:
@@ -1165,10 +1172,15 @@ class OSMAddressFormatter(object):
print('did {} formatted places'.format(i)) print('did {} formatted places'.format(i))
for tags, poly in iter(self.components.osm_admin_rtree): for tags, poly in iter(self.components.osm_admin_rtree):
try: if 'admin_center' in tags and 'lat' in tags['admin_center'] and 'lon' in tags['admin_center']:
point = poly.context.representative_point() admin_center = tags['admin_center']
except ValueError: point = Point(admin_center['lon'], admin_center['lat'])
point = poly.context.centroid else:
try:
point = poly.context.representative_point()
except ValueError:
point = poly.context.centroid
lat = point.y lat = point.y
lon = point.x lon = point.x
tags['lat'] = lat tags['lat'] = lat