Python에서 Geopy 및 Folium을 사용하는 다중 지오 코딩 된지도 마커

이전 게시물에서 저는 Python에서 Nominatim을 사용하여 (Geopy 모듈 사용) 위치 이름을 경도 및 위도 좌표로 지오 코딩하는 방법을 이미 시연했습니다. 이 게시물에서는 Geopy를 사용하여 위치 목록을 지오 코딩하는 방법을 보여주고 싶습니다. 이를 위해 Pandas 모듈을 사용하여 국가, 도시 및 거리 열의 항목에 지정된 위치 이름이 포함 된 간단하고 간단한 csv 파일을 읽는 것으로 시작합니다.

# 판다 가져 오기
import pandas
# 위치 데이터를 포함하는 csv 파일에서 읽음
data = pandas.read_csv("locations.csv")
# csv 파일의 테이블 표시
data
countrycitystreetmetric
0GermanyBerlinAlexanderplatz 110
1GermanyBerlinDircksenstrasse 25
2GermanyBerlinRathausstrasse 116

테이블 형식 데이터의 데이터 유형을 확인해 보겠습니다.

type(data)
pandas.core.frame.DataFrame

이제 데이터를 읽었으므로 위치를 지오 코딩하고 지오 코딩 된 좌표를 새 열에 할당합니다. 데이터가 pandas DataFrame이므로 apply () 메서드를 사용하여 관련 Nominatim 지오 코딩 서비스를 데이터 프레임의 모든 주소에 적용 할 수 있습니다. 먼저 모든 열 항목을 주소로 수렴하여 표 형식의 DataFrame의 새 열에 추가해야합니다. 그런 다음 Nominatim Geopy 서비스를 참조하는 서비스 객체를 만들고 해당 서비스를 모든 위치에 적용하여 지오 코딩 된 결과를 추가 새 열에 반환 할 수 있습니다.

# 국가, 도시 및 거리를 단일 주소 문자열로 병합
data["addresses"] = data["country"] + ", " + data["city"] + ", " + data["street "]
# geopy 모듈 가져 오기
import geopy
# 서비스 객체 생성
service = geopy.Nominatim(user_agent = "myGeocoder")
# Pandas DataFrame에 .apply () 메서드를 사용하여 모든 주소를 지오 코딩합니다.
from geopy.extra.rate_limiter import RateLimiter
data["coordinates"] = data["addresses"].apply(RateLimiter(service.geocode,min_delay_seconds=1))
# 표 형식 데이터 표시
data
countrycitystreetmetricaddressescoordinates
0GermanyBerlinAlexanderplatz 110Germany, Berlin, Alexanderplatz 1(Alexanderstraße, Spandauer Vorstadt, Mitte, B…
1GermanyBerlinDircksenstrasse 25Germany, Berlin, Dircksenstrasse 2(2, Dircksenstraße, Luisenstadt, Mitte, Berlin…
2GermanyBerlinRathausstrasse 116Germany, Berlin, Rathausstrasse 1(1-14, Rathausstraße, Spandauer Vorstadt, Mitt…

“좌표”열 항목의 데이터 유형을 확인하겠습니다.

type(data["coordinates"][0])
geopy.location.Location

지오 코딩 된 위치는 Geopy Location 유형입니다. Location 클래스의 객체는 다양한 속성을 가지고 있습니다. 그중 하나는 위도이고 다른 하나는 경도입니다.

data["coordinates"][0].longitude
13.4144809
data["coordinates"][0].latitude
52.5228654

이제 “평균”경도 및 위도 점수를 계산합니다. 내 Folium 위치 마커 맵 플롯의 중심점으로 사용하고 싶습니다.

# 경도와 위도 값을 추출하여 목록을 분리
longs = [coord.longitude for coord in data["coordinates"]]
lats = [coord.latitude for coord in data["coordinates"]]
# 평균 경도 및 위도 값 계산
import statistics
meanLong = statistics.mean(longs)
meanLat = statistics.mean(lats)
# 표시 결과
print("meanLong = " + str(meanLong) + "; meanLat = " + str(meanLat))
meanLong = 13.412910038576356; meanLat = 52.52100943333333
[longs,lats]
[[13.4144809, 13.4136431, 13.410606115729072],
 [52.5228654, 52.5208149, 52.519348]]

Folium 모듈을 사용하여 이제 위치에 대한 마커를 만들고지도 타일에 플로팅 할 수 있습니다.

# folium 가져 오기
import folium
# 베를린을 중심으로 한 기본지도 만들기
mapObj = folium.Map(location = [meanLat,meanLong], zoom_start = 15)
# 데이터 DataFrame의 모든 위치에 대해 하나씩 베를린에 대한 마커 개체를 만듭니다.
for i in range(0,data.shape[0]):
    # 위치 i에 대한 마커 생성
    markerObj = folium.Marker(location = [lats[i],longs[i]])
    #지도에 마커 추가
    markerObj.add_to(mapObj)
# 디스플레이지도
mapObj

You May Also Like

Leave a Reply

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.