Tạo, sửa, xuất dữ liệu

Agent giúp bạn tạo layer mới, chỉnh sửa dữ liệu, và xuất ra nhiều định dạng

T
Tác giả TLGeo
Thời gian đọc 6 min read
Đăng tải 2025-01-01

Tạo, sửa, xuất dữ liệu

Ngoài việc xem và phân tích, bạn còn cần tạo mới, chỉnh sửa, và xuất dữ liệu trong QGIS. TLGeo Agent hỗ trợ hầu hết các tác vụ này thông qua Python script (xem Bài 10: Python Console) và một số tool trực tiếp.

Tính năng QGIS gốc: https://docs.qgis.org/3.44/en/docs/about/features.html#create-edit-manage-and-export-data

⚠️ TODO quan trọng: Nhiều tác vụ trong bài này hiện chưa có tool riêng trong Agent. Agent sẽ tự động dùng execute_qgis_python_script để thực hiện. Bạn nên xác nhận lại với team dev về các tool cần bổ sung.

Tạo layer mới

Tạo Shapefile/GeoPackage

Agent sẽ tự động sinh Python script để tạo layer mới:

Tạo một shapefile polygon mới tên "ranh_gioi_moi" trong thư mục /data/

Code được sinh:

from qgis.core import QgsVectorLayer, QgsVectorFileWriter, QgsWkbTypes

# Tạo layer polygon trong bộ nhớ
layer = QgsVectorLayer('Polygon?crs=epsg:4326', 'ranh_gioi_moi', 'memory')
provider = layer.dataProvider()

# Thêm field
provider.addAttributes([
    QgsField('ten', QMetaType.Type.QString),
    QgsField('dien_tich', QMetaType.Type.Double)
])
layer.updateFields()

# Lưu ra file
QgsVectorFileWriter.writeAsVectorFormat(
    layer, '/data/ranh_gioi_moi.shp', 'utf-8',
    layer.crs(), 'ESRI Shapefile'
)

Tạo GeoPackage với schema

Tạo GeoPackage tên "du_an_rung.gpkg" với 2 layer: "lo_rung" (polygon) và "diem_quan_trac" (point)

Tạo layer từ kết quả query

Tạo layer mới từ kết quả: tất cả lô rừng có diện tích > 100 ha ở tỉnh Lâm Đồng

Chỉnh sửa dữ liệu

Thêm feature mới

Thêm một điểm vào layer "diem_quan_trac" tại tọa độ 108.2, 16.0 với tên "Trạm 1"

Code được sinh:

layer = QgsProject.instance().mapLayersByName('diem_quan_trac')[0]
feature = QgsFeature(layer.fields())
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(108.2, 16.0)))
feature['ten'] = 'Trạm 1'
layer.dataProvider().addFeature(feature)

Sửa thuộc tính

Đổi tên thửa đất số 123 thành "Thửa A1"
Cập nhật trạng thái của các lô rừng đã chọn thành "đã kiểm tra"

Xóa feature

Xóa tất cả feature đang được chọn
Xóa các lô rừng có diện tích = 0 trong layer X

Thêm cột mới (Field)

Thêm cột "dien_tich_ha" kiểu Double vào layer "lo_rung"

Field Calculator (Tính giá trị cột)

Tính cột "dien_tich_ha" = diện tích geometry / 10000 cho tất cả feature

Code được sinh:

layer = QgsProject.instance().mapLayersByName('lo_rung')[0]
with edit(layer):
    for feature in layer.getFeatures():
        feature['dien_tich_ha'] = feature.geometry().area() / 10000
        layer.updateFeature(feature)

Georeferencer

Georeferencer gán thông tin tọa độ cho ảnh raster (ví dụ: ảnh quét bản đồ cũ).

Mở Georeferencer

Mở Georeferencer và load ảnh tại /data/ban_do_1990.jpg

Thêm điểm GCP

Thêm 4 điểm GCP tại 4 góc ảnh với tọa độ tương ứng

Chạy georeference

Chạy georeference với phép biến đổi Polynomial bậc 1, lưu ra /data/ban_do_1990_georef.tif

GPS / GPX

Import file GPX

Import file GPX tại /data/track_2024.gpx vào dự án

Code được sinh:

layer = QgsVectorLayer('/data/track_2024.gpx?type=track', 'track_2024', 'ogr')
if layer.isValid():
    QgsProject.instance().addMapLayer(layer)

Export sang GPX

