Introduction

  • 마지막 튜토리얼이다.
  • 이번 튜토리얼에서는 proximity analysis의 몇가지 기술에 대해서 배워보겠다.
  • 특히, points 간에 거리를 측정하는 법과 특정 범주 내에 있는 포인트를 다 선택하는 법을 배워보도록 하겠다.
  • 이번 튜토리얼을 위해서는 필라델피아에서 독성 화학물 방출에 대한 데이터를 활용할 예정이다.
releases = gpd.read_file("../input/geospatial-learn-course-data/toxic_release_pennsylvania/toxic_release_pennsylvania/toxic_release_pennsylvania.shp") 
  • 그리고 필라델피아 공기질 관리 본부에서 제공한 데이터 셋을 또한 활용할 예정이다.
stations = gpd.read_file("../input/geospatial-learn-course-data/PhillyHealth_Air_Monitoring_Stations/PhillyHealth_Air_Monitoring_Stations/PhillyHealth_Air_Monitoring_Stations.shp")

Measuring distance

  • 두 점 사이의 거리를 구하기 위해서는 반드시 두 종류의 데이터가 같은 CRS를 가지고 있어야 한다.
  • 하나의 방출이 각 station과 얼마나 거리가 있는지 확인하기 위한 방법은 Geopandas를 이용하면 꽤나 간단하다.
recent_release = release.iloc[360]
distances = stations.geometry.distance(recent_release.geometry)
  • 이 거리의 평균을 구하는 방법은 간단하다.
dist_mean = distances.mean()
  • 혹은 가장 가까운 station을 찾는 방법은 다음과 같다.
stations.iloc[distances.idxmin()][[["ADDRESS", "LATITUDE", "LONGITUDE"]]

Creating a buffer

  • 만약 하나의 점에서 부터 특정 거리 만큼 떨어진 점들을 다 모으고 싶다면, 간단하게 버퍼를 하나 생성하면 된다.
  • 하나의 점에서 부터 2mile 떨어진 애들의 버퍼를 만들면 다음과 같다.
two_mile_buffer = stations.geometry.buffer(2*5280)
  • map에 그릴때는 folium.GeoJson()을 이용하면 쉽게 맵에 그려넣을 수 있다.
# Create map with release incidents and monitoring stations
m = folium.Map(location=[39.9526,-75.1652], zoom_start=11)
HeatMap(data=releases[['LATITUDE', 'LONGITUDE']], radius=15).add_to(m)
for idx, row in stations.iterrows():
    Marker([row['LATITUDE'], row['LONGITUDE']]).add_to(m)
    
# Plot each polygon on the map
GeoJson(two_mile_buffer.to_crs(epsg=4326)).add_to(m)

# Show the map
embed_map(m, 'm1.html')
  • 결과는 다음과 같다.

사진

  • 이때 각 station 2마일 안에 방출이 있었던 적이 있는지 보는 방법은 독물의 위치를 모든 station에 대해서 각각 검사를 해주는 것이다.
  • 하지만 그보다 효율적이 방법은 모든 station의 범위를 합치고 그 안에 있는 release를 찾는 것이다.
  • 이렇게 합치는 방법을 unary_union이라고 한다.
my_union = two_mile_buffer.geometry.unary_union
  • 이때 특정 release가 안에 속하는지 확인하려면 contains() 함수를 사용하면 된다.
my_union.contains(releases.iloc[360].geometry)
  • 이상으로 모든 튜토리얼을 마치도록 하겠다!!!