# Skrip 4.2b: simbologi raster. Peta tinggi (DTM) diberi skala warna, lalu dibuat versi bayangan bukit
from qgis.core import (QgsProject, QgsRasterLayer, QgsStyle, QgsColorRampShader,
                       QgsRasterShader, QgsSingleBandPseudoColorRenderer, QgsHillshadeRenderer, Qgis)

FOLDER = r"D:/KPH_Contoh"   # ganti dengan folder kerja Anda

dtm = QgsRasterLayer(FOLDER + "/DTM_Drone.tif", "DTM_Drone")
assert dtm.isValid(), "Raster tidak terbaca: " + FOLDER + "/DTM_Drone.tif"
statistik = dtm.dataProvider().bandStatistics(1)
print("Tinggi terendah %.1f m, tertinggi %.1f m" % (statistik.minimumValue, statistik.maximumValue))

# 1. Pseudocolor: tiap rentang tinggi diberi warna dari skala Viridis
fungsi = QgsColorRampShader(statistik.minimumValue, statistik.maximumValue)
fungsi.setSourceColorRamp(QgsStyle.defaultStyle().colorRamp("Viridis"))
fungsi.setClassificationMode(Qgis.ShaderClassificationMethod.EqualInterval)
fungsi.classifyColorRamp(5)                       # 5 kelas warna sama lebar
bayangan_warna = QgsRasterShader()
bayangan_warna.setRasterShaderFunction(fungsi)
dtm.setRenderer(QgsSingleBandPseudoColorRenderer(dtm.dataProvider(), 1, bayangan_warna))
print("Kelas warna:", [(round(i.value, 1), i.color.name()) for i in fungsi.colorRampItemList()])

# 2. Hillshade (bayangan bukit) pada salinan layer: arah cahaya 315 derajat, tinggi matahari 45 derajat
bukit = QgsRasterLayer(FOLDER + "/DTM_Drone.tif", "DTM_Bayangan")
bukit.setRenderer(QgsHillshadeRenderer(bukit.dataProvider(), 1, 315, 45))
print("Renderer bukit:", bukit.renderer().type())

QgsProject.instance().addMapLayer(dtm)
QgsProject.instance().addMapLayer(bukit)
