벡터 데이터는 피쳐(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 타입의 객체들이 배열로 저장됩니다.