SlideShare a Scribd company logo
1 of 59
PYQGIS 수업
Sit Dolor Amet
1.PYQGIS
iface 익히기
- iface객체는 QGIS 의 가장 중요한 객체 입니다.
- -> “독립적인 기능들이 서로 연결되어 각각의기능을
구성하는 것”
-> 객체는 기능 + 기능을 담는 형태“- help(iface)를 통해서 기능구조에 대한 파악이
가능 함
- iface를 통해서 QGIS 는 조작이가능 합니다.
1.PYQGIS
iface 익히기
- iface. zoomFull()
- Zoom 조정
canvas = qgis.utils.iface.mapCanvas()
canvas.zoomByFactor(1.1)
-iface.zoomToActiveLayer()
- Iface 객체로 속성 창 띄위기
activelayer = iface.activeLayer()
iface.showAttributeTable(activelayer)
iface.showLayerProperties(activelayer)
- Zoom Selected
1.PYQGIS
2) iface 심화하기
- iface로 속성 검색하기
iface.showLayerProperties(activelayer)
iface.showAttributeTable(activelayer, "cat=63")
- iface로 레이어 좌표계 정보 얻기
crs = iface.activeLayer().crs().authid()
print(crs)
EPSG:2964
( 좌표계 : EPSG)
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()
QUIZ01. 레이어목록에서 특정 레이어 이
름 만 가져오기 (10분)
• for 문과 리스트 객체를 사용하세요
1.PYQGIS
정답
- iface로 레이어 정보 얻기
layers_list = [] # 자료형을 정의함
curLayers =QgsProject.instance().mapLayers().values()
# 레이어창에 있는 값을가지고옴
for layer in curLayers:
layers_list.append(layer) # 반드시 칸을 주의!!
layers_list[0]
#for문을 돌린다.
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이 자동으로 설치되어 있음
2.PYQGIS/GDAL
iface 와 Ogr/Gdal
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
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 형태라고 함
2.PYQGIS/GDAL
Ogr/Gdal wkt
>> from osgeo import ogr
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(1116651.439379124, 637392.6969887456)
line.AddPoint(1188804.0108498496, 652655.7409537067)
line.AddPoint(1226730.3625203592, 634155.0816022386)
line.AddPoint(1281307.30760719, 636467.6640211721)
line.ExportToWkt()
'LINESTRING (1116651.43937912 637392.696988746
0,1188804.01084985 652655.740953707
0,1226730.36252036 634155.081602239
0,1281307.30760719 636467.664021172 0)'
2.PYQGIS/GDAL
Ogr/Gdal
>> # Create ring
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)
# Create polygon
poly = ogr.Geometry(ogr.wkbPolygon)
poly.AddGeometry(ring)
0
poly
print (poly.ExportToWkt())
2.PYQGIS/GDAL
이것이 그려지는 모양을 확인하기 위하여 플러그 인 설치
2.PYQGIS/GDAL
이것이 그려지는 모양을 확인하기 위하여 플러그 인 설치
2.PYQGIS/GDAL
홀 폴리곤 그리기
# Create outer ring
outRing = ogr.Geometry(ogr.wkbLinearRing)
outRing.AddPoint(1154115.274565847,
686419.4442701361)
outRing.AddPoint(1154115.274565847,
653118.2574374934)
outRing.AddPoint(1165678.1866605144,
653118.2574374934)
outRing.AddPoint(1165678.1866605144,
686419.4442701361)
outRing.AddPoint(1154115.274565847,
686419.4442701361)
# Create inner ring
innerRing = ogr.Geometry(ogr.wkbLinearRing)
innerRing.AddPoint(1149490.1097279799,
691044.6091080031)
innerRing.AddPoint(1149490.1097279799,
648030.5761158396)
innerRing.AddPoint(1191579.1097525698,
648030.5761158396)
2.PYQGIS/GDAL
2.PYQGIS/GDAL
# 버퍼링 그리기
from osgeo import ogr
wkt = "POINT (1198054.34 648493.09)"
pt = ogr.CreateGeometryFromWkt(wkt)
bufferDistance = 500
poly = pt.Buffer(bufferDistance)
print(poly)
2.PYQGIS/GDAL
“wkt를 알아두면 좋은 것은 위치기반의
iot 도구 혹은 스마트 시티에서
위치정보를 받아올때 wkt혹은wkb를
많이 씀“
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])
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)
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를 못쓰는 이윤는 메모리이기 때문에
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])
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])
QUIZ02. 포인트,폴리곤,라인스트링 WKT
를 OGR 코드로 그리기 (10분)
2.PYQGIS/GDAL
>> 벡터 분석
from osgeo import ogr
wkt = "LINESTRING (1181866.263593049 615654.4222507705,
1205917.1207499576 623979.7189589312,
1227192.8790041457 643405.4112779726,
1224880.2965852122 665143.6860159477)"
geom = ogr.CreateGeometryFromWkt(wkt)
# Get Envelope returns a tuple (minX, maxX, minY, maxY)
env = geom.GetEnvelope()  이용
“대한민국을 그리면 대한민국의 범위가 있죠“
print("minX: %d, minY:%d, maxX: %d, maxX: %d",
env[0],env[1],env[2],env[3])
minX: %d, minY:%d, maxX: %d, maxX: %d 1181866.263593049
1227192.8790041457 615654.4222507705 665143.6860159477
2.PYQGIS/GDAL
>> 벡터 분석2
> from osgeo import ogr
wkt = "POLYGON ((1162440.5712740074 672081.4332727483,
1162440.5712740074 647105.5431482664,
1195279.2416228633 647105.5431482664,
1195279.2416228633 672081.4332727483,
1162440.5712740074 672081.4332727483))"
poly = ogr.CreateGeometryFromWkt(wkt)
print("area={}".format(area, "1.3f"))
area=820175022.4671059
2.PYQGIS/GDAL
>> Geometry 연산
-공간연산의 예 공간분석의 기본
-공간분석을 하고자 하는 욕구가 있죠
-> 기본적인 검색에 대한 욕구가 사람은 가지고 있다.
“하나의 건물에 포함하는 지적을 찾고 싶다.”
“두개의 지적을 하나의 지적으로 만들고 싶다.”
“서울 시립대 근처에 커피숍 중에 반경50m 안에 포함되지 않는
커피 숍 찾기“
2.PYQGIS/GDAL
>> Geometry 연산
-복수개의 도형이 존재하는 경우-> 두개 이상의 도형에 관계를
정의 함
내땅이 남의 집 땅에 들어갔을 때 어떻게 알까?
_< 교집합을 구하면 알 수 있 숩니다.”
땅덩어리 를 사서 우리 땅에 편입시키고 싶어
-> 합집합 구하면 돼 -> union
-공간연산이 가능 함 (교집합, 차집합, 합집합, 여집합)
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 안에 나의 이상형 , 내땅 경계가 남의 땅 경계가 혹시나 들
궁금"
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)
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
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']))]
2.PYQGIS/GDAL
영상에서 식생지수 구하기
식생지수란 ?(ndvi)
인공위성이나 항공기를 이용하여 관측한 다중 분광대
영상 자료는 지상의 대상물이 각 파장대별로 독특한
특성을 나타내므로 이 특성을 이용하면 원하는 정보를
추출해 낼 수 있다. 특히, Landsat 등 지상관측 위성의 주
관심 범위인 육지 표면의 영상 자료는 95% 이상이 토양과
식생에 관한 정보를 포함하고 있으므로 이 영상 자료를
이용하면 지표면의 식생 분포나 식생 밀집도를 추정하는
것이 가능
<원래 Landsat 영상> <ndvi>
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')
공간 클러스터링 개요
• 데이터를 정의 한다. (어떤 데이터 인지?)
• 통계를 구한다. (최대,최소, 평균, 표준편차, 분산)
• 값을 분류하기 위해서 공식을 만들거나 적용한다.
•  굳이 어렵게 공식을 만들 필요는 없다.
• -> 값이 가지고 있는 성질에 따라 그룹핑하면 되니까
• 시각화가 필요하면 그룹핑한값에 따라서 색깔이나 심볼을 배치함
3.PYQGIS
1) 스크립트 에디터 사용하기
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')
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)
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')
프로세싱
• for alg in QgsApplication.processingRegistry().algorithms():
• print(alg.id(), "-->", alg.displayName())
for alg in QgsApplication.processingRegistry().algorithms():
print(alg.id(), "-->", alg.displayName())
 QGIS를 가지고 무슨 공간분석을 할 수 있는지 알수
