공간이란 말 그대로 어떠한 물체나 물질이 존재할 수 있는 장소를 말한다.
공간데이터란 지구의 표면상에 위치하는 물체나 사건, 현상을 기록한 데이터라고 할 수 있다.
많은 공간데이터를 보지는 않았지만, 공간 데이터에는 실제 우리 지구의 물체, 사건, 현상이 위도와 경도를 포함하는 형태로서 지니고 있다.
지리좌표체계란 지구상의 어떤 물체의 절대적 위치를 나타내는 좌표체계
지리 좌표 체계를 나타내는 방법은 지구 타원체를 '동→서 방향의 위도선'과 '남→북 방향의 경도선'을 종횡으로 일정한 간격을 두고, '도, 분, 초'로 표시
지리 좌표계 종류
평면에 투영된 경위도 좌표계(파란색)와 별도로 일정 크기의 직각 격자들로 구성되는 좌표계(빨간색)를 지도상에서 만들어 사용하는 좌표계
투영법이 필요
3차원 지리좌표를 2차원으로 변환하기 위한 parameter
데이텀(Datum)
투영법(Projection)
중앙 경선(Centeral Meridian) / 중앙 위선(Latitude of Origin)
False Northing / False Easting
단위(Unit)
선 증대율(Scale Factor)
종류
공간정보는 각종 공공데이터포털을 통해 파일 다운로드나 Open API 형태로 활용 가능하다. Open API(Open Application Programming Interface, 오픈 API)란 누구나 사용할 수 있도록 공개된 API를 뜻하며, 여기서 API는 개발자가 응용프로그램을 개발하는데 쓰이는 인터페이스를 말한다.
Open API 형태의 공간정보는 Open API 호출 URL과 인증키를 입력하면, 원하는 데이터를 XML(eXtensible Markup Language) 또는 JSON(JavaScript Object Notation)과 같은 형태로 제공받아 활용할 수 있다.
###공공기관
import pandas as pd
import request # 통신 라이브러리
def function_name(parameter1):
request_get = requests.get(
url="",
params={
"serviceKey": parameter1
}
)
request_df = pd.DataFrame(request_get.json()["가져올 데이터"])
return request_df
serviceKey = ""
### api
### 기본적으로 서비스 id와 key를 발급받아 토큰을 가져온 후에 데이터를 가지고 온다
import requests
## sgis
def get_access_token(consumer_key, consumer_secret):
temp_res = requests.get(
url="https://sgisapi.kostat.go.kr/OpenAPI3/auth/authentication.json",
params={
"consumer_key": consumer_key,
"consumer_secret": consumer_secret
}
)
access_token = temp_res.json()["result"]["accessToken"]
return access_token
consumer_key = ""
consumer_secret = ""
### 토큰으로 json데이터 받기
def get_vaccination_center(serviceKey):
temp_res = requests.get(
url="",
params={
"serviceKey": serviceKey
}
)
temp_df = pd.DataFrame(temp_res.json()["data"])
return temp_df
### geopandas 시각화
import geopandas as gpd
countries = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
cities = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))
countries.head()
#cities.head()
###geopandas 로 shp파일 불러오기
x = gpd.read_file('경로/file_name.shp'. encoding='cp949')
ax = countries.plot(column="continent",categorical =True)
ax.set_axis_off() #x,y 축 제거
countries['gdp_per_cap'] = countries['gdp_md_est'] / countries['pop_est'] * 100
ax = countries.plot(column='gdp_per_cap', legend=True, scheme='quantiles', cmap="Blues")
### scheme는 mapclassify 모듈 필요
ax.set_axis_off()
ax.set_title("세계 국가의 1인당 GDP")
africa_df = countries[countries['continent']=='Africa'] #아프리카 지정
africa_df.plot()
ax.set_axis_off()
country_map = countries.plot(column='continent')
cities_map = cities.plot(ax=country_map,marker='*',color='red',markersize=4)
cities_map.set_axis_off()
import os
path = '''
seoul_line_geo_df = gpd.read_file(
path, # file_name
encoding="cp949" # 한글깨짐 현상 방지
)
## 시각화 하기
# 캔버스 사이즈 정의
plt.rcParams['figure.figsize']=(10,20)
# Line 시각화
seoul_line_geo_df.plot(
color="black"
)
좌표계는 지구라는 곡면을 2차원 데이터로 표현하는 방법론
Geopandas 데이터는 crs속성값으로 확인 가능
좌표계 변환
dataframe.crs = {"init": "epsg:5179"} #epsg 5179로 초기화
dataframe.to_crs("init":"epsg=4326") #epsg 4326 변환 init은 생략가능
leaflet.js를 기반으로 만들어진 python 지도 시각화 라이브러리
인터렉티브 지도 시각화 라이브러리
특징 및 주요기능
i) 대화형 지도 생성
ii)마커와 팝업
iii) 다양한 렌더링 옵션
iv) 지리공간 데이터 시각화
v)Choropleth 맵
vi) 레이어 및 그룹화
vii) 마우스 이벤트 처리
### 기본 사용(랜더링 옵션 포함)
##d
import folium
x = 37.394946
y = 127.111104
m = folium.Map(location= [x,y], # 처음 위치. 튜플이나 리스트
zoom_start=18, # 초기 축소나,크기 정도. int, default =10
width =750, # 맵의 넚이. 픽셀이나 int, default =100%
height=500, # 맵의 높이 픽셀이나 int, default =100%
tiles='' # 타일의 옵션
###예제
x = 36.294946
y = 127.111104
m = folium.Map(location =(x,y),zoom_start=11,width=500,height =500)
###기본
folium.Marker([마커를 표시할 위도,경도],
popup ="나타낼 내용", # html도 가능
tooltip ="", # 마우스만 가져다대면 텍스트 표시. str
icon ="", # 마커를 렌더링하는데 사용할 아이콘. icon plugin
draggable ="" # 드래그 가능 여부. bool
).add_to(m)
i) circle
### 기본
circle = folium.Circle(
location=[위도, 경도], # 원의 중심 좌표
radius=10000, # 반지름 (미터 단위)
color='blue', # 선 색상
fill=True, # 내부를 채울지 여부
fill_color='blue', # 내부 색상
fill_opacity=0.5, # 내부 색상의 투명도
popup='Sample Circle' # 팝업 정보
).add_to(m)
ii) linepoly
###기본
coordinates = [(37.5, -122.0), (37.6, -122.2), (37.6, -122.1)]
polyline = folium.PolyLine(
locations=coordinates, # 선을 구성하는 좌표들의 리스트
color='blue', # 선 색상
weight=3, # 선 두께
opacity=0.7, # 선 투명도
popup='Sample PolyLine' # 팝업 정보
).add_to(m)
iii) polygon
coordinates = [(37.5, -122.0), (37.6, -122.2), (37.6, -122.1)]
polygon = folium.Polygon(
locations=coordinates, # 다각형을 구성하는 좌표들의 리스트
color='blue', # 선 색상
fill=True, # 내부를 채울지 여부
fill_color='blue', # 내부 색상
fill_opacity=0.5, # 내부 색상의 투명도
popup='Sample Polygon' # 팝업 정보
)
i) GeoJSON
{
"type": "Feature", #Feature의 우형
"geometry": { # 해당 Feature의 지오메트리의 정보
"type": "Point",
"coordinates": [102.0, 0.5]
},
"properties": { # Feature의 속성 정보
"name": "Sample Point"
}
}
ii) 지리 공간 데이터 시각화
# 기본
folium.GeoJson(data= 'geojson',
name='', #레이어의 이름 설정
)
# 지도 객체 생성
m = folium.Map(location=[5, 5], zoom_start=5)
# GeoJSON 데이터
geojson_data = {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[0, 0],
[10, 0],
[10, 10],
[0, 10]
]
]
},
"properties": {
"name": "Sample Polygon"
}
}
folium.GeoJson(geojson_data, name='geojson_layer').add_to(m)
m
###기본
# Choropleth 맵 생성
folium.Choropleth(
geo_data='geojson', # 지도 데이터 파일경로 (.GeoJSON)
data=data_frame, # 시각화 하고자 하는 파일 (데이터 프레임)
columns=['', ''], # 지도데이터와 매핑할값, 시각화하고자 하는 변수
key_on='feature.', # 데이터 파일과 매핑할 값
fill_color='YlGn', # 색상 스케일링
fill_opacity=0.7, # 채우기 투명도
line_opacity=0.2, # 경계선 투명도
legend_name='Legend' # 범례 이름
)
columns 에는 geo_data의 변수(열)중에 data와 매핑할 변수
key_on값과 매핑할 값
key_on에는 string값이 들어가야된다. 위에서 설명했 듯이 geojson에는 properties라는 dic형태 안에 속성(변수)가 들어가 있다.
그 중에 매칭할 값을 찾아야한다.
참고로 key_on에는 'feature.properties.속성' 이 들어간다.
좋은 정보 얻어갑니다, 감사합니다.