INSERT INTO 테이블명(칼럼명1, 칼럼명2,..) VALUES(v1, v2,...)
1.2 예제
실습용 테이블 생성
CREATETABLE LINK (
ID SERIALPRIMARYKEY, URL VARCHAR(255)NOTNULL, NAME VARCHAR(255)NOTNULL, DESCRIPTION VARCHAR(255), REL VARCHAR(50));SELECT*FROM LINK;
id
url
name
description
rel
1개의 데이터 행 추가
INSERTINTO LINK (URL, NAME)VALUES('http://naver.com','Naver');COMMIT;SELECT*FROM LINK;
# 1. id값을 직접 전달
QgsProject.instance().removeMapLayer('ifaceLink_32ac8313_af37_4c95_a181_274d20739ec1')# 2. layer명.id() 를 인자로 전달
QgsProject.instance().removeMapLayer(node.id()))# 3. 다시 레이어 조회
QgsProject.instance().mapLayers()
item = link.getFeatures()# feature iterator 생성
feat = QgsFeature()# 빈 feature 생성
item.nextfeatrue(feat)# feat에 첫 번째 feature 값 할당
feat.geometry()# 첫번 째 feature의 geometry 조회
theFeatures = theLayer.dataProvider()# Feature를 다루는 class 할당
theFeatures.addAttributes([QgsField("ID", QVariant.Int),QgsField("Name", QVariant.String)])
레이어에 feature 추가 하기
p=QgsFeature()# 빈 feature 생성
point = QgsPointXY(-106.3463,34.9685)# 임시 Geometry 클래스 생성
p.setGeometry(QgsGeometry.fromPointXY(point))# 임시 Geometry를 p feature에 set
p.setAttributes([123,"Paul"])# 속성 정보를 p feature에 set
theFeatures.addFeatures([p])# Features class에 p를 add
theLayer.updateExtents()# 범위를 업데이트
theLayer.updateFields()# 속성정보를 업데이트
QgsProject.instance().addMapLayers([theLayer])# 레이어 로딩
# 1. postgresql 서버에 연결하여 polygon 데이터 조회하기import psycopg2
connection = psycopg2.connect(database='geospatial', user='postgres', password='qkrtkddus!1')
cursor = connection.cursor()
cursor.execute("select *, ST_AsTexT(geom) from tl_scco_ctprvn")
c = cursor.fetchall()# 2. QGIS 레이어 및 Feature 생성(속성 필드 추가)
sigungu = QgsVectorLayer('Polygon','Sigungu','memory')
sigunguFeatures = sigungu.dataProvider()
sigunguFeatures.addAttributes([QgsField("ID", QVariant.Int), QgsField("Name",QVariant.String)])# 3. QGIS 레이어에 postgresql 에서 조회해온 데이터 삽입하기for poly in c:
g=QgsGeometry.fromWkt(poly[5])# geometry 저장
p=QgsFeature()# 빈 feature 생성
p.setGeometry(g)# feature 에 geometry setting
p.setAttributes([poly[1],str(poly[3])])# feature 에 속성 setting
sigunguFeatures.addFeatures([p])# features 변수에 feature 추가
sigungu.updateExtents()# 범위를 업데이트
sigungu.updateFields()# 속성정보를 업데이트
QgsProject.instance().addMapLayers([sigungu])# 레이어 로딩
7. Feature 추가, 편집, 삭제, 조회
앞선 2. 레이어 로딩하기에서 로딩한 Node 데이터로 예제 진행
레어어에 가능한 작업 리스트 확인
node.dataProvider().capabilitiesString()
'객체 추가, 객체 삭제, 속성 값 변경, 속성 추가, 속성 삭제, 속성 이름 바꾸기, 공간 인덱스 생성, 속성 인덱스 생성, ID로 빠른 객체 접근, 도형 변경'
7.1 Feature 추가
새로운 Node 1개 추가
feat = QgsFeature(node.fields())
feat.setAttribute('NODE_ID',99999999999)
feat.setAttribute('NODE_TYPE',1)# 또는 위의 코드를 아래와 같이 한줄로 표현 가능# feat.setAttributes([999999999999, 1 , ...속성값들])
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(221689.09,462751.59)))
node.dataProvider().addFeatures([feat])
추가 전
추가 후
7.2 Feature 삭제
차선이 1개인 링크 삭제
deleteList =[]for x in link.getFeatures():if x["LANES"]==1:
deleteList.append(x.id())
link.dataProvider().deleteFeatures(deleteList)
삭제 전
삭제 후
7.3 Feature 편집
'서울외곽순환고속도로' 링크를 '수도권제1순환고속도로'로 명칭 변경
for x in link.getFeatures():if x['ROAD_NAME']=='서울외곽순환고속도로':
link.dataProvider().changeAttributeValues({x.id():{7:'수도권제1순환고속도로'}})
변경 전
변경 후
7.4 Feature 선택(수식 이용)
도로번호가 1이면서 도로명이 '경부고속도로인 링크 선택하기
link.selectByExpression("ROAD_NO=1 and ROAD_NAME='경부고속도로'")
변경 전
변경 후
8. Toolbox
8.1 Toolbox 사용하기
사용 가능한 Toolbox 기능 리스트 확인하기
QgsApplication.processingRegistry().algorithms() : 사용 가능한 알고리즘 전체 객체 리스트
alg.provider().name() : 알고리즘 provider 이름
alg.name() : 알고리즘 이름
alg.displayName() : 알고리즘 표시 이름
from qgis import processing
for alg in QgsApplication.processingRegistry().algorithms():print("{}:{} --> {}".format(alg.provider().name(), alg.name(), alg.displayName()))
GDAL:aspect --> 경사 방향
GDAL:assignprojection --> 투영체 적용
GDAL:buffervectors --> 벡터 버퍼
GDAL:buildvirtualraster --> 가상 래스터 생성
GDAL:buildvirtualvector --> 가상 벡터 생성
GDAL:cliprasterbyextent --> 범위로 래스터 자르기
...
알고리즘 이름으로 찾기
[x.id()for x in QgsApplication.processingRegistry().algorithms()if"buffer"in x.id()]
버퍼 (native:buffer)
이 알고리즘은 고정 또는 동적 거리를 사용해서 입력 레이어의 모든 객체에 대해 버퍼 영역을 계산합니다.
둥근 오프셋을 생성하는 경우 선분 파라미터가 사분원을 비슷하게그리는 데 사용할 라인 선분의 개수를 제어합니다.
선끝(end cap) 스타일 파라미터는 버퍼 내부에서 라인 끝부분을 어떻게 처리할지 제어합니다.
결합 스타일 파라미터는 오프셋이 라인의 모서리에 적용될 경우 결합 부위를 둥글게(round) 할지, 마이터(miter)로 할지, 비스듬하게(bevel) 할지 지정합니다.
마이터 제한 파라미터는 마이터 결합 스타일에만 적용할 수 있으며, 마이터 결합 부위를 생성하는 경우 사용할 오프셋 곡선으로부터의 최대 거리를 제어합니다.
----------------
Input parameters
----------------
INPUT: 입력 레이어
Parameter type: QgsProcessingParameterFeatureSource
Accepted data types:
- str: 레이어 ID
- str: 레이어 이름
- str: 레이어 원본
- QgsProcessingFeatureSourceDefinition
- QgsProperty
- QgsVectorLayer
DISTANCE: 거리
Parameter type: QgsProcessingParameterDistance
Accepted data types:
- int
- float
- QgsProperty
SEGMENTS: 선분
반올림한 오프셋을 생성하는 경우, 선분 파라미터가 사분원을 근사치로 계산하기 위해 사용할 라인 선분의 개수를 제어합니다.
Parameter type: QgsProcessingParameterNumber
Accepted data types:
- int
- float
- QgsProperty
END_CAP_STYLE: 선끝 스타일
Parameter type: QgsProcessingParameterEnum
Available values:
- 0: 둥글게
- 1: 평평하게
- 2: 정사각형
Accepted data types:
- int
- str: int를 표현하는 문자열, 예. '1'
- QgsProperty
JOIN_STYLE: 이음새 스타일
Parameter type: QgsProcessingParameterEnum
Available values:
- 0: 둥글게
- 1: 마이터(miter)
- 2: 비스듬하게(bevel)
Accepted data types:
- int
- str: int를 표현하는 문자열, 예. '1'
- QgsProperty
MITER_LIMIT: 마이터 제한
Parameter type: QgsProcessingParameterNumber
Accepted data types:
- int
- float
- QgsProperty
DISSOLVE: 결과물 디졸브
Parameter type: QgsProcessingParameterBoolean
Accepted data types:
- bool
- int
- str
- QgsProperty
OUTPUT: 산출물
Parameter type: QgsProcessingParameterFeatureSink
Accepted data types:
- str: 대상 벡터 파일, 예. 'd:/test.shp'
- str: 임시 메모리 레이어에 결과를 저장하는 'memory :'
- str: 벡터 공급자 ID 접두사 및 대상 URI 사용, 예. PostGIS 테이블에 결과를 저장하는 'postgres:…'
- QgsProcessingOutputLayerDefinition
- QgsProperty
----------------
Outputs
----------------
OUTPUT: <QgsProcessingOutputVectorLayer>
산출물
알고리즘 사용하기(buffer)
result = processing.run("native:buffer",{'INPUT':'mNode','DISTANCE':10,'SEGMENTS':5,'END_CAP_STYLE':0,'JOIN_STYLE':0,'MITER_LIMIT':2,'DISSOLVE':False,'OUTPUT':'memory:'})
QgsProject.instance().addMapLayer(result['OUTPUT'])
-- ㄱ) 인라인 뷰SELECT*FROM PRODUCT A,(SELECTAVG(PRICE)AS AVG_PRICE FROM PRODUCT ) B
WHERE A.PRICE > B.AVG_PRICE;-- ㄴ) 스칼라 서브 쿼리SELECT*,(SELECTAVG(PRICE)FROM PRODUCT)AS AVG_PRICE
FROM PRODUCT A
WHERE A.PRICE > A.AVG_PRICE
-- ㄷ) 중첩 서브 쿼리SELECT*FROM PRODUCT
WHERE PRICE >(SELECTAVG(RENTAL_RATE)FROM PRODUCT)
3. 서브 쿼리 연산자
서브 쿼리 결과가 1건 이상일 때 사용하는 연산자
종류
이름
내용
ANY
서브 쿼리 결과 중 하나라도 만족하면 조건 성립
ALL
서브 쿼리 결과의 모든 값이 만족해야 조건 성립
IN
서브 쿼리 결과에 포함되는지 확인
EXISTS
서브 쿼리 결과에 특정 집합이 존재하는지 확인
3.1 ANY 연산자
서브 쿼리 결과 중 하나라도 만족하면 조건 성립
예제 1)
영화 분류별 최대 상영시간 집합 추출
상영시간이 상기 집합 중 하나라도 크거나 같은 영화 출력
SELECT TITLE, LENGTH FROM FILM
WHERE LENGTH >=ANY(SELECTDISTINCTMAX(LENGTH)FROM FILM A INNERJOIN FILM_CATEGORY B
ON A.FILM_ID = B.FILM_ID
GROUPBY B.CATEGORY_ID
)-- 서브 쿼리 결과 집합은-- 178, 181, 183, 184, 185 이다.-- LENGTH가 상기 집합 중 하나의 값 만이라도 크거나 같으면 참-- 180의 경우 178보다 크므로 참-- 170의 경우 아무 데이터도 크지 않으므로 거짓
예제 2)
영화 분류별 최대 상영시간 집합 추출
상영시간이 상기 집합 중 하나라도 같은 영화 출력
= ANY의 경우 IN과 같다.
SELECT TITLE, LENGTH FROM FILM
WHERE LENGTH =ANY(SELECTDISTINCTMAX(LENGTH)FROM FILM A INNERJOIN FILM_CATEGORY B
ON A.FILM_ID = B.FILM_ID
GROUPBY B.CATEGORY_ID
)-- 서브 쿼리 결과 집합은-- 178, 181, 183, 184, 185 이다.-- LENGTH가 상기 집합 중 하나의 값 만이라도 같으면 참-- 178의 경우 178과 동일하므로 참-- 179의 경우 같은 데이터가 없으므로 거짓
3.2 ALL 연산자
서브 쿼리 결과의 모든 값이 만족해야 조건 성립
예제 1)
영화 분류별 최대 상영시간 집합 추출
상영시간이 상기 집합의 모든 데이터 보다 크거나 같은 영화 출력
SELECT TITLE, LENGTH FROM FILM
WHERE LENGTH >=ALL(SELECTDISTINCTMAX(LENGTH)FROM FILM A INNERJOIN FILM_CATEGORY B
ON A.FILM_ID = B.FILM_ID
GROUPBY B.CATEGORY_ID
)-- 서브 쿼리 결과 집합은-- 178, 181, 183, 184, 185 이다.-- LENGTH가 상기 집합의 모든 데이터보다 크거나 같으면 참-- 185의 경우 모든 데이터 보다 크거나 같으므로 참-- 180의 경우 178보다 크지만 181보다 작으므로 거짓
3.3 EXISTS 연산자
서브 쿼리 결과에 특정 집합이 존재하는지 확인
동작 중 조건에 만족하는 데이터 발견 시 동작을 멈추므로 속도 빠름
예제 1)
고객중에서 11불을 초과한 지불내역이 있는 고객 추출
SELECT FIRST_NAME, LAST_NAME
FROM CUSTOMER C
WHEREEXISTS(SELECT1FROM PAYMENT P
WHERE P.CUSTOMER_ID = C.CUSTOMER_ID
AND P.AMOUNT >11)ORDERBY FIRST_NAME, LAST_NAME;
one = nmtif.GetRasterBand(1).ReadAsArray()
two = nmtif.GetRasterBand(2).ReadAsArray()
three = nmtif.GetRasterBand(3).ReadAsArray()print(str(one[1100,1100])+","+str(two[1100,1100])+","+str(three[1100,1100]))
216,189,157
특정 band 평균, 표준편차 얻기
one = nmtif.GetRasterBand(1)
one.ComputeBandStats()
import json
from shapely.geometry import mapping, shape
jData = json.loads('{"type":"Polygon","coordinates":[[[1,1],[1,3],[3,3]]]}')
p = shape(jData)
p