ก่อนอื่นขอขอบคุณสำหรับคำตอบและความคิดเห็นทั้งหมด น่าเสียดายที่เครื่องมือที่มีอยู่ไม่สามารถใช้งานร่วมกับ QGIS และ ArcGIS เวอร์ชันล่าสุดได้อย่างสมบูรณ์ ดังนั้นฉันจึงสร้างโซลูชันของตัวเองโดยใช้เครื่องมือที่ระบุโดย @polygeo, ปลั๊กอิน QGIS จาก @Alexandre และชื่อของอัลกอริทึม (แผนที่สี่สี) จาก @Jens
นี่คือรหัสของฉันสำหรับผู้ที่สนใจ (สำหรับ ArcGIS แต่ส่วนที่สองสามารถใช้ใน QGIS ได้เช่นกัน)
arcpy.MakeFeatureLayer_management(fc, fc[:-4]+ "_lyr" )
try:
arcpy.AddField_management(fc[:-4] + "_lyr", "color", "SHORT")
except:
print "field alread exists"
arcpy.CalculateField_management(fc[:-4] + "_lyr", "color", "10" , "PYTHON")
arcpy.PolygonNeighbors_analysis(fc[:-4] + "_lyr", fc[:-4] + "_tb.dbf" )
graph = []
cursor=arcpy.da.SearchCursor( fc[:-4] + "_tb.dbf" , ("src_FID","nbr_FID") )
for row in cursor:
graph.append(row)
pols = arcpy.da.UpdateCursor(fc[:-4] + "_lyr", ("OID@","color"))
colored = []
for pol in pols:
nbrs = [ second for first, second in graph if first == pol[0]]
usedcolors = []
for nbr in nbrs:
usedcolors += [second for first, second in colored if first == nbr]
pol[1]=[color for color in range(10) if color not in usedcolors][0]
colored.append(pol)
pols.updateRow(pol)
โปรดทราบว่าอัลกอริทึมไม่ได้รับประกันว่ามีการใช้สีเพียง 4 สี: แม้ว่าจะได้รับการพิสูจน์แล้วว่ามีวิธีแก้ปัญหาอยู่ก็ตาม แต่ "กำลังดุร้าย" นั้นจำเป็นต่อการบรรลุ ในกรณีของฉันฉันมี 7 สีซึ่งเล็กพอ สคริปต์อาจมีการวนซ้ำเพิ่มเติมจนกว่าจะพบวิธีแก้ไขปัญหา แต่ฉันต้องทำสำหรับแผนที่นับร้อยและ 7 สีก็โอเค