있음
고급 프로세싱
1) 프로세싱은 복잡한 공간작업이나 분석에서 쓰임
2) QGIS에서는 Processing이라는 함수 덩어리가 존재 함
3) 아크 에 툴 박스를 함수화 한것
import processing
clipped_raster = processing.run("gdal:cliprasterbyextent", { 'DATA_TYPE' : 0, 'EXTRA' : '', 'INPUT' :
'C:/pyqgis_scripts/data/clipdem.tif', 'NODATA' : None, 'OPTIONS' : '', 'OUTPUT' :
'C:/pyqgis_scripts/data/clipdemexam.tif', 'PROJWIN' :
'14130480.078842243,14140197.51731686,4523081.101199242,4533093.007506423 [EPSG:3857]' })
clipped_raster['OUTPUT’]
처음에는 프로세싱 코드 명칭 가져오고, 두번 째 입출력 값만 정의하면 됨
레스터를 범위로 자르는 방법
프로세싱 인자 확인
• 첫번째 프로세싱 인자는 확인하려면
3) QGIS에서는 Processing Help에서 찾는 방법도 존재
프로세싱 인자 확인
• 두번째 입력 값은 Qgis 에서 해당기능을 확인 함
import processing
vbuffer = processing.run("native:buffer", { 'DISSOLVE' : True, 'DISTANCE' : 10,
'END_CAP_STYLE' : 0, 'INPUT' : 'C:/pyqgis_scripts/data/cities.shp', 'JOIN_STYLE' : 0,
'MITER_LIMIT' : 2, 'OUTPUT' : 'E:/Raster/GeoCoding/geodata/buffer_new.shp',
'SEGMENTS' : 5 })
“ 여기서의 의문 버튼 누르면 되잖아요"
“ 동작을 새로 만들거나 여러 작업을 한번에 처리
해야"
import processing
vbuffer = processing.run("native:buffer", { 'DISSOLVE' : True, 'DISTANCE' : 10, 'END_CAP_STYLE' : 0,
'INPUT' : 'C:/pyqgis_scripts/data/cities.shp', 'JOIN_STYLE' : 0, 'MITER_LIMIT' : 2, 'OUTPUT' :
'E:/Raster/GeoCoding/geodata/buffer_new.shp', 'SEGMENTS' : 5 })
vClips = processing.run("native:clip", {'INPUT' : 'E:/Raster/GeoCoding/geodata/buffer_new.shp',
'OUTPUT' : 'C:/pyqgis_scripts/data/clip.shp', 'OVERLAY' : 'C:/pyqgis_scripts/data/world_borders.shp' })
iface.addVectorLayer('C:/pyqgis_scripts/data/clip.shp', 'clip', 'ogr')
“버퍼링 만들어서 이것을 다른 공간데이터에서 겹치는 부분을 자르고 자른 결과를 도시하고자 할 때"씀
PROCESSING 코드로 구현할 수 있는 범위
공간처리 툴 박스 도 마찬가지
import processing
vPhoto = processing.run("native:importphotos",
{ 'FOLDER' : 'C:pyqgis_scriptsdata', 'OUTPUT' :
'TEMPORARY_OUTPUT', 'RECURSIVE' : False })
레스터에서 적용
import processing
iface.addRasterLayer('C:/pyqgis_scripts/data/clipdem.tif', 'clipdem', 'gdal')
vParam = processing.run("gdal:slope", { 'AS_PERCENT' : False, 'BAND' : 1,
'COMPUTE_EDGES' : False, 'EXTRA' : '', 'INPUT' : 'C:/pyqgis_scripts/data/clipdem.tif',
'OPTIONS' : '', 'OUTPUT' : 'C:/pyqgis_scripts/data/slope.tif', 'SCALE' : 5, 'ZEVENBERGEN' :
False })
iface.addRasterLayer('C:/pyqgis_scripts/data/slope.tif', 'slope2', 'gdal')
import processing
iface.addRasterLayer('C:/pyqgis_scripts/data/clipdem.tif', 'clipdem', 'gdal')
vParam = processing.run("gdal:slope", { 'AS_PERCENT' : False, 'BAND' : 1,
'COMPUTE_EDGES' : False, 'EXTRA' : '', 'INPUT' : 'C:/pyqgis_scripts/data/clipdem.tif',
'OPTIONS' : '', 'OUTPUT' : 'C:/pyqgis_scripts/data/slope.tif', 'SCALE' : 5,
'ZEVENBERGEN' : False })
iface.addRasterLayer('C:/pyqgis_scripts/data/slope.tif', 'slope2', 'gdal')
vParam2 = processing.run("gdal:slope", { 'BAND' : 1, 'CREATE_3D' : False, 'EXTRA' : '',
'FIELD_NAME' : 'ELEV',
'IGNORE_NODATA' : False, 'INPUT' : 'C:/pyqgis_scripts/data/clipdem.tif', 'INTERVAL' :
10, 'NODATA' : None, 'OFFSET' : 0, 'OUTPUT' : 'C:/pyqgis_scripts/data/elev.shp' })
iface.addVectorLayer('C:/pyqgis_scripts/data/elev.shp', 'contour', 'ogr')
연습
• Dem에서 경사도 , 향, 등고선을 추출해보세요
• 코드로도 해보세요
(시간 15분)
QGIS에서 Heatmap 만들기
import processing
heat = processing.run('qgis:heatmapkerneldensityestimation', { 'DECAY' : 0, 'INPUT' :
'C:/pyqgis_scripts/data/cities.shp', 'KERNEL' : 0, 'OUTPUT' :
'C:/pyqgis_scripts/data/HEATMAP.tif', 'OUTPUT_VALUE' : 0, 'PIXEL_SIZE' : 10.1, 'RADIUS' :
50, 'RADIUS_FIELD' : None, 'WEIGHT_FIELD' : None })
• GIS 상에서 좌표변환은 매우 중요함
• 이세상에는 수많은 좌표계가 존재 함
• 단위의 변환에는 projection 과정이 필요 함
• Pyqgis에는 적절한 해법이 있음
->osr패키지가 있음
OSR(좌표변환)
from osgeo import ogr
from osgeo import osr
source = osr.SpatialReference()
source.ImportFromEPSG(4326) #세계측지계
target = osr.SpatialReference()
target.ImportFromEPSG(5174) #네이버좌표계 (원본하고 변환될 대상의 좌표계가 있어야한다.)
-> 변환당시에 epsgcode로 서로 교환한다.
Transform = osr.CoordinateTransformation(source, target) -> 어떻게 바끌건지 정의
Point = ogr.CreateGeometryFromWkt("POINT (36 128.42)")
Point.Transform(transform)
print(point.ExportToWkt())
OSR로 좌표계 얻어오기
from osgeo import ogr, osr
driver = ogr.GetDriverByName('ESRI Shapefile')
dataset = driver.Open('C:/pyqgis_scripts/data/world_borders.shp')
# from Layer
layer = dataset.GetLayer()
spatialRef = layer.GetSpatialRef()
# from Geometry
feature = layer.GetNextFeature()
geom = feature.GetGeometryRef()
spatialRef = geom.GetSpatialReference()
print(spatialRef)

