pyQGIS를 이용한 벡터 데이터 처리 3 : 속성 및 좌표 얻기

벡터 데이터는 피쳐(Feature)라는 항목들로 구성되며 피쳐는 속성과 좌표로 정의됩니다. 벡터 데이터를 구성하는 피쳐에 대한 속성과 좌표를 얻는 코드를 살펴보겠습니다.

먼저 벡터 데이터의 속성값에 대한 필드 정보는 얻는 코드입니다.

QgsProject.instance().removeAllMapLayers()
layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE", "ogr")
QgsProject.instance().addMapLayers([layer])

for field in layer.fields():
    print(field.name(), field.typeName(), field.length(), field.precision())

실행 결과는 다음과 같습니다.

그리고 모든 피쳐의 각 필드의 값을 얻어오는 코드는 다음과 같습니다.

QgsProject.instance().removeAllMapLayers()

layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE")
QgsProject.instance().addMapLayers([layer])

fieldNames = []
for field in layer.fields():
    fieldNames.append(field.name())

fc = layer.featureCount()
for i in range(0, fc):
    print("\nFID: ", i)
    feature = layer.getFeature(i)
    for fn in fieldNames:
        print(fn, feature[fn])
    
    if i == 5: break

먼저 필드명을 배열에 저장해 두고 각 피쳐에 대해 필드명으로 그 필드값을 얻어올 수 있습니다. 필드명이 아닌 필드의 인덱스 번호로도 필드값을 얻을 수 있습니다. 필드의 인덱스의 시작은 0입니다. 위의 코드에 대한 실행결과는 다음과 같습니다.

다음은 피쳐의 좌표를 얻어오는 코드입니다.

QgsProject.instance().removeAllMapLayers()

layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE")
QgsProject.instance().addMapLayers([layer])

fc = layer.featureCount()
for i in range(0, fc):
    feature = layer.getFeature(i)
    geometry = feature.geometry()
    # print(geometry.asWkt())
    geomSingleType = QgsWkbTypes.isSingleType(geometry.wkbType())
    
    if geometry.type() == QgsWkbTypes.LineGeometry:
        if geomSingleType:
            polyline = geometry.asPolyline()
            print("line:", geom)
        else:
            polyline = geometry.asMultiPolyline()
            print("multiline:", geom)
    
    if i == 5: break

실행결과는 다음과 같습니다.

지오메트리의 좌표를 뽑아내기 위해서는 Multi 여부를 확인해서 형변환(asPolyline, asMultiPolyline 등)이 필요하며 형변환된 객체에 지오메트리의 구성 좌표가 QgsPointXY 타입의 객체들이 배열로 저장됩니다.

pyQGIS를 이용한 벡터 데이터 처리 2 : 레이어 추가 및 삭제

SHP 파일 등과 같은 벡터 데이터를 레이어로 추가하는 코드는 다음과 같습니다.

layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE")
QgsProject.instance().addMapLayers([layer])

실행 결과는 다음과 같습니다. 레이어를 추가할 때 추가된 레이어가 바로 지도뷰에 꽉 차게 표시하기 위한 코드는 다음과 같습니다.

canvas = iface.mapCanvas()
extent = layer.extent()
canvas.setExtent(extent)

추가한 레이어에 대한 객체를 얻는 코드는 다음과 같습니다.

layers = QgsProject.instance().mapLayersByName("TL_SPRD_MANAGE")
print(len(layers), layers[0].name())

레이어의 이름으로 객체를 얻는 것인데, 레이어의 이름은 중복될 수 있으므로 동일한 이름이라도 여러개의 레이어 객체가 참조 될 수 있습니다.

추가한 레이어를 삭제하는 코드는 다음과 같습니다.

layers = QgsProject.instance().mapLayersByName("TL_SPRD_MANAGE")
QgsProject.instance().removeMapLayer(layers[0].id())

레이어의 이름은 중복될 수 있으므로 실제 삭제 시에는 레이어의 ID 값을 지정하여 삭제해야 합니다.

추가된 모든 레이어를 삭제하는 코드는 다음과 같습니다.

QgsProject.instance().removeAllMapLayers()