본문 바로가기
Python Tips

GeoPandas 에서 GeoWithin Query하기

by suminhan 2020. 3. 17.

우리가 원하는 범위의 Polygon이 아래와 같은 형태라고 하자.

yunnam_large = {'type': 'Polygon',
 'coordinates': [[[126.92572992898702, 37.55835818322421],
   [126.92616538295539, 37.55864227038824],
   [126.92658623986753, 37.55938810776263],
   [126.92677406036564, 37.56118120785994],
   [126.9282886257802, 37.56334452890169],
   [126.92638553613328, 37.56494713073428],
   [126.9243245551222, 37.565900883346934],
   [126.9196036221869, 37.5667807387447],
   [126.91729357199945, 37.56765310878508],
   [126.91688686271446, 37.566950046607175],
   [126.911545990937, 37.56548655281125],
   [126.91632828606713, 37.56035436030137],
   [126.91882134961368, 37.55750895062923],
   [126.92156261652076, 37.555222270447274],
   [126.92572992898702, 37.55835818322421]]]}

그리고 현재 pandas의 df가 아래의 내용과 같다고 하자.

df = pd.DataFrame(insta_locs)

우선 geopandas 형태로 gdf를 만든다.

gdf = gpd.GeoDataFrame(
    df, geometry=gpd.points_from_xy(x=df.lng, y=df.lat)
)
gdf.crs = 'EPSG:4326'

그리고 다음과 같이 query 가능하다.

from shapely.geometry import Point, Polygon
gg = Polygon(yunnam_large['coordinates'][0])
gdf = gdf[gdf.geometry.within(gg)]

이후 Zip으로 저장하고싶으면 다음과같이 한다.

import os, zipfile

save_gdf = gdf.copy()
save_gdf.crs = 'EPSG:4326'

save_dir = 'dir_name'
save_name = 'file_name'

if not os.path.isdir(save_dir):
    os.mkdir(save_dir)
save_gdf.to_file(save_dir + '/' + save_name + '.shp', encoding='euc-kr')

fantasy_zip = zipfile.ZipFile(save_dir + '/' + save_name + '.zip', 'w')
for ext in ['cpg', 'dbf', 'shp', 'shx', 'prj']:
    fantasy_zip.write(save_dir + '/' + save_name + '.' + ext, save_name + '.' + ext, compress_type = zipfile.ZIP_DEFLATED)
fantasy_zip.close()

 

'Python Tips' 카테고리의 다른 글

CountVectorizer + pyLDAvis (N-gram LDA)  (0) 2020.06.10
Python MapBox 지도 visualize  (0) 2020.05.11
주로 쓰는 좌표계 정리  (0) 2020.04.08
Proj Transformer 좌표 변환  (0) 2020.04.08
dictionary 값으로 정렬하기  (0) 2020.03.17

댓글