[kaggle] Manipulating Geospatial Data

이상해씨·2024년 1월 30일
0

GEO

목록 보기
11/12

Manipulating Geospatial Data

  • geocoding과 table joins를 조작하기

Geocoding

  • Geocoding : 장소 이름을 맵 상의 위치 주소로 변경하는 과정을 의미
  • Google Maps, Bing Maps, or Baidu Maps를 통해 랜드마크에 대한 상세 정보를 알고자 할 경우, geocoder를 사용해야 한다.
  1. Nominatim을 사용하여 geocoder를 인스턴스화(indtantiation)하기
  2. geocode를 사용하여 이름이나 주소만 파이썬 문자열로 적용
  3. geocoding이 성공하면, geopy.location.Location 개체를 반환한다.
### 1. Geocoder 인스턴스화하기 ###
geolocator = Nominatim(user_agent="kaggle_learn")

### 2. 주소 또는 위치 이름을 적용하여 geocoding을 수행하기 ###
location = geolocator.geocode("Pyramid of Khufu")


### 3. 성공시, geopy.location.Location 개체를 반환한다 ###
print(location.point)
print(location.address)

# kaggle에서는 Khufu의 피라미드를 예시 데이터로 사용
29 58m 44.976s N, 31 8m 3.17625s E
هرم خوفو, شارع ابو الهول السياحي, نزلة البطران, الجيزة, 12125, مصر

1. Nominatim을 사용하여 geocoder를 인스턴스화(indtantiation)하기

from geopy.geocoders import Nominatim

### 1. Geocoder 인스턴스화하기 ###
geolocator = Nominatim(user_agent="kaggle_learn")

📌 Nominatim
Nominatim : 위치 생성에 사용되는 지오코딩 소프트웨어를 의미

2. geocode를 사용하여 이름이나 주소만 파이썬 문자열로 적용

### 2. 주소 또는 위치 이름을 적용하여 geocoding을 수행하기 ###

location = geolocator.geocode("Pyramid of Khufu")

3. geocoding이 성공하면, geopy.location.Location 개체를 반환

### 3. 성공시, geopy.location.Location 개체를 반환한다 ###
print(location.point)
print(location.address)

# kaggle에서는 Khufu의 피라미드를 예시 데이터로 사용
29 58m 44.976s N, 31 8m 3.17625s E
هرم خوفو, شارع ابو الهول السياحي, نزلة البطران, الجيزة, 12125
  • geopy.location.Location 개체는 Point와 address 속성으로 나뉜다.

    • Point 속성은 위경도 위치 데이터를 포함
    • address 속성은 전체 주소 데이터를 포함한다
  • point 속성은 geopy.point.Point의 속성으로, 위경도 속성으로 부터 위경도 데이터를 얻을 수 있다.
point = location.point
print("Latitude:", point.latitude)
print("Longitude:", point.longitude)

Latitude: 29.97916
Longitude: 31.134215625236113

복수개의 geocode 추출하기

  • 복수개의 geocode가 필요한 경우, lambda 함수를 사용하여 모든 열에 함수를 적용한다. (이 때, try/except문을 사용하면 geocoding 성공여부를 쉽게 확인할 수 있다.)
universities = pd.read_csv("../input/geospatial-learn-course-data/top_universities.csv")
universities.head()

def my_geocoder(row):
    try:
        point = geolocator.geocode(row).point
        return pd.Series({'Latitude': point.latitude, 'Longitude': point.longitude})
    except:
        return None

universities[['Latitude', 'Longitude']] = universities.apply(lambda x: my_geocoder(x['Name']), axis=1)

print("{}% of addresses were geocoded!".format(
    (1 - sum(np.isnan(universities["Latitude"])) / len(universities)) * 100))

# Drop universities that were not successfully geocoded
universities = universities.loc[~np.isnan(universities["Latitude"])]
universities = gpd.GeoDataFrame(
    universities, geometry=gpd.points_from_xy(universities.Longitude, universities.Latitude))
universities.crs = {'init': 'epsg:4326'}
universities.head()

91.0% of addresses were geocoded!

geocode 위치 시각화하기

  • geocode가 반환된 위치를 시각화한다
# Create a map
m = folium.Map(location=[54, 15], tiles='openstreetmap', zoom_start=2)

# Add points to the map
for idx, row in universities.iterrows():
    Marker([row['Latitude'], row['Longitude']], popup=row['Name']).add_to(m)

# Display the map
m

Table joins

📌 테이블 조인(table joins)
: DBMS에서 두개 이상의 테이블을 결합하여 데이터를 조회하는 방법

  • 데이터가 여러 테이블에 분산되어 있을 경우, 통합하여 의미있는 정보를 추출한다.
  • SQL에서는 inner join, outer join, Right outer join, Full outer join, cross join, natural join 등을 사용한다.
  • 일반적으로 , pandas의 pd.DataFrame.join()로 Dataframe들의 정보를 결합

속성조인(Attributes join)

📌 속성조인(Attributes join)
: 인덱스에서 값이 일치하도록 데이터를 결합하는 것

  • gpd.GeoDataFrame.merge()를 사용하여 속성 조인을 사용. 공간적 조인(Spatial join)과 같은 지리공간 데이터에 특화된 기능을 제공.
  • 공간적 조인은 두 GeoDataFrame의 지리적 위치(예: 겹치는 지역, 인접한 지역 등)에 기반하여 데이터를 결합하는 과정을 의미

pd.DataFrame.join()은 일반적인 판다스 데이터 프레임의 조인에 사용, gpd.GeoDataFrame.merge()는 지리공간 데이터를 다루는 GeoDataFrame에 더 적합한 조인 방식

europe_boundaries.head()

  • 위 유럽 경계 데이터와 국가별 인구, GDP 데이터를 결합
europe_stats.head()

  • 두 데이터를 on으로 속성 조인(Attributes join) 실행
# Use an attribute join to merge data about countries in Europe
europe = europe_boundaries.merge(europe_stats, on="name")
europe.head()

spatial join

📌 공간조인
: geometry 칼럼을 가진 객체들강의 공간적 관계(spatial relationship)을 기반으로 GeoDataFrame을 결합

  • gpd.sjoin()을 사용하여 국가 데이터와 대학 데이터를 공간 조인한다.
# Use spatial join to match universities to countries in Europe
european_universities = gpd.sjoin(universities, europe)

# Investigate the result
print("We located {} universities.".format(len(universities)))
print("Only {} of the universities were located in Europe (in {} different countries).".format(
    len(european_universities), len(european_universities.name.unique())))

european_universities.head()

We located 91 universities.
Only 87 of the universities were located in Europe (in 14 different countries)

  • 공간 결합은 GeoDataFrame의 geometry 칼럼을 모두 확인한다.
    • Point 객체가 Polygon 객체와 교차하는 경우, 두 행이 결합되어 새로운 DataFrame의 단일 행(column)으로 추가된다.
    • 서로 교차하지 않는 경우, 일치하는 대학이 없는 국가들 또는 일치하는 국가가 없는 대학을 결과에서 뺀다.
  • pgd.sjoin()은 how와 op인수(op statment)를 통해 다양한 유형의 조인을 사용자 지정할 수 있다.
    • how= 'left', how ='right'

참고

Nominatim

kaggle

profile
공부에는 끝이 없다

0개의 댓글