# Buku "Python untuk GIS", Bab 28: Pola dan Improvisasi: Kerangka Siap Salin dan Cara Mengubahnya
# Pola 28.6: Ekspresi QGIS dari Python
import os
from qgis.core import (QgsVectorLayer, QgsExpression, QgsExpressionContext,
                       QgsExpressionContextUtils)

DATA = os.environ.get("PY_DATA", r"D:/Latihan")
petak = QgsVectorLayer(DATA + "/paket-b2/Petak_KPH.gpkg|layername=Petak", "Petak", "ogr")
assert petak.isValid(), "Layer tidak terbuka. Cek DATA dan nama berkas."

# Ekspresi QGIS dihitung dari Python
ekspresi = QgsExpression("round(area($geometry) / 10000, 2) || ' ha, ' || upper(\"JENIS\")")
assert not ekspresi.hasParserError(), ekspresi.parserErrorString()
konteks = QgsExpressionContext()
konteks.appendScopes(QgsExpressionContextUtils.globalProjectLayerScopes(petak))
for i, f in enumerate(petak.getFeatures()):
    konteks.setFeature(f)
    print(f["KODE_PETAK"], "->", ekspresi.evaluate(konteks))
    if i == 2:
        break

# Ekspresi yang sama untuk memilih fitur
petak.selectByExpression("\"STATUS\" = 'Rehabilitasi'")
print("Terpilih:", petak.selectedFeatureCount(), "petak")
petak.removeSelection()