More Related Content

What's hot

게임엔진과 공간정보 3D 콘텐츠 융합 : Cesium for Unreal
게임엔진과 공간정보 3D 콘텐츠 융합 : Cesium for Unreal게임엔진과 공간정보 3D 콘텐츠 융합 : Cesium for Unreal
게임엔진과 공간정보 3D 콘텐츠 융합 : Cesium for UnrealKyu-sung Choi
 
공간정보거점대학 1.geo server_고급과정
공간정보거점대학 1.geo server_고급과정공간정보거점대학 1.geo server_고급과정
공간정보거점대학 1.geo server_고급과정BJ Jang
 
공간정보아카데미 QGIS 기초 (2017.5)
공간정보아카데미 QGIS 기초 (2017.5)공간정보아카데미 QGIS 기초 (2017.5)
공간정보아카데미 QGIS 기초 (2017.5)Sungjin Kang
 
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석MinPa Lee
 
PyQGIS 개발자 쿡북
PyQGIS 개발자 쿡북PyQGIS 개발자 쿡북
PyQGIS 개발자 쿡북BJ Jang
 
오픈소스GIS 개발 일반 강의자료
오픈소스GIS 개발 일반 강의자료오픈소스GIS 개발 일반 강의자료
오픈소스GIS 개발 일반 강의자료BJ Jang
 
