이미 저장되어 있는 피쳐의 속성과 좌표를 변경하는 코드를 살펴보겠습니다. 먼저 피쳐의 속성값을 변경하는 코드는 다음과 같습니다.
QgsProject.instance().removeAllMapLayers()
layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE", "ogr")
QgsProject.instance().addMapLayers([layer])
layer.selectByExpression('"RN_CD" = \'3251036\'')
idxField = layer.fields().indexOf('RN')
features = layer.selectedFeatures()
with edit(layer):
for f in features:
layer.changeAttributeValue(f.id(), idxField, "짱기로")
위의 코드는 먼저 RN_CD의 값이 3251036인 피쳐를 선택하고 선택된 피쳐의 RN 필드의 값을 “짱기로”로 변경하는 코드입니다.
다음은 위와 동일한 조건으로 피쳐를 선택하고 선택된 피쳐의 좌표를 편집하는 코드입니다.
QgsProject.instance().removeAllMapLayers()
layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE", "ogr")
QgsProject.instance().addMapLayers([layer])
layer.selectByExpression('"RN_CD" = \'2348142\'')
features = layer.selectedFeatures()
with edit(layer):
for f in features:
geom = QgsGeometry.fromWkt("MULTILINESTRING((968963 1820821, 993152 1819742, 993567 1844387))")
layer.changeGeometry(f.id(),geom)
벡터 데이터는 피쳐(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 타입의 객체들이 배열로 저장됩니다.