Trước hết, cảm ơn tất cả các câu trả lời và ý kiến. Thật không may, các công cụ hiện có không tương thích hoàn toàn với các phiên bản mới nhất của QGIS và ArcGIS. Do đó, tôi đã thực hiện giải pháp của riêng mình bằng công cụ được chỉ định bởi @polygeo, plugin QGIS từ @Alexandre và tên của thuật toán (bản đồ bốn màu) từ @Jens.
Đây là mã của tôi cho những người quan tâm (đối với ArcGIS nhưng phần thứ hai cũng có thể được sử dụng trong 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)
Lưu ý rằng thuật toán không đảm bảo rằng chỉ có 4 màu được sử dụng: mặc dù đã được chứng minh rằng giải pháp tồn tại, "lực lượng vũ phu" là cần thiết để đạt được nó. Trong trường hợp của tôi, tôi có 7 màu đủ nhỏ. Kịch bản có thể có một vòng lặp bổ sung cho đến khi tìm thấy giải pháp, nhưng tôi cần thực hiện nó cho hàng trăm bản đồ và 7 màu là OK.