오픈 소스 GIS와 OSGeo
오픈 소스 GIS와 OSGeo오픈 소스 GIS와 OSGeo
오픈 소스 GIS와 OSGeoSANGHEE SHIN
 
오픈소스GIS 개론 과정 - OpenLayers 기초
오픈소스GIS 개론 과정 - OpenLayers 기초오픈소스GIS 개론 과정 - OpenLayers 기초
오픈소스GIS 개론 과정 - OpenLayers 기초HaNJiN Lee
 
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
 공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습 공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습HaNJiN Lee
 
[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기Chris Ohk
 
지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정
지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정 지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정
지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정 Byeong-Hyeok Yu
 
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판BJ Jang
 
공간SQL을 이용한 공간자료분석 기초실습
공간SQL을 이용한 공간자료분석 기초실습공간SQL을 이용한 공간자료분석 기초실습
공간SQL을 이용한 공간자료분석 기초실습BJ Jang
 
Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발
Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발
Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발MinPa Lee
 
error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticsmametter
 
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028MinPa Lee
 
Qgis 기초 2019
Qgis 기초 2019Qgis 기초 2019
Qgis 기초 2019Joonho Lee
 
공간정보거점대학 PostGIS 고급과정
공간정보거점대학 PostGIS 고급과정공간정보거점대학 PostGIS 고급과정
공간정보거점대학 PostGIS 고급과정JungHwan Yun
 

What's hot (20)

게임엔진과 공간정보 3D 콘텐츠 융합 : Cesium for Unreal
게임엔진과 공간정보 3D 콘텐츠 융합 : Cesium for Unreal게임엔진과 공간정보 3D 콘텐츠 융합 : Cesium for Unreal
게임엔진과 공간정보 3D 콘텐츠 융합 : Cesium for Unreal
 
공간정보거점대학 1.geo server_고급과정
공간정보거점대학 1.geo server_고급과정공간정보거점대학 1.geo server_고급과정
공간정보거점대학 1.geo server_고급과정
 
공간정보아카데미 QGIS 기초 (2017.5)
공간정보아카데미 QGIS 기초 (2017.5)공간정보아카데미 QGIS 기초 (2017.5)
공간정보아카데미 QGIS 기초 (2017.5)
 
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
 
PostGIS 시작하기
PostGIS 시작하기PostGIS 시작하기
PostGIS 시작하기
 
PyQGIS 개발자 쿡북
PyQGIS 개발자 쿡북PyQGIS 개발자 쿡북
PyQGIS 개발자 쿡북
 
오픈소스GIS 개발 일반 강의자료
오픈소스GIS 개발 일반 강의자료오픈소스GIS 개발 일반 강의자료
오픈소스GIS 개발 일반 강의자료
 
오픈 소스 GIS와 OSGeo
오픈 소스 GIS와 OSGeo오픈 소스 GIS와 OSGeo
오픈 소스 GIS와 OSGeo
 
오픈소스GIS 개론 과정 - OpenLayers 기초
오픈소스GIS 개론 과정 - OpenLayers 기초오픈소스GIS 개론 과정 - OpenLayers 기초
오픈소스GIS 개론 과정 - OpenLayers 기초
 
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
 공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습 공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
 
[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기
 
지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정
지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정 지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정
지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정
 
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
 
공간SQL을 이용한 공간자료분석 기초실습
공간SQL을 이용한 공간자료분석 기초실습공간SQL을 이용한 공간자료분석 기초실습
공간SQL을 이용한 공간자료분석 기초실습
 
Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발
Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발
Java 기반의 오픈 소스 GIS를 지원하는 국내 공간 DBMS 드라이버 개발
 
error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnostics
 
GeoServer 기초
GeoServer 기초GeoServer 기초
GeoServer 기초
 
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
 
Qgis 기초 2019
Qgis 기초 2019Qgis 기초 2019
Qgis 기초 2019
 
공간정보거점대학 PostGIS 고급과정
공간정보거점대학 PostGIS 고급과정공간정보거점대학 PostGIS 고급과정
공간정보거점대학 PostGIS 고급과정
 

More from Jiyoon Kim

Foss4 g kr-workshop_gps_2021
Foss4 g kr-workshop_gps_2021Foss4 g kr-workshop_gps_2021
Foss4 g kr-workshop_gps_2021Jiyoon Kim
 
Qgis에서 GPS 연동
Qgis에서 GPS 연동Qgis에서 GPS 연동
Qgis에서 GPS 연동Jiyoon Kim
 
Python qgis advanced
Python qgis advancedPython qgis advanced
Python qgis advancedJiyoon Kim
 
Geo tools Data Transfer
Geo tools Data TransferGeo tools Data Transfer
Geo tools Data TransferJiyoon Kim
 
Mongodb and spatial
Mongodb and spatialMongodb and spatial
Mongodb and spatialJiyoon Kim
 
osgeo 봄 세미나 -R
osgeo 봄 세미나 -Rosgeo 봄 세미나 -R
osgeo 봄 세미나 -RJiyoon Kim
 
웃는동안 배우는 Qgis
웃는동안 배우는 Qgis웃는동안 배우는 Qgis
웃는동안 배우는 QgisJiyoon Kim
 
웃으면서Python
웃으면서Python웃으면서Python
웃으면서PythonJiyoon Kim
 
전자해도세미나
전자해도세미나전자해도세미나
전자해도세미나Jiyoon Kim
 
Vworld api desktop에서 쓰기
Vworld api desktop에서 쓰기Vworld api desktop에서 쓰기
Vworld api desktop에서 쓰기Jiyoon Kim
 

More from Jiyoon Kim (10)

Foss4 g kr-workshop_gps_2021
Foss4 g kr-workshop_gps_2021Foss4 g kr-workshop_gps_2021
Foss4 g kr-workshop_gps_2021
 
Qgis에서 GPS 연동
Qgis에서 GPS 연동Qgis에서 GPS 연동
Qgis에서 GPS 연동
 
Python qgis advanced
Python qgis advancedPython qgis advanced
Python qgis advanced
 
Geo tools Data Transfer
Geo tools Data TransferGeo tools Data Transfer
Geo tools Data Transfer
 
Mongodb and spatial
Mongodb and spatialMongodb and spatial
Mongodb and spatial
 
osgeo 봄 세미나 -R
osgeo 봄 세미나 -Rosgeo 봄 세미나 -R
osgeo 봄 세미나 -R
 
웃는동안 배우는 Qgis
웃는동안 배우는 Qgis웃는동안 배우는 Qgis
웃는동안 배우는 Qgis
 
웃으면서Python
웃으면서Python웃으면서Python
웃으면서Python
 
전자해도세미나
전자해도세미나전자해도세미나
전자해도세미나
 
Vworld api desktop에서 쓰기
Vworld api desktop에서 쓰기Vworld api desktop에서 쓰기
Vworld api desktop에서 쓰기
 

Pyqgis 기초편

  • 2. 1.PYQGIS iface 익히기 - iface객체는 QGIS 의 가장 중요한 객체 입니다. - -> “독립적인 기능들이 서로 연결되어 각각의기능을 구성하는 것” -> 객체는 기능 + 기능을 담는 형태“- help(iface)를 통해서 기능구조에 대한 파악이 가능 함 - iface를 통해서 QGIS 는 조작이가능 합니다.
  • 3. 1.PYQGIS iface 익히기 - iface. zoomFull() - Zoom 조정 canvas = qgis.utils.iface.mapCanvas() canvas.zoomByFactor(1.1) -iface.zoomToActiveLayer() - Iface 객체로 속성 창 띄위기 activelayer = iface.activeLayer() iface.showAttributeTable(activelayer) iface.showLayerProperties(activelayer) - Zoom Selected
  • 4. 1.PYQGIS 2) iface 심화하기 - iface로 속성 검색하기 iface.showLayerProperties(activelayer) iface.showAttributeTable(activelayer, "cat=63") - iface로 레이어 좌표계 정보 얻기 crs = iface.activeLayer().crs().authid() print(crs) EPSG:2964 ( 좌표계 : EPSG)
  • 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()
  • 6. QUIZ01. 레이어목록에서 특정 레이어 이 름 만 가져오기 (10분) • for 문과 리스트 객체를 사용하세요
  • 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 형태라고 함
  • 12. 2.PYQGIS/GDAL Ogr/Gdal wkt >> from osgeo import ogr line = ogr.Geometry(ogr.wkbLineString) line.AddPoint(1116651.439379124, 637392.6969887456) line.AddPoint(1188804.0108498496, 652655.7409537067) line.AddPoint(1226730.3625203592, 634155.0816022386) line.AddPoint(1281307.30760719, 636467.6640211721) line.ExportToWkt() 'LINESTRING (1116651.43937912 637392.696988746 0,1188804.01084985 652655.740953707 0,1226730.36252036 634155.081602239 0,1281307.30760719 636467.664021172 0)'
  • 13. 2.PYQGIS/GDAL Ogr/Gdal >> # Create ring 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) # Create polygon poly = ogr.Geometry(ogr.wkbPolygon) poly.AddGeometry(ring) 0 poly print (poly.ExportToWkt())
  • 14. 2.PYQGIS/GDAL 이것이 그려지는 모양을 확인하기 위하여 플러그 인 설치
  • 15. 2.PYQGIS/GDAL 이것이 그려지는 모양을 확인하기 위하여 플러그 인 설치
  • 16. 2.PYQGIS/GDAL 홀 폴리곤 그리기 # Create outer ring outRing = ogr.Geometry(ogr.wkbLinearRing) outRing.AddPoint(1154115.274565847, 686419.4442701361) outRing.AddPoint(1154115.274565847, 653118.2574374934) outRing.AddPoint(1165678.1866605144, 653118.2574374934) outRing.AddPoint(1165678.1866605144, 686419.4442701361) outRing.AddPoint(1154115.274565847, 686419.4442701361) # Create inner ring innerRing = ogr.Geometry(ogr.wkbLinearRing) innerRing.AddPoint(1149490.1097279799, 691044.6091080031) innerRing.AddPoint(1149490.1097279799, 648030.5761158396) innerRing.AddPoint(1191579.1097525698, 648030.5761158396)
  • 18. 2.PYQGIS/GDAL # 버퍼링 그리기 from osgeo import ogr wkt = "POINT (1198054.34 648493.09)" pt = ogr.CreateGeometryFromWkt(wkt) bufferDistance = 500 poly = pt.Buffer(bufferDistance) print(poly)
  • 19. 2.PYQGIS/GDAL “wkt를 알아두면 좋은 것은 위치기반의 iot 도구 혹은 스마트 시티에서 위치정보를 받아올때 wkt혹은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를 못쓰는 이윤는 메모리이기 때문에
  • 23. 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])
  • 24. 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])
  • 25. QUIZ02. 포인트,폴리곤,라인스트링 WKT 를 OGR 코드로 그리기 (10분)
  • 26. 2.PYQGIS/GDAL >> 벡터 분석 from osgeo import ogr wkt = "LINESTRING (1181866.263593049 615654.4222507705, 1205917.1207499576 623979.7189589312, 1227192.8790041457 643405.4112779726, 1224880.2965852122 665143.6860159477)" geom = ogr.CreateGeometryFromWkt(wkt) # Get Envelope returns a tuple (minX, maxX, minY, maxY) env = geom.GetEnvelope()  이용 “대한민국을 그리면 대한민국의 범위가 있죠“ print("minX: %d, minY:%d, maxX: %d, maxX: %d", env[0],env[1],env[2],env[3]) minX: %d, minY:%d, maxX: %d, maxX: %d 1181866.263593049 1227192.8790041457 615654.4222507705 665143.6860159477
  • 27. 2.PYQGIS/GDAL >> 벡터 분석2 > from osgeo import ogr wkt = "POLYGON ((1162440.5712740074 672081.4332727483, 1162440.5712740074 647105.5431482664, 1195279.2416228633 647105.5431482664, 1195279.2416228633 672081.4332727483, 1162440.5712740074 672081.4332727483))" poly = ogr.CreateGeometryFromWkt(wkt) print("area={}".format(area, "1.3f")) area=820175022.4671059
  • 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) 아크 에 툴 박스를 함수화 한것
  • 43. import processing clipped_raster = processing.run("gdal:cliprasterbyextent", { 'DATA_TYPE' : 0, 'EXTRA' : '', 'INPUT' : 'C:/pyqgis_scripts/data/clipdem.tif', 'NODATA' : None, 'OPTIONS' : '', 'OUTPUT' : 'C:/pyqgis_scripts/data/clipdemexam.tif', 'PROJWIN' : '14130480.078842243,14140197.51731686,4523081.101199242,4533093.007506423 [EPSG:3857]' }) clipped_raster['OUTPUT’] 처음에는 프로세싱 코드 명칭 가져오고, 두번 째 입출력 값만 정의하면 됨 레스터를 범위로 자르는 방법
  • 44. 프로세싱 인자 확인 • 첫번째 프로세싱 인자는 확인하려면
  • 45. 3) QGIS에서는 Processing Help에서 찾는 방법도 존재
  • 46. 프로세싱 인자 확인 • 두번째 입력 값은 Qgis 에서 해당기능을 확인 함
  • 47.
  • 48. import processing vbuffer = processing.run("native:buffer", { 'DISSOLVE' : True, 'DISTANCE' : 10, 'END_CAP_STYLE' : 0, 'INPUT' : 'C:/pyqgis_scripts/data/cities.shp', 'JOIN_STYLE' : 0, 'MITER_LIMIT' : 2, 'OUTPUT' : 'E:/Raster/GeoCoding/geodata/buffer_new.shp', 'SEGMENTS' : 5 })
  • 49. “ 여기서의 의문 버튼 누르면 되잖아요" “ 동작을 새로 만들거나 여러 작업을 한번에 처리 해야"
  • 50. import processing vbuffer = processing.run("native:buffer", { 'DISSOLVE' : True, 'DISTANCE' : 10, 'END_CAP_STYLE' : 0, 'INPUT' : 'C:/pyqgis_scripts/data/cities.shp', 'JOIN_STYLE' : 0, 'MITER_LIMIT' : 2, 'OUTPUT' : 'E:/Raster/GeoCoding/geodata/buffer_new.shp', 'SEGMENTS' : 5 }) vClips = processing.run("native:clip", {'INPUT' : 'E:/Raster/GeoCoding/geodata/buffer_new.shp', 'OUTPUT' : 'C:/pyqgis_scripts/data/clip.shp', 'OVERLAY' : 'C:/pyqgis_scripts/data/world_borders.shp' }) iface.addVectorLayer('C:/pyqgis_scripts/data/clip.shp', 'clip', 'ogr') “버퍼링 만들어서 이것을 다른 공간데이터에서 겹치는 부분을 자르고 자른 결과를 도시하고자 할 때"씀
  • 51. PROCESSING 코드로 구현할 수 있는 범위
  • 52. 공간처리 툴 박스 도 마찬가지 import processing vPhoto = processing.run("native:importphotos", { 'FOLDER' : 'C:pyqgis_scriptsdata', 'OUTPUT' : 'TEMPORARY_OUTPUT', 'RECURSIVE' : False })
  • 53. 레스터에서 적용 import processing iface.addRasterLayer('C:/pyqgis_scripts/data/clipdem.tif', 'clipdem', 'gdal') vParam = processing.run("gdal:slope", { 'AS_PERCENT' : False, 'BAND' : 1, 'COMPUTE_EDGES' : False, 'EXTRA' : '', 'INPUT' : 'C:/pyqgis_scripts/data/clipdem.tif', 'OPTIONS' : '', 'OUTPUT' : 'C:/pyqgis_scripts/data/slope.tif', 'SCALE' : 5, 'ZEVENBERGEN' : False }) iface.addRasterLayer('C:/pyqgis_scripts/data/slope.tif', 'slope2', 'gdal')
  • 54. import processing iface.addRasterLayer('C:/pyqgis_scripts/data/clipdem.tif', 'clipdem', 'gdal') vParam = processing.run("gdal:slope", { 'AS_PERCENT' : False, 'BAND' : 1, 'COMPUTE_EDGES' : False, 'EXTRA' : '', 'INPUT' : 'C:/pyqgis_scripts/data/clipdem.tif', 'OPTIONS' : '', 'OUTPUT' : 'C:/pyqgis_scripts/data/slope.tif', 'SCALE' : 5, 'ZEVENBERGEN' : False }) iface.addRasterLayer('C:/pyqgis_scripts/data/slope.tif', 'slope2', 'gdal') vParam2 = processing.run("gdal:slope", { 'BAND' : 1, 'CREATE_3D' : False, 'EXTRA' : '', 'FIELD_NAME' : 'ELEV', 'IGNORE_NODATA' : False, 'INPUT' : 'C:/pyqgis_scripts/data/clipdem.tif', 'INTERVAL' : 10, 'NODATA' : None, 'OFFSET' : 0, 'OUTPUT' : 'C:/pyqgis_scripts/data/elev.shp' }) iface.addVectorLayer('C:/pyqgis_scripts/data/elev.shp', 'contour', 'ogr')
  • 55. 연습 • Dem에서 경사도 , 향, 등고선을 추출해보세요 • 코드로도 해보세요 (시간 15분)
  • 56. QGIS에서 Heatmap 만들기 import processing heat = processing.run('qgis:heatmapkerneldensityestimation', { 'DECAY' : 0, 'INPUT' : 'C:/pyqgis_scripts/data/cities.shp', 'KERNEL' : 0, 'OUTPUT' : 'C:/pyqgis_scripts/data/HEATMAP.tif', 'OUTPUT_VALUE' : 0, 'PIXEL_SIZE' : 10.1, 'RADIUS' : 50, 'RADIUS_FIELD' : None, 'WEIGHT_FIELD' : None })
  • 57. • GIS 상에서 좌표변환은 매우 중요함 • 이세상에는 수많은 좌표계가 존재 함 • 단위의 변환에는 projection 과정이 필요 함 • Pyqgis에는 적절한 해법이 있음 ->osr패키지가 있음 OSR(좌표변환)
  • 58. from osgeo import ogr from osgeo import osr source = osr.SpatialReference() source.ImportFromEPSG(4326) #세계측지계 target = osr.SpatialReference() target.ImportFromEPSG(5174) #네이버좌표계 (원본하고 변환될 대상의 좌표계가 있어야한다.) -> 변환당시에 epsgcode로 서로 교환한다. Transform = osr.CoordinateTransformation(source, target) -> 어떻게 바끌건지 정의 Point = ogr.CreateGeometryFromWkt("POINT (36 128.42)") Point.Transform(transform) print(point.ExportToWkt())
  • 59. OSR로 좌표계 얻어오기 from osgeo import ogr, osr driver = ogr.GetDriverByName('ESRI Shapefile') dataset = driver.Open('C:/pyqgis_scripts/data/world_borders.shp') # from Layer layer = dataset.GetLayer() spatialRef = layer.GetSpatialRef() # from Geometry feature = layer.GetNextFeature() geom = feature.GetGeometryRef() spatialRef = geom.GetSpatialReference() print(spatialRef)