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ỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
| ”Layer is read-only” | Layer đang ở chế độ chỉ đọc | Bỏ read-only hoặc tạo bản sao |
| ”Field already exists” | Tên cột bị trùng | Dùng tên khác |
| ”Geometry invalid” | Dữ liệu có lỗi hình học | Dùng Geometry Checker plugin |
| ”CRS mismatch” | Layer có CRS khác nhau | Reproject 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ợp | Kiể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?