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