From 9b9f032d306d12b34c2b899aeef0f60a408ad4b2 Mon Sep 17 00:00:00 2001 From: antoniocarlon Date: Wed, 15 Jan 2020 14:48:31 +0100 Subject: [PATCH] Fixed geocoding with components --- .../geocodio/bulk_geocoder.py | 2 +- .../cartodb_services/geocodio/geocoder.py | 3 +- .../test/test_geocodiogeocoder.py | 110 ++++++++++++++---- 3 files changed, 88 insertions(+), 27 deletions(-) diff --git a/server/lib/python/cartodb_services/cartodb_services/geocodio/bulk_geocoder.py b/server/lib/python/cartodb_services/cartodb_services/geocodio/bulk_geocoder.py index 1107bcb..35e6fc1 100644 --- a/server/lib/python/cartodb_services/cartodb_services/geocodio/bulk_geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/geocodio/bulk_geocoder.py @@ -67,7 +67,7 @@ class GeocodioBulkGeocoder(GeocodioGeocoder, StreetPointBulkGeocoder): return results def _country_code(self, country): - country_iso3166 = None + country_iso3166 = country country_iso3 = country_to_iso3(country) if country_iso3: country_iso3166 = countries.get(country_iso3).alpha2.lower() diff --git a/server/lib/python/cartodb_services/cartodb_services/geocodio/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/geocodio/geocoder.py index da88a20..175ae98 100644 --- a/server/lib/python/cartodb_services/cartodb_services/geocodio/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/geocodio/geocoder.py @@ -59,7 +59,8 @@ class GeocodioGeocoder(Traceable): try: free_text_components = [searchtext, city, state_province, country] - response = self._geocoder.geocode(';'.join([c for c in free_text_components if c is not None and c.strip()])) + req = '; '.join([c for c in free_text_components if c is not None and c.strip()]) + response = self._geocoder.geocode(req) return self._parse_geocoder_response(response) except GeocodioDataError as gde: diff --git a/server/lib/python/cartodb_services/test/test_geocodiogeocoder.py b/server/lib/python/cartodb_services/test/test_geocodiogeocoder.py index 2c57d16..c6d79e9 100644 --- a/server/lib/python/cartodb_services/test/test_geocodiogeocoder.py +++ b/server/lib/python/cartodb_services/test/test_geocodiogeocoder.py @@ -7,21 +7,31 @@ from credentials import geocodio_api_key INVALID_TOKEN = 'invalid_token' -VALID_ADDRESS_1 = 'Lexington Ave, New York, US' +VALID_ADDRESS_1 = 'Lexington Ave; New York; US' VALID_ADDRESS_2 = 'E 14th St; New York; US' +VALID_ADDRESS_3 = '652 Lombard Street; San Francisco; California; United States' -WELL_KNOWN_LONGITUDE_1 = -74.365 -WELL_KNOWN_LATITUDE_1 = 42.240 +VALID_SEARCH_TEXT_1='Lexington Ave' +VALID_CITY_1='New York' +VALID_STATE_PROVINCE_1='New York' +VALID_COUNTRY_1='US' + +VALID_SEARCH_TEXT_2='E 14th St' +VALID_CITY_2='New York' +VALID_STATE_PROVINCE_2='New York' +VALID_COUNTRY_2='US' + +VALID_SEARCH_TEXT_3='652 Lombard Street' +VALID_CITY_3='San Francisco' +VALID_STATE_PROVINCE_3='California' +VALID_COUNTRY_3='United States' + +WELL_KNOWN_LONGITUDE_1 = -73.960 +WELL_KNOWN_LATITUDE_1 = 40.774 WELL_KNOWN_LONGITUDE_2 = -73.983 WELL_KNOWN_LATITUDE_2 = 40.731 - -VALID_SEARCH_TEXT='Lexington Ave' -VALID_CITY='New York' -VALID_STATE_PROVINCE='New York' -VALID_COUNTRY='USA' - -WELL_KNOWN_LONGITUDE_COMPONENTS = -76.710 -WELL_KNOWN_LATITUDE_COMPONENTS = 39.964 +WELL_KNOWN_LONGITUDE_3 = -122.412 +WELL_KNOWN_LATITUDE_3 = 37.803207 SEARCH_ID_1 = 1 SEARCH_ID_2 = 2 @@ -39,20 +49,46 @@ class GeocodioGeocoderTestCase(unittest.TestCase): with self.assertRaises(ServiceException): invalid_geocoder.geocode(VALID_ADDRESS_1) - def test_valid_request(self): + def test_valid_requests(self): place = self.geocoder.geocode(VALID_ADDRESS_1) self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_1) self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_1) - def test_valid_request_components(self): - place = self.geocoder.geocode(searchtext=VALID_SEARCH_TEXT, - city=VALID_CITY, - state_province=VALID_STATE_PROVINCE, - country=VALID_COUNTRY) + place = self.geocoder.geocode(VALID_ADDRESS_2) - self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_COMPONENTS) - self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_COMPONENTS) + self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_2) + self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_2) + + place = self.geocoder.geocode(VALID_ADDRESS_3) + + self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_3) + self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_3) + + def test_valid_request_components(self): + place = self.geocoder.geocode(searchtext=VALID_SEARCH_TEXT_1, + city=VALID_CITY_1, + state_province=VALID_STATE_PROVINCE_1, + country=VALID_COUNTRY_1) + + self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_1) + self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_1) + + place = self.geocoder.geocode(searchtext=VALID_SEARCH_TEXT_2, + city=VALID_CITY_2, + state_province=VALID_STATE_PROVINCE_2, + country=VALID_COUNTRY_2) + + self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_2) + self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_2) + + place = self.geocoder.geocode(searchtext=VALID_SEARCH_TEXT_3, + city=VALID_CITY_3, + state_province=VALID_STATE_PROVINCE_3, + country=VALID_COUNTRY_3) + + self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_3) + self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_3) def test_valid_request_namedplace(self): place = self.geocoder.geocode(searchtext='New York') @@ -98,12 +134,36 @@ class GeocodioGeocoderTestCase(unittest.TestCase): self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_1) self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_1) - def test_valid_request_components_bulk_one(self): - place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT, VALID_CITY, VALID_STATE_PROVINCE, VALID_COUNTRY)]) + place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_ADDRESS_2, None, None, None)]) self.assertEqual(place[0][0], SEARCH_ID_1) - self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_COMPONENTS) - self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_COMPONENTS) + self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_2) + self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_2) + + place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_ADDRESS_3, None, None, None)]) + + self.assertEqual(place[0][0], SEARCH_ID_1) + self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_3) + self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_3) + + def test_valid_request_components_bulk_one(self): + place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT_1, VALID_CITY_1, VALID_STATE_PROVINCE_1, VALID_COUNTRY_1)]) + + self.assertEqual(place[0][0], SEARCH_ID_1) + self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_1) + self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_1) + + place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT_2, VALID_CITY_2, VALID_STATE_PROVINCE_2, VALID_COUNTRY_2)]) + + self.assertEqual(place[0][0], SEARCH_ID_1) + self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_2) + self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_2) + + place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT_3, VALID_CITY_3, VALID_STATE_PROVINCE_3, VALID_COUNTRY_3)]) + + self.assertEqual(place[0][0], SEARCH_ID_1) + self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_3) + self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_3) def test_valid_request_namedplace_bulk_one(self): place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, 'New York', None, None, None)]) @@ -156,8 +216,8 @@ class GeocodioGeocoderTestCase(unittest.TestCase): self.assertEqual('%.3f' % places[1][1][1], '%.3f' % WELL_KNOWN_LATITUDE_2) def test_valid_request_components_bulk_many(self): - places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT, VALID_CITY, VALID_STATE_PROVINCE, VALID_COUNTRY), - (SEARCH_ID_2, VALID_SEARCH_TEXT, VALID_CITY, VALID_STATE_PROVINCE, VALID_COUNTRY)]) + places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT_1, VALID_CITY_1, VALID_STATE_PROVINCE_1, VALID_COUNTRY_1), + (SEARCH_ID_2, VALID_SEARCH_TEXT_2, VALID_CITY_2, VALID_STATE_PROVINCE_2, VALID_COUNTRY_2)]) self.assertEqual(places[0][0], SEARCH_ID_1) self.assertEqual(places[1][0], SEARCH_ID_2)