Python Console

Chạy Python script tùy chỉnh trong QGIS thông qua Agent

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

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?
  • sandbox hạn chế modules được dùng không? (vd: cấm os.system, subprocess)
  • 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:

  1. Báo lỗi kèm stack trace
  2. Đề xuất cách sửa
  3. 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:

ClassMục đích
QgsProjectQuản lý dự án hiện tại
QgsVectorLayerLayer vector
QgsRasterLayerLayer raster
QgsFeatureMột feature (đối tượng)
QgsGeometryGeometry của feature
QgsCoordinateReferenceSystemHệ tọa độ
QgsFieldCột trong bảng thuộc tính
QgsApplicationQGIS 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ảnHỏi Agent (không cần Python)
Thống kê tổng hợp theo SQLHỏi Agent với query_gis_data
Tính toán phức tạp trên geometryPython script
Tự động hóa lặp lại (batch)Python script
Truy cập Processing algorithmHỏi Agent hoặc Python script
Tạo plugin tùy chỉnhCần dev QGIS chuyên nghiệp

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

LỗiNguyên nhânCách xử lý
NameError: name 'X' is not definedThiếu importHỏi Agent “Import thư viện cần thiết”
IndexError: list index out of rangeLayer không tồn tạiKiể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âuVòng lặp lớnTODO: Có timeout không?
Permission deniedKhông có quyền ghiChạ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