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 타입의 객체들이 배열로 저장됩니다.

답글 남기기

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