Skip to content

Instantly share code, notes, and snippets.

@rebel1324
Last active May 28, 2021 14:00
Show Gist options
  • Select an option

  • Save rebel1324/520423f42c4bd748d11bf42e46d5ac6d to your computer and use it in GitHub Desktop.

Select an option

Save rebel1324/520423f42c4bd748d11bf42e46d5ac6d to your computer and use it in GitHub Desktop.
서울시 데이터와 함께하는 오늘 뭐먹을까

서울시 공공데이터와 함께하는 후배랑 밥먹기

개요

식당 찾기가 너무 힘들다

그래서 서울시 데이터베이스를 조회해서 만날 거리 내 식당을 필터링해서 안먹는거를 걸러내봤다

서울시에서 많은 공공 데이터를 공유한다고 들어서 마침 시간도 남고 할거도 없어서 해봤다.

특징

서울시 데이터는 기본적으로 lat/long형식의 좌표계를 안쓴다

이게 뭔소리인가 싶었는데 기본적으로 좌표는 다들 알아서 쓴다고 한다

그래서 이걸 구글맵이나 다른곳에 써먹을라면 알아서 컨버팅 해야한다는 뜻

그리고 EUC-KR을 기본 인코딩으로 주기 떄문에 VSCode로 열어서 인코딩을 바꿔주거나 iconv를 이용해서 바꿔주도록 하자.

현명하다면 OpenAPI를 이용한 데이터 FETCH도 좋을듯 싶다.

자료

지도 좌표 프로젝션

서울시 데이터는 평소에 보는 좌표계랑 조금 달랐다.

GPS 위경도도 아니었고

군대에서본 그리드 좌표계도 아니었다.

이게 뭔가 하고 검색을 해보니 좌표 변환이 필요하다고 한다. 무슨 변환인가 했더니 유럽에 무슨 표준이 있다고 한다. 이름은 EPSG라고 한다.

컨버팅을 어떻게 해야하나 봤는데

http://www.gisdeveloper.co.kr/?p=8942

https://www.osgeo.kr/17

검색을 하다가 좋은 곳을 발견했다

파이썬의 라이브러리가 이 EPSG 컨버팅 툴의 파라미터를 이용하는 것 같아서 고대로 박았더니 잘 되었다

왠지는 모르지만 좌표가 뒤집혔다

일단 지금은 예약해야해서 슬프지만 나쁜 코드를 썼다

서울시 데이터를 사용하는 경우에는 대부분 상세 정보에 좌표 EPSG코드가 적혀있다. 해당 코드를 보고 잘 컨버팅 하면 되는듯.

서울시 데이터

서울시 데이터는 구별로 데이터가 나뉘는 듯 하다

그래서 일단 약속장소에 있는 데이터만 받아냈다

수많은 데이터가 있었지만 일단 귀찮은대로 먼저 정규식을 이용해서 싫어하는 단어가 들어가있는 줄을 모두 없애고 시작했다.

.+(키워드|키워드|이렇게 더).+

사실 안먹는거부터 없애고 시작하면 검색속도가 빠르니 똑똑한 방법이고 자시고 일단 호불호는 없애고 시작했다.

추가 데이터 조회

구글 지도가 은근히 찾기가 좋다.

싫어하는 음식 키워드를 없애고 거리제한을 두면 약 200개로 데이터가 줄어드는데

여기서 구글에있는 데이터를 참고해서 별점이 너무 낮거나 리뷰 사진이 없는 곳 또는 리뷰 사진이 충격적인 곳은 걸렀다.

그러니 40개 정도 남았다

이제 남은건 후배를 굴리는것 뿐

좌표 맵 시각화

https://www.openstreetmap.org/

무료 지도가 있다고 한다.

여기서 내가 보는 영역의 lat/long 바운더리를 구할 수 있다.

이말은 즉선 바운더리 기준으로 좌표를 매핑하면 0-1까지의 값으로 좌표 위치를 맵에 표시하면 뭔가 나온다는 뜻이다.

근데 이미 구글 지도로 알아보면서 다 걸러서 이건 딱히 필요가 없었지만

데이터를 다른사람에게 보여줄때나 나중에 지도 맵핑이 필요하면 쓸만 할것같다.

import pandas as pd
from pyproj import Transformer
df = pd.read_csv('filtered.tsv', engine='python', sep="\t")
df = df.filter(items=['x','y','name'])
dfl=pd.DataFrame([
(y,x) # bruh
for x, y in Transformer.from_proj( { 'proj':'tmerc' , 'lat_0':38 , 'lon_0':127 , 'k':1 , 'x_0':200000 , 'y_0':500000 , 'ellps':'bessel' , 'units':'m' , 'no_defs': True, 'towgs84':[-115.80,474.99,674.11,1.16,-2.31,-1.63,6.43], }, "EPSG:4326", always_xy=True,).itransform([ (x,y) for x, y, _ in df.itertuples(index=False) ])
])
df["lat"] = dfl[0]
df['long'] = dfl[1]
df = df[
df["long"].between(127.09600,127.10733) & df['lat'].between(37.50913, 37.51449)
]
df.to_csv("file.csv", encoding="utf-8")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment