2. 1.PYQGIS
iface 익히기
- iface객체는 QGIS 의 가장 중요한 객체 입니다.
- -> “독립적인 기능들이 서로 연결되어 각각의기능을
구성하는 것”
-> 객체는 기능 + 기능을 담는 형태“- help(iface)를 통해서 기능구조에 대한 파악이
가능 함
- iface를 통해서 QGIS 는 조작이가능 합니다.
5. 1.PYQGIS
2) iface 심화하기
- iface로 레이어 정보 얻기
type = iface.activeLayer().geometryType()
print(type)
0-> 포인트
1-> 라인
2-> 폴리곤
- iface로 현재 지도창에 레이어
목록가져오기
from qgis.core import QgsProject
From은 어르신 import 어르신에 속한 아이
QgsProject.instance().mapLayers().values()
7. 1.PYQGIS
정답
- iface로 레이어 정보 얻기
layers_list = [] # 자료형을 정의함
curLayers =QgsProject.instance().mapLayers().values()
# 레이어창에 있는 값을가지고옴
for layer in curLayers:
layers_list.append(layer) # 반드시 칸을 주의!!
layers_list[0]
#for문을 돌린다.
8. 2.PYQGIS/GDAL
iface 와 Ogr/Gdal
-레이어 가져오기
wb =
iface.addVectorLayer('C:/pyqgis_scripts/data/world_borders.shp',
'world_borders’, 'ogr’)
ws =
iface.addRasterLayer('C:/pyqgis_scripts/data/rastersample.tif',
'world_borders’, 'gdal')
- GDAL/OGR
1) GIS 프로그래밍의 대표적 라이브러리
2) 거의 모든 GIS 프로그램에 들어가 있음
3) 공간 데이터를 해석하고 교환 함에 있어서 필수적인
라이브러리
4) C++/JAVA/C#/Python 버전이 있음
5) QGIS 에서 GDAL/OGR이 자동으로 설치되어 있음
10. 2.PYQGIS/GDAL
iface 와 Ogr/Gdal
import gdal
driver_list = []
for i in range(gdal.GetDriverCount()):
driver = gdal.GetDriver(i)
driver_list.append(driver.GetDescription())
driver_list.sort()
driver_list
11. 2.PYQGIS/GDAL
Ogr/Gdal wkt
from osgeo import ogr
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(1198054.34, 648493.09)
print(point.ExportToWkt())
print((point.ExportToKML())
- Well Known Text (Wkt)
GIS 데이터 중 아주 원시적 형태의 데이터로
특정 포맷이 아니라 POINT , Wkt를 바이너리로
도 POLYGON, POLYLINE 등을 텍스트 형태로
출력하며, Gis Engine 이나 웹 에서 공간정보를
담기위한 최소한의 형식임
바꿔서 쓰는 데 WKB 형태라고 함
20. 2.PYQGIS/GDAL
>> #qgis 에서 플러그인 없이 그리기
from qgis.core import QgsGeometry, QgsPointXY,
QgsFeature
From은 패키지의 패밀리 , impor는 가족구성원
_>기능이 복잡할 수록 패밀리를 구성 합니다.
단순한구조는 기냥 import
요즘에는 기능이 많아지고 있기 때문에 패밀리를 밝혀야
할 때
layer = QgsVectorLayer('Point?crs=epsg:4326','tests',
'memory')
pr = layer.dataProvider()
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY
(10,10)))
pr.addFeatures([feat])
(True, [<qgis._core.QgsFeature object at
0x000002551AD5AEE8>])
layer.updateExtents()
QgsProject.instance().addMapLayers([layer])
21. 2.PYQGIS/GDAL
>> #qgis 에서 플러그인 없이 그리기
from qgis.core import QgsGeometry, QgsPointXY, QgsFeature
layer = QgsVectorLayer('Point?crs=epsg:4326','tests', 'memory’)
-> 메모리인 경우에는 시스템 꺼지면 바로 없어집니다.
pr = layer.dataProvider()
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(10,10)
))
pr.addFeatures([feat])
QgsProject.instance().addMapLayers([layer])
->iface.addVector 와 기능이 같아요~~
[<QgsMapLayer: 'tests' (memory)>]
1.그림을 그리기 위헤 필요한 것을 임포트 합니다.
2.그림을 파일로 한 것인지, 아니면 임시적으로 저장하지 않고
그리고 싶은지
3. 그림을 그리려면 캔버스와 붓, 물감
4.물감(provider)
5.캔버스 (feature)
6.붓은 (geometry)
22. 2.PYQGIS/GDAL
>> #qgis 에서 플러그인 없이 그리기
from qgis.core import QgsVectorLayer, QgsFeature,
QgsGeometry, QgsProject
layer = QgsVectorLayer('Polygon?crs=epsg:4326', 'Mississippi',
'memory')
pr = layer.dataProvider()
poly = QgsFeature()
geom = QgsGeometry.fromWkt("POLYGON ((-88.82 34.99,-
88.0934.89,-88.39 30.34,-89.57˓30.18,-89.73 31,-91.63 30.99,-
90.8732.37,-91.23 33.44,-90.93 34.23,-90.30 34.99,-88.82
34.99))")
poly.setGeometry(geom)
pr.addFeatures([poly])
layer.updateExtents() -> 레이어 겡신 상태 전달
QgsProject.instance().addMapLayers([layer]) -> 추가 한다.
여기서 iface를 못쓰는 이윤는 메모리이기 때문에
28. 2.PYQGIS/GDAL
>> Geometry 연산
-공간연산의 예 공간분석의 기본
-공간분석을 하고자 하는 욕구가 있죠
-> 기본적인 검색에 대한 욕구가 사람은 가지고 있다.
“하나의 건물에 포함하는 지적을 찾고 싶다.”
“두개의 지적을 하나의 지적으로 만들고 싶다.”
“서울 시립대 근처에 커피숍 중에 반경50m 안에 포함되지 않는
커피 숍 찾기“
29. 2.PYQGIS/GDAL
>> Geometry 연산
-복수개의 도형이 존재하는 경우-> 두개 이상의 도형에 관계를
정의 함
내땅이 남의 집 땅에 들어갔을 때 어떻게 알까?
_< 교집합을 구하면 알 수 있 숩니다.”
땅덩어리 를 사서 우리 땅에 편입시키고 싶어
-> 합집합 구하면 돼 -> union
-공간연산이 가능 함 (교집합, 차집합, 합집합, 여집합)
30. 2.PYQGIS/GDAL
from osgeo import ogr
wkt1 = "POLYGON ((1208064.271243039 624154.6783778917, 1208064.271243039 601260.9785661874,
1231345.9998651114 601260.9785661874, 1231345.9998651114 624154.6783778917,
1208064.271243039 624154.6783778917))"
wkt2 = "POLYGON ((1199915.6662253144 633079.3410163528, 1199915.6662253144 614453.958118695,
1219317.1067437078 614453.958118695, 1219317.1067437078 633079.3410163528,
1199915.6662253144 633079.3410163528)))"
poly1 = ogr.CreateGeometryFromWkt(wkt1)
poly2 = ogr.CreateGeometryFromWkt(wkt2)
intersection = poly1.Intersection(poly2)
print(intersection.ExportToWkt())
merge = poly1.Union(poly2)
print(merge.ExportToWkt())
“ 이 원리는 대개 대중적이고 보편적인 것 => 채팅 사이트 에서도
반경 1km 안에 나의 이상형 , 내땅 경계가 남의 땅 경계가 혹시나 들
궁금"
31. 2.PYQGIS/GDAL
from osgeo import ogr,gdal
Gdal-> 이미지 (위성영상, 드론영상, dem )
dem = gdal.Open('c:pyqgis_scriptsdataclipdem.tif')
numbands = dem.RasterCount
numbands
1
band = dem.GetRasterBand(1)
band
iface.addRasterLayer('c:pyqgis_scriptsdataclipdem.tif', 'dem', 'gdal')
georef = dem.GetGeoTransform()
print(georef)
(126.901434708, 0.001027410888198776, 0.0, 37.711894131, 0.0, -
0.0008108804086021569)
metainform = dem.GetMetadata()
print(metainform)
32. 2.PYQGIS/GDAL
srb = band.GetStatistics(0, 1)
srb
[0.0, 795.0078125,
70.556146739408,
122.97196366094]
print("최소 값: %s", srb[0])
최소 값: %s 0.0
print("최대 값:", srb[1])
최대 값: 795.0078125
print("평균 값:" , srb[2])
평균 값: 70.556146739408
print("표준 편차:", srb[3])- 평균이
얼마나 골고루 분포하는지
표준 편차: 122.97196366094
33. 2.PYQGIS/GDAL
from PyQt5.QtCore import *
from PyQt5.QtGui import *
# 결과를 qgis에서 제어 하겠다.
_>k-means 등등
layer = iface.activeLayer()
renderer = layer.renderer()
provider = layer.dataProvider()
extent = layer.extent()
ver = provider.hasStatistics(1, QgsRasterBandStats.All)
stats = provider.bandStatistics(1, QgsRasterBandStats.All,extent, 0)
min= stats.minimumValue
max = stats.maximumValue
range = max - min
add = range//2
interval = min + add
colDic = {'red':'#ff0000', 'yellow':'#ffff00','blue':'#0000ff'}
valueList =[min, interval, max]
lst = [ QgsColorRampShader.ColorRampItem(valueList[0],
QColor(colDic['red'])),
QgsColorRampShader.ColorRampItem(valueList[1],
QColor(colDic['yellow'])),
QgsColorRampShader.ColorRampItem(valueList[2],
QColor(colDic['blue']))]
34. 2.PYQGIS/GDAL
영상에서 식생지수 구하기
식생지수란 ?(ndvi)
인공위성이나 항공기를 이용하여 관측한 다중 분광대
영상 자료는 지상의 대상물이 각 파장대별로 독특한
특성을 나타내므로 이 특성을 이용하면 원하는 정보를
추출해 낼 수 있다. 특히, Landsat 등 지상관측 위성의 주
관심 범위인 육지 표면의 영상 자료는 95% 이상이 토양과
식생에 관한 정보를 포함하고 있으므로 이 영상 자료를
이용하면 지표면의 식생 분포나 식생 밀집도를 추정하는
것이 가능
<원래 Landsat 영상> <ndvi>
35. 2.PYQGIS/GDAL
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from qgis.analysis import *
rasterName ="landsat"
raster = QgsRasterLayer("c:/pyqgis_scripts/data/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 NDVI를 구할 때
쓰는 공식입니다.
output = "c:/pyqgis_scripts/data/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()
lyr = QgsRasterLayer(output, "NDVI")
iface.addRasterLayer(output, 'NDVI', 'gdal')
36. 공간 클러스터링 개요
• 데이터를 정의 한다. (어떤 데이터 인지?)
• 통계를 구한다. (최대,최소, 평균, 표준편차, 분산)
• 값을 분류하기 위해서 공식을 만들거나 적용한다.
• 굳이 어렵게 공식을 만들 필요는 없다.
• -> 값이 가지고 있는 성질에 따라 그룹핑하면 되니까
• 시각화가 필요하면 그룹핑한값에 따라서 색깔이나 심볼을 배치함
38. 3.PYQGIS
1) 스크립트 에디터 사용하기
from osgeo import ogr
from qgis.utils import iface
from qgis.core import *
# Create test polygon
ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(1179091.1646903288, 712782.8838459781)
ring.AddPoint(1161053.0218226474, 667456.2684348812)
ring.AddPoint(1214704.933941905, 641092.8288590391)
ring.AddPoint(1228580.428455506, 682719.3123998424)
ring.AddPoint(1218405.0658121984, 721108.1805541387)
ring.AddPoint(1179091.1646903288, 712782.8838459781)
poly = ogr.Geometry(ogr.wkbPolygon)
poly.AddGeometry(ring)
# Create the output Driver
outDriver = ogr.GetDriverByName('GeoJSON')
39. 3.PYQGIS
1) 스크립트 에디터 사용하기
# Create the output GeoJSON
outDataSource =
outDriver.CreateDataSource('C:/pyqgis_scripts/test.geojso
n')
outLayer = outDataSource.CreateLayer('test.geojson',
geom_type=ogr.wkbPolygon )
# Get the output Layer's Feature Definition
featureDefn = outLayer.GetLayerDefn()
# create a new feature
outFeature = ogr.Feature(featureDefn)
# Set new geometry
outFeature.SetGeometry(poly)
40. 3.PYQGIS
1) 스크립트 에디터 사용하기
# Add new feature to output Layer
outLayer.CreateFeature(outFeature)
# dereference the feature
outFeature = None
# Save and close DataSources
outDataSource = None
wb = iface.addVectorLayer('C:/pyqgis_scripts/test.geojson',
'test', 'ogr')
41. 프로세싱
• for alg in QgsApplication.processingRegistry().algorithms():
• print(alg.id(), "-->", alg.displayName())
for alg in QgsApplication.processingRegistry().algorithms():
print(alg.id(), "-->", alg.displayName())
QGIS를 가지고 무슨 공간분석을 할 수 있는지 알수
있음
42. 고급 프로세싱
1) 프로세싱은 복잡한 공간작업이나 분석에서 쓰임
2) QGIS에서는 Processing이라는 함수 덩어리가 존재 함
3) 아크 에 툴 박스를 함수화 한것