pyQGIS Tip

특정 Feature를 확대하기

아래의 코드는 선택된 Feature를 확대합니다.

canvas = iface.mapCanvas()
id = 0
#canvas.setSelectionColor(QColor("red"))
layer.select(id)
canvas.zoomToSelected(layer)

아래의 코드는 Feature를 선택하지 않고 FID가 0인 Feature를 확대합니다.

canvas = iface.mapCanvas()
id = 0
feat = layer.getFeature(id)
geom = feat.geometry()
bbox = geom.boundingBox()
canvas.setExtent(bbox)
canvas.refresh()

특정 Feature를 깜박이게 하기

canvas = iface.mapCanvas()
id = 0
canvas.flashFeatureIds(layer, [id])

화면 좌표와 지도 좌표 간의 변환

아래의 코드는 화면 좌표 (100, 20)을 지도 좌표로 변환하고 다시 변환된 지도 좌표를 화면 좌표로 변환하는 코드입니다.

ptView = QPoint(100, 20)
ptMap = canvas.getCoordinateTransform().toMapCoordinates(ptView)
print(ptMap.x(), ptMap.y())

ptMap2 = QgsMapTool(canvas).toCanvasCoordinates(ptMap)
print(ptMap2.x(), ptMap2.y())

다양한 형태의 지오메트리 생성

좌표를 지정해서 다양한 형태의 지오메트리를 생성하는 코드입니다.

geomPoint = QgsGeometry.fromPointXY(QgsPointXY(10000, 15000))

geomMultiPoint = QgsGeometry.fromMultiPointXY(
    [
        QgsPointXY(10000, 15000),
        QgsPointXY(11000, 16000),
    ]
)

geomPolyline = QgsGeometry.fromPolylineXY(
    [
        QgsPointXY(10000, 15000),
        QgsPointXY(11000, 16000),
        QgsPointXY(12000, 17000),
        QgsPointXY(13000, 18000),
    ]
)

geomPolyline = QgsGeometry.fromMultiPolylineXY(
    [
        [
            QgsPointXY(10000, 15000),
            QgsPointXY(11000, 16000),
            QgsPointXY(12000, 17000),
            QgsPointXY(13000, 18000),
        ]
    ]
)

pX = 971195
pY = 1841488

geomPolygon = QgsGeometry.fromPolygonXY(
    [
        [
            QgsPointXY(pX, pY),
            QgsPointXY(pX+1000, pY),
            QgsPointXY(pX+1000, pY+1000),
            QgsPointXY(pX, pY+1000),
        ],
        [
            QgsPointXY(pX+100, pY+100),
            QgsPointXY(pX+900, pY+100),
            QgsPointXY(pX+900, pY+900),
            QgsPointXY(pX+100, pY+900),
        ]
    ]
)

geomPolygon = QgsGeometry.fromMultiPolygonXY(
    [
        [
            [
                QgsPointXY(pX, pY),
                QgsPointXY(pX+1000, pY),
                QgsPointXY(pX+1000, pY+1000),
                QgsPointXY(pX, pY+1000),
            ],
            [
                QgsPointXY(pX+100, pY+100),
                QgsPointXY(pX+900, pY+100),
                QgsPointXY(pX+900, pY+900),
                QgsPointXY(pX+100, pY+900),
            ]
        ]
    ]
)

아래는 Python 언어의 특징을 이용한 효율적인 코드 작성입니다.

pts = [
    (583899.8, 8177297.19), 
    (583900.23, 8177262.52), 
    (583896.49, 8177262.47), 
    (583895.96, 8177297.29), 
    (583899.8, 8177297.19)
]

geomPolygon = QgsGeometry.fromPolygonXY( [[ QgsPointXY( xy[0], xy[1] ) for xy in pts ]] ) 

“pyQGIS Tip”에 대한 2개의 댓글

  1. 안녕하세요 pyqgis 관심이 많은데 한가지 여쭤 보고 싶은게 잇어서요

    qgis에서 폴리곤끼리 병합(디졸브형태)을 한다고 가정했을때 (상황은 아래에 설명하겠습니다)

    병합할 상황
    두 개의 폴리곤이 서로 선을 맞닿고 있는 상황이라면 랜덤으로 병합이 되고 안되고 그런상황이 발생합니다.

    (추측> 언어에서나 컴퓨터에서 부동소수점 인식 때문에 선끼리 맞닿는 좌표값이 다르게 읽혀서 제대로 병합 처리가 안되서 그런것)
    이 추측마저 맞는지 틀린지 일단 이 부분에 대해서도 혹시 아시는 부분이 잇으신지 궁금합니다 ㅜ

    아크에서는 소수점끼리 약간의 보정값이 알아서 잘 들어가서 병합이 잘 되엇던 것 같습니다.

    그래서 이부분을 pyqgis 이용해 수학적이든 다른 방법이든 해결을 해보고 싶은데
    혹시 디졸브의 알고리즘 원리를 찾으려면 어디서 찾을수 있을까 해서 여쭤봅니다
    감사합니다..

    1. 안녕하세요, 병합하고자 하는 2개의 폴리곤이 아주 미세하게 맞닿은 척…(?)할 병합되지 않아야 하는데… 너무 미세하게 가까워 병합되는 경우가 발생하는듯합니다. 컴퓨터가 2진수 기반이니 이런 오차는 어쩔 수 없는 것일테구요. 간단하게 해결될 문제는 아니고… 병합 연산 전에 도형에 대한 전처리가 필요할듯합니다.

김 형준에 답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다