SlideShare a Scribd company logo
웃으면서 PYTHON
공간정보 다루기
강의 : 김지윤
(aliasgis@gmail.com)
1. 설치해 봅시다 .
• 필요한 것은 다 설치해봅시다 .
https://www.python.org/downloads/
-> 3.4 버전
-numpy, scipy,matplotlib 를 설치해봅시다 .
(1)OS 가 윈도우라는 전제 하에
- http://www.lfd.uci.edu/~gohlke/pythonlibs/
(2)버전에 맞는 라이브러리를 받아보십다 .
(3)설치해 보십다 .
Dos Command 를 실행 -> pip 명령어를 수행 합니다 .
웃으면서Python
2. Why Python?
• 일단 쉽다 .
• 쉬운만큼 쓰기도 쉽다 .
• 하나 개발해 놓으면 다른 플랫폼에서도 적용이 가능하다 .
-> Web, PC, Smart Phone App 등
• 라이브러리가 많다 .-> 내가 직접 알고리즘을 개발할일이
많지않다 .
• 써드 파티언어로 인기가 많다 .
-> QGIS(PyQGIS), ArcGIS(ArcPy)
3. 기초문법 (1)
• 데이터 출력하기
>>> GeoScience = {"GPS", "GIS", "RS","LBS"}
>>> print(GeoScience)
{'RS', 'GIS', 'GPS', 'LBS'}
예제 1. 각자연구실 식구들 이름을 찍어봅시다 .
3. 기초문법 (2)
• 변수 사용법
>>> type(7000)
<class 'int'>
>>> type(3.14444)
<class 'float'>
>>> type(' 하하 망했다 ')
<class 'str'>
>>>
3. 기초문법 (3)
• 프로그램 제어하기 ( if ~ else)
>> price = 7000
>> if price < 1000: bid = 1
elif price >= 1000 and price < 5000: bid = 5
elif price >= 5000 and price < 10000: bid = 10
elif price >= 10000 and price < 50000: bid = 50
elif price >= 50000 and price < 100000: bid = 100
elif price >= 100000 and price < 500000: bid = 500
elif price >= 500000: bid = 1000
>> bid
3. 기초문법 (4)
• for 문과 range
Range
예 ) range(1,10)
list(range(1,10))
>>> for i in range(0, 11):
print(i)
>>> interest_stocks = ["Naver", "Samsung", "SK Hynix"]
>>> for company in interest_stocks:
print(company)
// 리스트 와 튜플 의 차이
>>> interest_stocks = ("Naver", "Samsung", "SK Hynix")
>>> for company in interest_stocks:
print("%s: Buy 10" % company)
3. 기초문법 (5)
• for 문과 Dictionary
- 데이터를 필드 와 값으로 구분하는 경우
예 )
interest_stocks = {"Naver":10, "Samsung":5, "SK Hynix":30}
for company, stock_num in interest_stocks.items():
print("%s: Buy %s" % (company, stock_num))
3. 기초문법 (6)
• 함수를 써봅시다 .
def print_ntime(n):
for i in range(n):
print(“ 서울시립대 공간정보공학과 ")
 실행
Print_ntime(3)
3. 기초문법 (7)
• 이미있는 라이브러리를 쓰고자 할 때
- Import 라이브러리 명을 씀
- 도대체 라이브러리를 왜쓰는 건가 ?
1)이미있는 기능인대 왜 또 짜…
2) 애인 영희 보러가야 하는데 시간도 없어
3) 내가 다알고리즘을 알지만 조금 구현하는데 자신없어
4) 기타 ( 손이 가려워서… .)
웃으면서Python
간단한 차트 그리기
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(0, 1, 500)
>>> y = np.sin(4 * np.pi * x) * np.exp(-5 * x)
>>> fig, ax = plt.subplots()
>>> ax.fill(x, y, zorder=10)
>>> ax.grid(True, zorder=5)
>>> plt.show()
from mpl_toolkits.mplot3d import
axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contourf(X, Y, Z,
cmap=cm.coolwarm)
ax.clabel(cset, fontsize=9, inline=1)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2
# 0 to 15 point radii
plt.scatter(x, y, s=area, c=colors,
alpha=0.5)
plt.show()
간단한 지도 사용하기
1. 일단 라이브러리를 설치 합시다 .(pyproj, BasemapTOOLKIT)
http://www.lfd.uci.edu/~gohlke/pythonlibs/
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135,
resolut ion = 'h', area_thresh = 0.1,
llcrnrlon=-136.25, llcrnrlat=56.0,
urcrnrlon=-134.25, urcrnrlat=57.75)
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color = 'coral')
map.drawmapboundary()
plt.show()
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135,
resolut ion = 'h', area_thresh = 0.1,
llcrnrlon=-136.25, llcrnrlat=56.0,
urcrnrlon=-134.25, urcrnrlat=57.75)
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color = 'coral')
map.drawmapboundary()
lon = -135.3318
lat = 57.0799
x,y = map(lon, lat)
map.plot(x, y, 'bo', markersize=24)
plt.show()
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135,
resolut ion = 'h', area_thresh = 0.1,
llcrnrlon=-136.25, llcrnrlat=56.0,
urcrnrlon=-134.25, urcrnrlat=57.75)
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color = 'coral')
map.drawmapboundary()
lons = [-135.3318, -134.8331, -134.6572]
lats = [57.0799, 57.0894, 56.2399]
x,y = map(lons, lats)
map.plot(x, y, 'bo', markersize=18)
labels = ['Sitka', 'Baranof Warm Springs', 'Port Alexander']
for label, xpt, ypt in zip(labels, x, y):
plt.text(xpt+10000, ypt+5000, label)
plt.show()
이시간에는
• QGIS 에서 PYTHON 쓰기
• folium 으로 OSM 지도 사용하기
• PYSAL 라이브러리로 공간데이터 분석해보기
1. Folium
• 설치방법
- pip install folium
• 무엇에 쓰는 물건이고… ?
- 인터넷지도 즉 html 형태의 지도가 생성이 가능
• 예제 1
>>map_osm = folium.Map(location=[37.567871,126.97783],zoom_start=17,tiles='StamenTerrain')
>>> map_osm.save('map3.html')
>>> map_osm = folium.Map(location=[37.567871,126.97783],zoom_start=17,tiles='StamenToner')
>>> map_osm.save('map4.html')
• >>> map_osm = folium.Map(location=[37.566345, 126.9779893], zoom_start=17)
• >>> folium.Marker([37.566345, 126.977873],popup=' 서울시청 ').add_to(map_osm)
• >>> folium.Marker([37.56588345, 126.975473],popup=' 덕수중 ').add_to(map_osm)
• >>> map_osm.save('map5.html'')
• 예제 2. HeatMap
>>> import folium
>>> import numpy as np
>>> data2 = (np.random.normal(size=(100, 3)) *
np.array([[1, 1, 1]]) +
np.array([[37, 126.45341, 1]])).tolist()
>>> from folium.plugins import HeatMap
>>> m = folium.Map([37., 126.45341], tiles='stamentoner', zoom_start=6)
>>> HeatMap(data2).add_to(m)
>>>m.Save(‘HeatMap.html’)
조별과제후보 1
• Python Folium 으로 자기가 잘가는 곳을 찍어오기
(10 개이상 )
- 반드시 html 과 코드를 내야함
PYSAL 라이브러리
• 넌 대체 머하는 넘이냐… ?
- 공간데이터 내부구조를 분석할 수 있음
- 공간데이터 파일을 읽고 쓰기가 가능함
- SHP, CSV, LOTUS,WKT 파일 등을 핸들링이 가능함
- 고급 공간분석알고리즘을 아무렇지 않게 사용할 수있다 .
- ArcGIS, PyQGIS 도 요놈을 씀
- 분명 잘 익혀두면 좋은 날이 올까 ?
파일읽기
*. Shp 파일 해석해보기
>>>db = pysal.open('admin_sid.dbf')
>>. db.header
['SID_CD', 'SID_NM', 'POP2007', 'POP2008', 'Shape_Leng', 'Shape_Area']
>>> db.field_spec
[('C', 10, 0), ('C', 20, 0), ('F', 19, 11), ('F', 19, 11), ('F', 19, 11), ('F', 19, 11)]
>>> import pysal
>>> shp = pysal.open('admin_sid.shp')
>>> len(shp)
1
import pysal as ps
f = shapefile.Reader("admin_sid")
f.bbox
[179101.84250000026, 436263.77749999985,
216151.0915000001, 466550.22389999963]
f.numRecords
f.fields
[('DeletionFlag', 'C', 1, 0), ['SID_CD', 'C', 10, 0], ['SID_NM', 'C',
20, 0], ['POP2007', 'F', 19, 11], ['POP2008', 'F', 19, 11],
['Shape_Leng', 'F', 19, 11], ['Shape_Area', 'F', 19, 11]]
Shp File 의 공간가중치구하기
- 공간가중치 라 함은 공간 상의 인접성을 구하여 인접된 도형에 대한 거리기반
분석임
 w=pysal.weights.Rook.from_shapefile('admin_emd.shp')
 w.n
 W.histogram
>>> w = pysal.weights.Queen.from_shapefile('admin_sgg.shp')
>>> w.n
25
>>> w.histogram
[(2, 3), (3, 5), (4, 4), (5, 5), (6, 6), (7, 2)]
>>>
조별과제 후보 2
Pysal 로 지적도 SHP File 분석하기
PyQgis 맛보기
플러그인 메뉴 > 파이썬콘솔 메뉴실행
웃으면서Python
여기서 잠깐 Qt 가 먼가요 ..?
웃으면서Python
1. 일단 레이어를 부르세
from qgis.core import *
wb = QgsVectorLayer('c:/Seoul/admin_sid.shp', 'test', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(wb)
from qgis.core import *
raster = QgsRasterLayer('c:/seoul_raster/landsat.tif', 'landsat')
QgsMapLayerRegistry.instance().addMapLayer(raster)
raster.width(), raster.height()
(1773, 1428)
raster.bandCount()
3
raster.metadata()
u'<p class="glossy">ub4dcub77cuc774ubc84</p>n<p>GDAL
provider</p>nGTiff<br>GeoTIFF<p class="glossy">ub370uc774ud130uc14b
uc124uba85</p>n<p>c:/seoul_raster/landsat.tif</p>n<p
class="glossy">ubc34ub4dc
1</p>n<tr><p>nSTATISTICS_MAXIMUM=255</p>n<p>nSTATISTICS_MEA
N=115.2659212021</p>n<p>nSTATISTICS_MINIMUM=0</p>n<p>nSTATIS
TICS_STDDEV=74.58091813766</p>n</tr><p class="glossy">ubc34ub4dc
2</p>n<tr><p>nSTATISTICS_MAXIMUM=255</p>n<p>nSTATISTICS_MEA
N=121.37074164127</p>n<p>nSTATISTICS_MINIMUM=0</p>n<p>
영상을 분류해 보십다 .
# 소스 파일과 레이어 이름 정의
srcFile = "c:/seoul_raster/landsat.tif" # source file
lyrName = "landsat" # layer name
# 레이어 생성
from qgis.core import QgsRasterLayer
rasterLyr = QgsRasterLayer(srcFile, lyrName)
# 목록에 레이어 추가
# QgsMapLayerRegistry.instance().addMapLayers([rasterLyr])
c = QgsColorRampShader()
c.setColorRampType(QgsColorRampShader.INTERPOLATED)
from PyQt4 import QtGui
i = []
i.append(QgsColorRampShader.ColorRampItem(0, QtGui.QColor('#000000'), '0'))
i.append(QgsColorRampShader.ColorRampItem(6, QtGui.QColor('#ffffff'), ''))
i.append(QgsColorRampShader.ColorRampItem(36, QtGui.QColor('#c4baa4'), ''))
i.append(QgsColorRampShader.ColorRampItem(36.5, QtGui.QColor('#b4966c'), '0.1'))
i.append(QgsColorRampShader.ColorRampItem(97.1, QtGui.QColor('#a4824c'), ''))
i.append(QgsColorRampShader.ColorRampItem(97.6, QtGui.QColor('#94723c'), ''))
i.append(QgsColorRampShader.ColorRampItem(128, QtGui.QColor('#7c9e2c'), '0.2'))
i.append(QgsColorRampShader.ColorRampItem(160, QtGui.QColor('#94b614'), ''))
i.append(QgsColorRampShader.ColorRampItem(190, QtGui.QColor('#74aa04'), '0.3'))
i.append(QgsColorRampShader.ColorRampItem(219, QtGui.QColor('#64a204'), ''))
i.append(QgsColorRampShader.ColorRampItem(241, QtGui.QColor('#549604'), '0.4'))
c.setColorRampItemList(i)
s = QgsRasterShader()
s.setRasterShaderFunction(c)
ps = QgsSingleBandPseudoColorRenderer(rasterLyr.dataProvider(), 1, s)
rasterLyr.setRenderer(ps)
# 목록에 레이어 추가
QgsMapLayerRegistry.instance().addMapLayers([rasterLyr])
심화 학습 -> 이게 먼 심화 학습
• Ndvi 를 구해 봅시다 .( 그래도 함 해보세요 )
근데 Ndvi ( 식생지수 ) 가 머죠 ?
인공위성이나 항공기를 이용하여 관측한 다중 분광대 영상 자료는 지상의
대상물이 각 파장대별로 독특한 특성을 나타내므로 이 특성을 이용하면 원
하는 정보를 추출해 낼 수 있다 . 특히 , Landsat 등 지상관측 위성의 주 관
심 범위인 육지 표면의 영상 자료는 95% 이상이 토양과 식생에 관한 정보
를 포함하고 있으므로 이 영상 자료를 이용하면 지표면의 식생 분포나 식
생 밀집도를 추정하는 것이 가능
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from qgis.analysis import *
rasterName ="landsat"
raster = QgsRasterLayer("c:/seoul_raster/landsat.tif", rasterName)
ir = QgsRasterCalculatorEntry()
r = QgsRasterCalculatorEntry()
ir.raster = raster
r.raster = raster
ir.bandNumber = 2
r.bandNumber = 1
ir.ref = rasterName + "@2"
r.ref = rasterName + "@1"
reference = (ir.ref, r.ref, ir.ref, r.ref)
exp = "1.0 * (%s - %s) / 1.0 + (%s + %s)" % reference
output = "c:/seoul_raster/ndvi.tif"
e = raster.extent()
w = raster.width()
h = raster.height()
entries = [ir, r]
ndvi = QgsRasterCalculator(exp, output, "GTiff", e,w,h, entries)
ndvi.processCalculation()
0
lyr = QgsRasterLayer(output, "NDVI")
QgsMapLayerRegistry.instance().addMapLayer(lyr)
<qgis._core.QgsRasterLayer object at 0x0B0F55D0>
조별과제 후보
논문 : Otsu, N., 1979. A threshold selection method from gray-level
histogram. IEEE Transactions on Systems, Man, and Cybernetics 9, 62–66.
PDF: http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4310076
제공된 서울시립대영상에서 ndvi 혹은 오츠 임계치를 구해봅시다 .
웃으면서Python

More Related Content

PPTX
Python qgis advanced
PPTX
Proj4를 이용한 좌표계 변환
PDF
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
PPTX
공간정보아카데미 - 오픈소스GIS 분석가과정 - QGIS 공간분석일반
PPTX
[FOSS4G Korea 2017] uDig GIS 효율적으로 활용하기
PPTX
PostGIS - National Education Center for GIS: Open Source GIS
PPTX
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
PDF
Qgis 기초 2019
Python qgis advanced
Proj4를 이용한 좌표계 변환
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
공간정보아카데미 - 오픈소스GIS 분석가과정 - QGIS 공간분석일반
[FOSS4G Korea 2017] uDig GIS 효율적으로 활용하기
PostGIS - National Education Center for GIS: Open Source GIS
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Qgis 기초 2019

What's hot (20)

PDF
PostGIS 시작하기
PDF
QGIS 실습 (총 7차시)
PPTX
이권일 Sse 를 이용한 최적화와 실제 사용 예
PPTX
Python on Android
PDF
State of OpenGXT: 오픈소스 공간분석엔진
PPTX
QGIS 활용
PPTX
오픈소스 공간통계분석 패키지 개발
PPTX
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
PPTX
[FOSS4G KOREA 2014] Introduce uDig
PDF
Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발
PDF
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
PPTX
[제86회 Open Technet]OGC 표준 기반의 공간자료 분석과 시각화 기술 개발
PPTX
[FOSS4G] uDig Desktop GIS
PDF
윤석준 2015 cuda_contest
PPTX
[FOSS4G Korea 2016] Workshop - Advanced GeoServer
PDF
병렬프로그래밍과 Cuda
PPTX
공간정보거점대학 1.geo server_고급과정
PDF
1 QGIS intro
PPT
GeoTools와 GeoServer를 이용한 KOPSS Open API의 구현
PPTX
오픈소스GIS 개론 과정 - OpenLayers 기초
PostGIS 시작하기
QGIS 실습 (총 7차시)
이권일 Sse 를 이용한 최적화와 실제 사용 예
Python on Android
State of OpenGXT: 오픈소스 공간분석엔진
QGIS 활용
오픈소스 공간통계분석 패키지 개발
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
[FOSS4G KOREA 2014] Introduce uDig
Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[제86회 Open Technet]OGC 표준 기반의 공간자료 분석과 시각화 기술 개발
[FOSS4G] uDig Desktop GIS
윤석준 2015 cuda_contest
[FOSS4G Korea 2016] Workshop - Advanced GeoServer
병렬프로그래밍과 Cuda
공간정보거점대학 1.geo server_고급과정
1 QGIS intro
GeoTools와 GeoServer를 이용한 KOPSS Open API의 구현
오픈소스GIS 개론 과정 - OpenLayers 기초
Ad

Similar to 웃으면서Python (20)

PPT
Pyqgis 기초편
PDF
QGIS를 활용한 공간분석 입문 ver.1.0
PDF
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PPTX
QGIS 고급 및 PyQGIS - 김기웅, 임영현
PDF
오픈소스 GIS 실습 (1)
PPTX
영상 데이터의 처리와 정보의 추출
PPTX
QGIS 기초
PPTX
공간정보거점대학 - PyQGIS 및 플러그인 개발
PPTX
Python 활용: 이미지 처리와 데이터 분석
PDF
지리정보체계(GIS) - [1] GIS 데이터 유형, 구조 알기
PPTX
Matplotlib 기초 이해하기_20160730
PPTX
공간정보아카데미 QGIS 기초 (2017.5)
PPTX
Python data analysis library
PPTX
공간정보거점대학 PostGIS 고급과정
PDF
오픈소스 GIS 실습 (3)
PPTX
Python+numpy pandas 2편
PDF
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
PDF
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
PPTX
Line sweep algorithms
PDF
Python
Pyqgis 기초편
QGIS를 활용한 공간분석 입문 ver.1.0
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
QGIS 고급 및 PyQGIS - 김기웅, 임영현
오픈소스 GIS 실습 (1)
영상 데이터의 처리와 정보의 추출
QGIS 기초
공간정보거점대학 - PyQGIS 및 플러그인 개발
Python 활용: 이미지 처리와 데이터 분석
지리정보체계(GIS) - [1] GIS 데이터 유형, 구조 알기
Matplotlib 기초 이해하기_20160730
공간정보아카데미 QGIS 기초 (2017.5)
Python data analysis library
공간정보거점대학 PostGIS 고급과정
오픈소스 GIS 실습 (3)
Python+numpy pandas 2편
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
Line sweep algorithms
Python
Ad

More from Jiyoon Kim (8)

PPTX
Foss4 g kr-workshop_gps_2021
PPTX
Qgis에서 GPS 연동
PPTX
Geo tools Data Transfer
PPTX
Mongodb and spatial
PPTX
osgeo 봄 세미나 -R
PPTX
웃는동안 배우는 Qgis
PPTX
전자해도세미나
PPTX
Vworld api desktop에서 쓰기
Foss4 g kr-workshop_gps_2021
Qgis에서 GPS 연동
Geo tools Data Transfer
Mongodb and spatial
osgeo 봄 세미나 -R
웃는동안 배우는 Qgis
전자해도세미나
Vworld api desktop에서 쓰기

웃으면서Python

  • 1. 웃으면서 PYTHON 공간정보 다루기 강의 : 김지윤 (aliasgis@gmail.com)
  • 2. 1. 설치해 봅시다 . • 필요한 것은 다 설치해봅시다 . https://www.python.org/downloads/ -> 3.4 버전 -numpy, scipy,matplotlib 를 설치해봅시다 . (1)OS 가 윈도우라는 전제 하에 - http://www.lfd.uci.edu/~gohlke/pythonlibs/ (2)버전에 맞는 라이브러리를 받아보십다 . (3)설치해 보십다 . Dos Command 를 실행 -> pip 명령어를 수행 합니다 .
  • 4. 2. Why Python? • 일단 쉽다 . • 쉬운만큼 쓰기도 쉽다 . • 하나 개발해 놓으면 다른 플랫폼에서도 적용이 가능하다 . -> Web, PC, Smart Phone App 등 • 라이브러리가 많다 .-> 내가 직접 알고리즘을 개발할일이 많지않다 . • 써드 파티언어로 인기가 많다 . -> QGIS(PyQGIS), ArcGIS(ArcPy)
  • 5. 3. 기초문법 (1) • 데이터 출력하기 >>> GeoScience = {"GPS", "GIS", "RS","LBS"} >>> print(GeoScience) {'RS', 'GIS', 'GPS', 'LBS'} 예제 1. 각자연구실 식구들 이름을 찍어봅시다 .
  • 6. 3. 기초문법 (2) • 변수 사용법 >>> type(7000) <class 'int'> >>> type(3.14444) <class 'float'> >>> type(' 하하 망했다 ') <class 'str'> >>>
  • 7. 3. 기초문법 (3) • 프로그램 제어하기 ( if ~ else) >> price = 7000 >> if price < 1000: bid = 1 elif price >= 1000 and price < 5000: bid = 5 elif price >= 5000 and price < 10000: bid = 10 elif price >= 10000 and price < 50000: bid = 50 elif price >= 50000 and price < 100000: bid = 100 elif price >= 100000 and price < 500000: bid = 500 elif price >= 500000: bid = 1000 >> bid
  • 8. 3. 기초문법 (4) • for 문과 range Range 예 ) range(1,10) list(range(1,10)) >>> for i in range(0, 11): print(i) >>> interest_stocks = ["Naver", "Samsung", "SK Hynix"] >>> for company in interest_stocks: print(company) // 리스트 와 튜플 의 차이 >>> interest_stocks = ("Naver", "Samsung", "SK Hynix") >>> for company in interest_stocks: print("%s: Buy 10" % company)
  • 9. 3. 기초문법 (5) • for 문과 Dictionary - 데이터를 필드 와 값으로 구분하는 경우 예 ) interest_stocks = {"Naver":10, "Samsung":5, "SK Hynix":30} for company, stock_num in interest_stocks.items(): print("%s: Buy %s" % (company, stock_num))
  • 10. 3. 기초문법 (6) • 함수를 써봅시다 . def print_ntime(n): for i in range(n): print(“ 서울시립대 공간정보공학과 ")  실행 Print_ntime(3)
  • 11. 3. 기초문법 (7) • 이미있는 라이브러리를 쓰고자 할 때 - Import 라이브러리 명을 씀 - 도대체 라이브러리를 왜쓰는 건가 ? 1)이미있는 기능인대 왜 또 짜… 2) 애인 영희 보러가야 하는데 시간도 없어 3) 내가 다알고리즘을 알지만 조금 구현하는데 자신없어 4) 기타 ( 손이 가려워서… .)
  • 13. 간단한 차트 그리기 import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show()
  • 14. >>> import numpy as np >>> import matplotlib.pyplot as plt >>> x = np.linspace(0, 1, 500) >>> y = np.sin(4 * np.pi * x) * np.exp(-5 * x) >>> fig, ax = plt.subplots() >>> ax.fill(x, y, zorder=10) >>> ax.grid(True, zorder=5) >>> plt.show()
  • 15. from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt from matplotlib import cm fig = plt.figure() ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contourf(X, Y, Z, cmap=cm.coolwarm) ax.clabel(cset, fontsize=9, inline=1) plt.show()
  • 16. import numpy as np import matplotlib.pyplot as plt N = 50 x = np.random.rand(N) y = np.random.rand(N) colors = np.random.rand(N) area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radii plt.scatter(x, y, s=area, c=colors, alpha=0.5) plt.show()
  • 17. 간단한 지도 사용하기 1. 일단 라이브러리를 설치 합시다 .(pyproj, BasemapTOOLKIT) http://www.lfd.uci.edu/~gohlke/pythonlibs/
  • 18. from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135, resolut ion = 'h', area_thresh = 0.1, llcrnrlon=-136.25, llcrnrlat=56.0, urcrnrlon=-134.25, urcrnrlat=57.75) map.drawcoastlines() map.drawcountries() map.fillcontinents(color = 'coral') map.drawmapboundary() plt.show()
  • 19. from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135, resolut ion = 'h', area_thresh = 0.1, llcrnrlon=-136.25, llcrnrlat=56.0, urcrnrlon=-134.25, urcrnrlat=57.75) map.drawcoastlines() map.drawcountries() map.fillcontinents(color = 'coral') map.drawmapboundary() lon = -135.3318 lat = 57.0799 x,y = map(lon, lat) map.plot(x, y, 'bo', markersize=24) plt.show()
  • 20. from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135, resolut ion = 'h', area_thresh = 0.1, llcrnrlon=-136.25, llcrnrlat=56.0, urcrnrlon=-134.25, urcrnrlat=57.75) map.drawcoastlines() map.drawcountries() map.fillcontinents(color = 'coral') map.drawmapboundary() lons = [-135.3318, -134.8331, -134.6572] lats = [57.0799, 57.0894, 56.2399] x,y = map(lons, lats) map.plot(x, y, 'bo', markersize=18) labels = ['Sitka', 'Baranof Warm Springs', 'Port Alexander'] for label, xpt, ypt in zip(labels, x, y): plt.text(xpt+10000, ypt+5000, label) plt.show()
  • 21. 이시간에는 • QGIS 에서 PYTHON 쓰기 • folium 으로 OSM 지도 사용하기 • PYSAL 라이브러리로 공간데이터 분석해보기
  • 22. 1. Folium • 설치방법 - pip install folium • 무엇에 쓰는 물건이고… ? - 인터넷지도 즉 html 형태의 지도가 생성이 가능
  • 23. • 예제 1 >>map_osm = folium.Map(location=[37.567871,126.97783],zoom_start=17,tiles='StamenTerrain') >>> map_osm.save('map3.html') >>> map_osm = folium.Map(location=[37.567871,126.97783],zoom_start=17,tiles='StamenToner') >>> map_osm.save('map4.html')
  • 24. • >>> map_osm = folium.Map(location=[37.566345, 126.9779893], zoom_start=17) • >>> folium.Marker([37.566345, 126.977873],popup=' 서울시청 ').add_to(map_osm) • >>> folium.Marker([37.56588345, 126.975473],popup=' 덕수중 ').add_to(map_osm) • >>> map_osm.save('map5.html'')
  • 25. • 예제 2. HeatMap >>> import folium >>> import numpy as np >>> data2 = (np.random.normal(size=(100, 3)) * np.array([[1, 1, 1]]) + np.array([[37, 126.45341, 1]])).tolist() >>> from folium.plugins import HeatMap >>> m = folium.Map([37., 126.45341], tiles='stamentoner', zoom_start=6) >>> HeatMap(data2).add_to(m) >>>m.Save(‘HeatMap.html’)
  • 26. 조별과제후보 1 • Python Folium 으로 자기가 잘가는 곳을 찍어오기 (10 개이상 ) - 반드시 html 과 코드를 내야함
  • 27. PYSAL 라이브러리 • 넌 대체 머하는 넘이냐… ? - 공간데이터 내부구조를 분석할 수 있음 - 공간데이터 파일을 읽고 쓰기가 가능함 - SHP, CSV, LOTUS,WKT 파일 등을 핸들링이 가능함 - 고급 공간분석알고리즘을 아무렇지 않게 사용할 수있다 . - ArcGIS, PyQGIS 도 요놈을 씀 - 분명 잘 익혀두면 좋은 날이 올까 ?
  • 28. 파일읽기 *. Shp 파일 해석해보기 >>>db = pysal.open('admin_sid.dbf') >>. db.header ['SID_CD', 'SID_NM', 'POP2007', 'POP2008', 'Shape_Leng', 'Shape_Area'] >>> db.field_spec [('C', 10, 0), ('C', 20, 0), ('F', 19, 11), ('F', 19, 11), ('F', 19, 11), ('F', 19, 11)] >>> import pysal >>> shp = pysal.open('admin_sid.shp') >>> len(shp) 1
  • 29. import pysal as ps f = shapefile.Reader("admin_sid") f.bbox [179101.84250000026, 436263.77749999985, 216151.0915000001, 466550.22389999963] f.numRecords f.fields [('DeletionFlag', 'C', 1, 0), ['SID_CD', 'C', 10, 0], ['SID_NM', 'C', 20, 0], ['POP2007', 'F', 19, 11], ['POP2008', 'F', 19, 11], ['Shape_Leng', 'F', 19, 11], ['Shape_Area', 'F', 19, 11]]
  • 30. Shp File 의 공간가중치구하기 - 공간가중치 라 함은 공간 상의 인접성을 구하여 인접된 도형에 대한 거리기반 분석임
  • 32. >>> w = pysal.weights.Queen.from_shapefile('admin_sgg.shp') >>> w.n 25 >>> w.histogram [(2, 3), (3, 5), (4, 4), (5, 5), (6, 6), (7, 2)] >>>
  • 33. 조별과제 후보 2 Pysal 로 지적도 SHP File 분석하기
  • 34. PyQgis 맛보기 플러그인 메뉴 > 파이썬콘솔 메뉴실행
  • 36. 여기서 잠깐 Qt 가 먼가요 ..?
  • 38. 1. 일단 레이어를 부르세 from qgis.core import * wb = QgsVectorLayer('c:/Seoul/admin_sid.shp', 'test', 'ogr') QgsMapLayerRegistry.instance().addMapLayer(wb)
  • 39. from qgis.core import * raster = QgsRasterLayer('c:/seoul_raster/landsat.tif', 'landsat') QgsMapLayerRegistry.instance().addMapLayer(raster)
  • 40. raster.width(), raster.height() (1773, 1428) raster.bandCount() 3 raster.metadata() u'<p class="glossy">ub4dcub77cuc774ubc84</p>n<p>GDAL provider</p>nGTiff<br>GeoTIFF<p class="glossy">ub370uc774ud130uc14b uc124uba85</p>n<p>c:/seoul_raster/landsat.tif</p>n<p class="glossy">ubc34ub4dc 1</p>n<tr><p>nSTATISTICS_MAXIMUM=255</p>n<p>nSTATISTICS_MEA N=115.2659212021</p>n<p>nSTATISTICS_MINIMUM=0</p>n<p>nSTATIS TICS_STDDEV=74.58091813766</p>n</tr><p class="glossy">ubc34ub4dc 2</p>n<tr><p>nSTATISTICS_MAXIMUM=255</p>n<p>nSTATISTICS_MEA N=121.37074164127</p>n<p>nSTATISTICS_MINIMUM=0</p>n<p>
  • 41. 영상을 분류해 보십다 . # 소스 파일과 레이어 이름 정의 srcFile = "c:/seoul_raster/landsat.tif" # source file lyrName = "landsat" # layer name # 레이어 생성 from qgis.core import QgsRasterLayer rasterLyr = QgsRasterLayer(srcFile, lyrName) # 목록에 레이어 추가 # QgsMapLayerRegistry.instance().addMapLayers([rasterLyr]) c = QgsColorRampShader() c.setColorRampType(QgsColorRampShader.INTERPOLATED) from PyQt4 import QtGui i = [] i.append(QgsColorRampShader.ColorRampItem(0, QtGui.QColor('#000000'), '0')) i.append(QgsColorRampShader.ColorRampItem(6, QtGui.QColor('#ffffff'), '')) i.append(QgsColorRampShader.ColorRampItem(36, QtGui.QColor('#c4baa4'), '')) i.append(QgsColorRampShader.ColorRampItem(36.5, QtGui.QColor('#b4966c'), '0.1')) i.append(QgsColorRampShader.ColorRampItem(97.1, QtGui.QColor('#a4824c'), '')) i.append(QgsColorRampShader.ColorRampItem(97.6, QtGui.QColor('#94723c'), '')) i.append(QgsColorRampShader.ColorRampItem(128, QtGui.QColor('#7c9e2c'), '0.2')) i.append(QgsColorRampShader.ColorRampItem(160, QtGui.QColor('#94b614'), '')) i.append(QgsColorRampShader.ColorRampItem(190, QtGui.QColor('#74aa04'), '0.3')) i.append(QgsColorRampShader.ColorRampItem(219, QtGui.QColor('#64a204'), '')) i.append(QgsColorRampShader.ColorRampItem(241, QtGui.QColor('#549604'), '0.4')) c.setColorRampItemList(i) s = QgsRasterShader() s.setRasterShaderFunction(c) ps = QgsSingleBandPseudoColorRenderer(rasterLyr.dataProvider(), 1, s) rasterLyr.setRenderer(ps) # 목록에 레이어 추가 QgsMapLayerRegistry.instance().addMapLayers([rasterLyr])
  • 42. 심화 학습 -> 이게 먼 심화 학습 • Ndvi 를 구해 봅시다 .( 그래도 함 해보세요 ) 근데 Ndvi ( 식생지수 ) 가 머죠 ? 인공위성이나 항공기를 이용하여 관측한 다중 분광대 영상 자료는 지상의 대상물이 각 파장대별로 독특한 특성을 나타내므로 이 특성을 이용하면 원 하는 정보를 추출해 낼 수 있다 . 특히 , Landsat 등 지상관측 위성의 주 관 심 범위인 육지 표면의 영상 자료는 95% 이상이 토양과 식생에 관한 정보 를 포함하고 있으므로 이 영상 자료를 이용하면 지표면의 식생 분포나 식 생 밀집도를 추정하는 것이 가능
  • 43. from PyQt4.QtGui import * from PyQt4.QtCore import * from qgis.analysis import * rasterName ="landsat" raster = QgsRasterLayer("c:/seoul_raster/landsat.tif", rasterName) ir = QgsRasterCalculatorEntry() r = QgsRasterCalculatorEntry() ir.raster = raster r.raster = raster ir.bandNumber = 2 r.bandNumber = 1 ir.ref = rasterName + "@2" r.ref = rasterName + "@1" reference = (ir.ref, r.ref, ir.ref, r.ref) exp = "1.0 * (%s - %s) / 1.0 + (%s + %s)" % reference output = "c:/seoul_raster/ndvi.tif" e = raster.extent() w = raster.width() h = raster.height() entries = [ir, r] ndvi = QgsRasterCalculator(exp, output, "GTiff", e,w,h, entries) ndvi.processCalculation() 0 lyr = QgsRasterLayer(output, "NDVI") QgsMapLayerRegistry.instance().addMapLayer(lyr) <qgis._core.QgsRasterLayer object at 0x0B0F55D0>
  • 44. 조별과제 후보 논문 : Otsu, N., 1979. A threshold selection method from gray-level histogram. IEEE Transactions on Systems, Man, and Cybernetics 9, 62–66. PDF: http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4310076 제공된 서울시립대영상에서 ndvi 혹은 오츠 임계치를 구해봅시다 .