Export layer "track_hiking" ra file GPX tại /data/output/

OpenStreetMap

Tải dữ liệu OSM

Tải dữ liệu OpenStreetMap cho khu vực Hà Nội, lưu vào GeoPackage

Lưu ý: Có thể cần QuickOSM plugin hoặc Overpass API. TODO: Xác nhận flow này với team dev.

Xuất dữ liệu

Export ra Shapefile

Export layer "lo_rung" ra shapefile tại /data/output/lo_rung_2024.shp

Export ra GeoPackage

Export layer "lo_rung" vào file GeoPackage "ket_qua.gpkg"

Export sang DXF (cho AutoCAD)

Export layer "ranh_gioi" ra file DXF, giữ nguyên style

Lưu ý: DXF-Export có nhiều tùy chọn nâng cao trong QGIS, bạn nên dùng QGIS UI cho tác vụ này.

Lưu ảnh screenshot có georeference

Chụp ảnh bản đồ hiện tại và lưu thành file GeoTIFF có georeference

Quản lý thuộc tính

Đổi tên cột

Đổi tên cột "DT" thành "dien_tich" trong layer X

Đổi kiểu dữ liệu

Đổi kiểu cột "dien_tich" từ String sang Double

Xóa cột

Xóa cột "ghi_chu_cu" trong layer X

DB Manager

DB Manager giúp kết nối tới các database như PostGIS, SpatiaLite, MS SQL Spatial, Oracle Spatial.

Kết nối PostGIS

Kết nối tới PostGIS database với host=localhost port=5432 dbname=gis user=admin

Import shapefile vào PostGIS

Import shapefile /data/lo_rung.shp vào PostGIS table "lo_rung"

Chạy SQL trên PostGIS

SELECT tinh_thanh, SUM(dien_tich) FROM lo_rung GROUP BY tinh_thanh

💡 Tool query_gis_data (xem Bài 11) cũng hỗ trợ SQL trên PostGIS.

Workflow mẫu: Tự động hóa chỉnh sửa

Agent có thể kết hợp nhiều tác vụ thành workflow tự động:

Case 1: Chuẩn hóa dữ liệu

Workflow:
1. Import shapefile /data/raw/lo_rung_2023.shp
2. Reproject sang EPSG:4326
3. Thêm cột "dien_tich_ha" và tính từ geometry
4. Chuẩn hóa cột "loai_rung" về chữ thường
5. Xóa các feature có geometry không hợp lệ
6. Lưu vào /data/processed/lo_rung_2023_clean.gpkg

Case 2: Cập nhật dữ liệu hàng loạt

Cập nhật tất cả feature có cột "trang_thai" = "Cũ" thành "Cần cập nhật"

Case 3: Merge dữ liệu từ nhiều nguồn

Merge 5 shapefile trong /data/2024/ thành 1 layer duy nhất, lưu vào GeoPackage

Best Practices

1. Luôn backup trước khi sửa hàng loạt

Backup layer "lo_rung" ra file /backup/lo_rung_backup_2024.shp trước khi chỉnh sửa

2. Test trên tập nhỏ trước

Chạy thử trên 10 feature đầu tiên trước khi áp dụng cho toàn bộ

3. Validate sau khi sửa

Sau khi thêm cột mới, kiểm tra tất cả feature có giá trị hợp lệ

4. Dùng Field Calculator qua Python

Với tính toán phức tạp, Python cho phép xử lý linh hoạt hơn Field Calculator UI.

Lỗi thường gặp & cách xử lý

LỗiNguyên nhânCách xử lý
”Layer is read-only”Layer đang ở chế độ chỉ đọcBỏ read-only hoặc tạo bản sao
”Field already exists”Tên cột bị trùngDùng tên khác
”Geometry invalid”Dữ liệu có lỗi hình họcDùng Geometry Checker plugin
”CRS mismatch”Layer có CRS khác nhauReproject trước khi merge
”Permission denied”Không có quyền ghiĐổi thư mục output hoặc chạy admin
”File format not supported”Định dạng không phù hợpKiểm tra GDAL/OGR drivers

TODO cần bạn xác nhận

  • Nên phát triển tool riêng cho các tác vụ này, hay tiếp tục dùng Python script?
  • Có cần UI confirm trước khi xóa/sửa hàng loạt không?
  • Workflow nào phổ biến nhất cần ưu tiên?
  • Có tích hợp với Field Calculator UI không?

Liên kết