Как узнать широту и долготу колледжа по названию и городу, области и стране? - PullRequest
0 голосов
/ 24 октября 2019

Пожалуйста, посетите мой проект на GitHub для просмотра CSV и ноутбуков.

Я использовал этот ноутбук и этот csv .

Я пытаюсь кластеризовать колледжи на основе их окружения (для чего я буду использовать API квадрата четырехугольников). Для этого мне нужно передать широту и долготу колледжа (для изучения мест). Но проблема в том, что когда я пытаюсь определить широту и долготу колледжа, используя его название + область + город + страна, это дает мне широту другой страны (иногда в середине десерта). Пожалуйста, посмотрите код и исправьте его, а также фрейм данных для понимания поля 'area'.

Я пробовал два типа аргументов местоположения для получения длинного лат для колледжа: ТИП 1:

try: название колледжа + область + город + страна, за исключением AttributeError (если location возвращает ноль latдлинный): район + город + страна

ТИП 2:

название колледжа + город

ТИП 1:

# METHOD 1
def do_geocode(address):
    try:
        return geolocator.geocode(address)
    except GeocoderTimedOut:
        time.sleep(3)
        return do_geocode(address)

def get_latlong():
    latitude = []
    longitude = []
    collegeName = df['college_name'].to_list()
    loc = df['location'].to_list()

    for i in range(len(collegeName)): 
        address = collegeName[i] +', '+loc[i]
        geolocator = Nominatim(user_agent="foursquare_agent")
        geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)
        new['location'] = df['name'].apply(geocode)
        location = do_geocode(address)
        try:# try with college name in address
            latitude.append(location.latitude)
            longitude.append(location.longitude)
        except AttributeError: # if location not found lat long are null 
            try: # try again without the college name in address
                address = loc[i]
                location = do_geocode(address)

                latitude.append(location.latitude)
                longitude.append(location.longitude)
            except: # if an address is not found at all simply write None to list
                latitude.append(None)
                longitude.append(None)
        clear_output() # if we dont too much space taken by output
        print('Obtained ' +str(i)+ ' latitude and logitudes.')  # Tests your patience

ТИП 2:

# METHOD 2
from geopy.geocoders import Nominatim # convert an address into latitude and longitude values
from geopy.exc import GeocoderTimedOut 
from geopy.extra.rate_limiter import RateLimiter
from tqdm import tqdm

tqdm.pandas()
def get_latlong():
    geolocator = Nominatim(user_agent="foursquare_agent")
    geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)
    df['address'] = df['clg_city'].progress_apply(geocode)

Фрейм данных: df ['location'] 1. Сан-Франциско, США

Вашингтон, округ Колумбия, Вашингтон, округ Колумбия, США

Нью-Йорк, Буффало, США

Англия, Лондон, СШАКоролевство

Уэльс, Понтипридд, Великобритания

df ['clg_city']

  1. Школамедицинских сестер и медицинских профессий Сан-Франциско

  2. Школа бизнеса им. Когода, Американский университет, Вашингтон, округ Колумбия

  3. Университет в Буффало, Государственный университет Нью-ЙоркаШкола инженерных и прикладных наук Буффало

  4. Школа менеджмента Лондон Лондон

  5. Университет Южного Уэльса Понтипридд

1-й метод дает много длинных, но неправильных. Второй метод дает только несколько длинных лат.

Как вы предлагаете мне решить эту проблему, я хочу получить длинный лат для колледжа (по названию и любому столбцу, который у меня есть, с точностью250 м или более) любыми необходимыми средствами (кроме, конечно, вручную).

...