Python Console
QGIS có một Python Console tích hợp sẵn cho phép bạn tự động hóa mọi thứ. TLGeo Agent cho phép bạn viết script bằng tiếng Việt và Agent sẽ dịch sang Python, sau đó chạy script đó trong QGIS của bạn thông qua tool execute_qgis_python_script.
Tính năng QGIS gốc: https://docs.qgis.org/3.44/en/docs/about/features.html#python-console
Khi nào cần dùng Python Console?
Bạn không cần dùng Python cho hầu hết các tác vụ thường ngày. Agent đã có thể xử lý:
- ✅ Select, highlight, zoom (xem Bài 5)
- ✅ Thống kê cơ bản bằng SQL (xem Bài 7)
- ✅ Style, label, layout (xem Bài 5)
Bạn chỉ cần Python khi:
- ❗ Tác vụ quá phức tạp cho UI (vd: tính toán đặc biệt)
- ❗ Cần tự động hóa lặp đi lặp lại (vd: xử lý 100 file)
- ❗ Cần truy cập API chuyên sâu của QGIS (vd: gọi Processing algorithm cụ thể)
- ❗ Workflow tùy chỉnh phức tạp (vd: import → xử lý → export tự động)
Cách sử dụng
Cú pháp cơ bản
Bạn mô tả tác vụ bằng tiếng Việt, Agent sẽ tự sinh code Python và hỏi xác nhận trước khi chạy:
Chạy script Python sau trong QGIS:
[code Python của bạn hoặc để Agent tự sinh]
Ví dụ đơn giản
Yêu cầu bằng tiếng Việt:
In ra tên của tất cả layer đang mở
Agent sẽ sinh code:
for layer in QgsProject.instance().mapLayers().values():
print(layer.name())
Kết quả trong chat:
ranh_gioi_tinh
xa_phuong
lo_rung
duong_giao_thong
Ví dụ phức tạp hơn
Yêu cầu:
Tính tổng diện tích của layer ranh_gioi_huyen theo từng tỉnh
Code được sinh:
layer = QgsProject.instance().mapLayersByName('ranh_gioi_huyen')[0]
stats = {}
for feature in layer.getFeatures():
tinh = feature['tinh_thanh']
area = feature.geometry().area() / 10000 # m² -> ha
stats[tinh] = stats.get(tinh, 0) + area
for tinh, area in sorted(stats.items(), key=lambda x: -x[1]):
print(f"{tinh}: {area:,.2f} ha")
Quy tắc bảo mật
⚠️ Quan trọng: Python script có toàn quyền truy cập vào máy tính của bạn (đọc file, xóa file, kết nối mạng…). Hãy cẩn thận với script không rõ nguồn gốc.
TODO: Cần bạn xác nhận
- Agent có yêu cầu confirm trước khi chạy script không?
- Có giới hạn timeout (vd: 30 giây) không?
- Có sandbox hạn chế modules được dùng không? (vd: cấm
os.system,subprocess) - Có log lịch sử script đã chạy không?
Workflow mẫu: Tự động hóa phức tạp
Case 1: Import và reproject hàng loạt
Tự động import tất cả shapefile trong thư mục /data/raw/, reproject sang EPSG:4326, lưu vào /data/processed/
Code sẽ chạy:
import os, glob
from qgis.core import QgsVectorLayer, QgsCoordinateReferenceSystem
input_dir = '/data/raw'
output_dir = '/data/processed'
os.makedirs(output_dir, exist_ok=True)
for shp in glob.glob(f'{input_dir}/*.shp'):
layer = QgsVectorLayer(shp, os.path.basename(shp)[:-4], 'ogr')
# Reproject logic here...
Case 2: Tạo báo cáo tự động
Tự động tạo báo cáo PDF cho từng huyện trong dữ liệu, mỗi báo cáo gồm: bản đồ, bảng thống kê, biểu đồ
Case 3: Validate dữ liệu
Kiểm tra tất cả feature trong layer lô_rung có geometry hợp lệ không
layer = QgsProject.instance().mapLayersByName('lo_rung')[0]
errors = 0
for feature in layer.getFeatures():
geom = feature.geometry()
if not geom.isGeosValid():
errors += 1
print(f"Invalid: feature {feature.id()}")
print(f"Total invalid: {errors}/{layer.featureCount()}")
Debug script
Khi script bị lỗi, Agent sẽ tự động:
- Báo lỗi kèm stack trace
- Đề xuất cách sửa
- Cho phép bạn chạy lại sau khi sửa
Bạn cũng có thể yêu cầu Agent debug:
Script bị lỗi ở dòng 5, hãy xem giúp tôi
In giá trị của biến X ở giữa script để debug
Tham chiếu PyQGIS API
Để viết script hiệu quả, bạn cần biết các class chính của PyQGIS:
| Class | Mục đích |
|---|---|
QgsProject | Quản lý dự án hiện tại |
QgsVectorLayer | Layer vector |
QgsRasterLayer | Layer raster |
QgsFeature | Một feature (đối tượng) |
QgsGeometry | Geometry của feature |
QgsCoordinateReferenceSystem | Hệ tọa độ |
QgsField | Cột trong bảng thuộc tính |
QgsApplication | QGIS application instance |
Tài liệu chính thức: https://qgis.org/pyqgis/3.44/
Mẹo viết Python script hiệu quả
1. Dùng Agent để generate script
Thay vì tự viết, hãy mô tả tác vụ bằng tiếng Việt và để Agent sinh code:
Viết script Python để đếm số feature của tất cả layer vector trong dự án
2. Bắt đầu từ ví dụ đơn giản
Test từng phần nhỏ trước khi kết hợp thành workflow lớn.
3. Dùng try/except để xử lý lỗi
try:
layer = QgsProject.instance().mapLayersByName('my_layer')[0]
print(layer.featureCount())
except IndexError:
print("Layer not found!")
4. In log thường xuyên
Với script xử lý nhiều file, hãy in tiến độ:
for i, file in enumerate(files):
print(f"Processing {i+1}/{len(files)}: {file}")
# process file...
So sánh: Khi nào dùng gì?
| Tác vụ | Công cụ phù hợp |
|---|---|
| Select theo attribute đơn giản | Hỏi Agent (không cần Python) |
| Thống kê tổng hợp theo SQL | Hỏi Agent với query_gis_data |
| Tính toán phức tạp trên geometry | Python script |
| Tự động hóa lặp lại (batch) | Python script |
| Truy cập Processing algorithm | Hỏi Agent hoặc Python script |
| Tạo plugin tùy chỉnh | Cần dev QGIS chuyên nghiệp |
Lỗi thường gặp & cách xử lý
| Lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
NameError: name 'X' is not defined | Thiếu import | Hỏi Agent “Import thư viện cần thiết” |
IndexError: list index out of range | Layer không tồn tại | Kiểm tra tên layer chính xác |
AttributeError: 'NoneType' object has no attribute 'X' | Feature thiếu giá trị | Thêm if feature['X'] is not None |
TypeError: unsupported operand type(s) | Sai kiểu dữ liệu | Ép kiểu: int(), float(), str() |
| Script chạy quá lâu | Vòng lặp lớn | TODO: Có timeout không? |
| Permission denied | Không có quyền ghi | Chạy với quyền admin hoặc đổi thư mục |
Ví dụ nâng cao
Tạo heatmap từ dữ liệu điểm
Tạo heatmap từ các điểm trong layer vi_pham, bán kính 500m
Tính khoảng cách giữa các feature liên tiếp
Tính khoảng cách giữa các trạm quan trắc liên tiếp theo thứ tự thời gian
Đồng bộ attribute từ layer này sang layer khác
Copy cột 'ten_xa' từ layer xa_phuong vào layer diem_truong dựa trên vị trí (point-in-polygon)
Export nhiều layer ra GeoPackage
Export tất cả layer trong dự án ra 1 file GeoPackage duy nhất
Liên kết
- Phân tích dữ liệu — Phân tích SQL và geoprocessing
- Khám phá bản đồ — Navigate, select, style
- Tài liệu PyQGIS chính thức — Tham chiếu API