import networkx as nx from qgis.core import ( QgsProject, QgsField, QgsSpatialIndex, QgsFeature, QgsGeometry, QgsPointXY ) from PyQt5.QtCore import QVariant
layer = iface.activeLayer() if not layer or layer.geometryType() != 2: raise Exception("請選取一個多邊形圖層")
# 新增 color_id 欄位 layer.startEditing() if 'color_id' not in [f.name() for f in layer.fields()]: layer.dataProvider().addAttributes([QgsField('color_id', QVariant.Int)]) layer.updateFields()
# 建立要素快取與空間索引 features = {f.id(): f for f in layer.getFeatures()} index = QgsSpatialIndex() for feat in features.values(): index.insertFeature(feat)
# 建立鄰接圖 G = nx.Graph() for fid, feat in features.items(): G.add_node(fid) neighbor_ids = index.intersects(feat.geometry().boundingBox()) for nid in neighbor_ids: if nid != fid and feat.geometry().touches(features[nid].geometry()): G.add_edge(fid, nid)
# 自行進行貪婪著色(最多使用 4 色) coloring = {} for fid in sorted_nodes: neighbor_colors = {coloring[n] for n in G.neighbors(fid) if n in coloring} for color in range(1, 5): # 限定四色 if color not in neighbor_colors: coloring[fid] = color break
# 寫入 color_id field_idx = layer.fields().indexFromName('color_id') for fid, color in coloring.items(): layer.changeAttributeValue(fid, field_idx, color)