Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

웃으면서Python

1,086 views

Published on

python

Published in: Data & Analytics
  • Be the first to comment

웃으면서Python

  1. 1. 웃으면서 PYTHON 공간정보 다루기 강의 : 김지윤 (aliasgis@gmail.com)
  2. 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 명령어를 수행 합니다 .
  3. 3. 2. Why Python? • 일단 쉽다 . • 쉬운만큼 쓰기도 쉽다 . • 하나 개발해 놓으면 다른 플랫폼에서도 적용이 가능하다 . -> Web, PC, Smart Phone App 등 • 라이브러리가 많다 .-> 내가 직접 알고리즘을 개발할일이 많지않다 . • 써드 파티언어로 인기가 많다 . -> QGIS(PyQGIS), ArcGIS(ArcPy)
  4. 4. 3. 기초문법 (1) • 데이터 출력하기 >>> GeoScience = {"GPS", "GIS", "RS","LBS"} >>> print(GeoScience) {'RS', 'GIS', 'GPS', 'LBS'} 예제 1. 각자연구실 식구들 이름을 찍어봅시다 .
  5. 5. 3. 기초문법 (2) • 변수 사용법 >>> type(7000) <class 'int'> >>> type(3.14444) <class 'float'> >>> type(' 하하 망했다 ') <class 'str'> >>>
  6. 6. 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
  7. 7. 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)
  8. 8. 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))
  9. 9. 3. 기초문법 (6) • 함수를 써봅시다 . def print_ntime(n): for i in range(n): print(“ 서울시립대 공간정보공학과 ")  실행 Print_ntime(3)
  10. 10. 3. 기초문법 (7) • 이미있는 라이브러리를 쓰고자 할 때 - Import 라이브러리 명을 씀 - 도대체 라이브러리를 왜쓰는 건가 ? 1)이미있는 기능인대 왜 또 짜… 2) 애인 영희 보러가야 하는데 시간도 없어 3) 내가 다알고리즘을 알지만 조금 구현하는데 자신없어 4) 기타 ( 손이 가려워서… .)
  11. 11. 간단한 차트 그리기 import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show()
  12. 12. >>> 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()
  13. 13. 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()
  14. 14. 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()
  15. 15. 간단한 지도 사용하기 1. 일단 라이브러리를 설치 합시다 .(pyproj, BasemapTOOLKIT) http://www.lfd.uci.edu/~gohlke/pythonlibs/
  16. 16. 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()
  17. 17. 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()
  18. 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() 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()
  19. 19. 이시간에는 • QGIS 에서 PYTHON 쓰기 • folium 으로 OSM 지도 사용하기 • PYSAL 라이브러리로 공간데이터 분석해보기
  20. 20. 1. Folium • 설치방법 - pip install folium • 무엇에 쓰는 물건이고… ? - 인터넷지도 즉 html 형태의 지도가 생성이 가능
  21. 21. • 예제 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')
  22. 22. • >>> 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'')
  23. 23. • 예제 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’)
  24. 24. 조별과제후보 1 • Python Folium 으로 자기가 잘가는 곳을 찍어오기 (10 개이상 ) - 반드시 html 과 코드를 내야함
  25. 25. PYSAL 라이브러리 • 넌 대체 머하는 넘이냐… ? - 공간데이터 내부구조를 분석할 수 있음 - 공간데이터 파일을 읽고 쓰기가 가능함 - SHP, CSV, LOTUS,WKT 파일 등을 핸들링이 가능함 - 고급 공간분석알고리즘을 아무렇지 않게 사용할 수있다 . - ArcGIS, PyQGIS 도 요놈을 씀 - 분명 잘 익혀두면 좋은 날이 올까 ?
  26. 26. 파일읽기 *. 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
  27. 27. 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]]
  28. 28. Shp File 의 공간가중치구하기 - 공간가중치 라 함은 공간 상의 인접성을 구하여 인접된 도형에 대한 거리기반 분석임
  29. 29.  w=pysal.weights.Rook.from_shapefile('admin_emd.shp')  w.n  W.histogram
  30. 30. >>> 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)] >>>
  31. 31. 조별과제 후보 2 Pysal 로 지적도 SHP File 분석하기
  32. 32. PyQgis 맛보기 플러그인 메뉴 > 파이썬콘솔 메뉴실행
  33. 33. 여기서 잠깐 Qt 가 먼가요 ..?
  34. 34. 1. 일단 레이어를 부르세 from qgis.core import * wb = QgsVectorLayer('c:/Seoul/admin_sid.shp', 'test', 'ogr') QgsMapLayerRegistry.instance().addMapLayer(wb)
  35. 35. from qgis.core import * raster = QgsRasterLayer('c:/seoul_raster/landsat.tif', 'landsat') QgsMapLayerRegistry.instance().addMapLayer(raster)
  36. 36. 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>
  37. 37. 영상을 분류해 보십다 . # 소스 파일과 레이어 이름 정의 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])
  38. 38. 심화 학습 -> 이게 먼 심화 학습 • Ndvi 를 구해 봅시다 .( 그래도 함 해보세요 ) 근데 Ndvi ( 식생지수 ) 가 머죠 ? 인공위성이나 항공기를 이용하여 관측한 다중 분광대 영상 자료는 지상의 대상물이 각 파장대별로 독특한 특성을 나타내므로 이 특성을 이용하면 원 하는 정보를 추출해 낼 수 있다 . 특히 , Landsat 등 지상관측 위성의 주 관 심 범위인 육지 표면의 영상 자료는 95% 이상이 토양과 식생에 관한 정보 를 포함하고 있으므로 이 영상 자료를 이용하면 지표면의 식생 분포나 식 생 밀집도를 추정하는 것이 가능
  39. 39. 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>
  40. 40. 조별과제 후보 논문 : 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 혹은 오츠 임계치를 구해봅시다 .

×