새로운 벡터 데이터 파일을 생성하는 코드를 순차적으로 나열하면 먼저 필드를 정의합니다.
QgsProject.instance().removeAllMapLayers() fields = QgsFields() fields.append(QgsField("id", QVariant.Int)) fields.append(QgsField("name", QVariant.String)) fields.append(QgsField("value", QVariant.Double))
그리고 생성할 SHP 파일명을 지정하고 Writer 객체를 생성합니다. 속성 문자셋은 UTF-8로 지정했고 지오메트리 타입은 Point로 지정했습니다. 좌표계는 EPSG:5179입니다.
fileName = "D:/__Data__/new_point.shp" writer = QgsVectorFileWriter( fileName, "UTF-8", fields, QgsWkbTypes.Point, QgsCoordinateReferenceSystem("EPSG:5179"), "ESRI Shapefile" )
이 Writer 객체를 통해 피쳐를 기록할 수 있고 피쳐를 기록하는 코드를 함수로 작성해 둡니다.
def createFeature(x, y, attributes): feat = QgsFeature() geom = QgsGeometry.fromPointXY(QgsPointXY(x, y)) feat.setGeometry(geom) feat.setAttributes(attributes) return feat
위의 함수를 사용하여 4개의 피쳐를 기록합니다.
writer.addFeature(createFeature(971195, 1841488, [1, "김형준", 10.21])) writer.addFeature(createFeature(971295, 1841488, [2, "홍길동", 20.31])) writer.addFeature(createFeature(971195, 1841588, [3, "일지매", 25.16])) writer.addFeature(createFeature(971295, 1841588, [4, "임꺽정", 17.54]))
생성된 SHP 파일을 Close하기 위해 다음 코드를 추가합니다.
del(writer)
이제 생성된 SHP 파일을 레이어로 추가합니다.
layer = QgsVectorLayer(fileName, "새로운 레이어", "ogr") QgsProject.instance().addMapLayers([layer])
결과는 다음과 같습니다.
SHP 파일의 속성 값의 경우 Length와 Precision 값을 지정할 수 있는데, 위의 코드 중 필드를 추가하는 코드를 다음과 같이 Length와 Precision과 함께 처리가 가능합니다.
fields.append(QgsField("id", QVariant.Int, None, 5)) fields.append(QgsField("name", QVariant.String, None, 40)) fields.append(QgsField("value", QVariant.Double, None, 10, 4))