如何自动在ArcGIS / ArcToolBox中的多边形地图中应用四种颜色定理?


19

我需要以多边形的形式应用四种颜色定理,而无需手动选择每种颜色来放入每个区域。我想知道是否可以与ArcGIS和ArcToolBox一起使用任何扩展名,插件,脚本或数据库,以数学或编程方式来进行此操作,因此我现在可以在要创建的每张地图上使用它。

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


1
我还想知道在除ArcGIS之外的其他系统中是否还有此功能,例如QuantumGIS ...
Please_Dont_Bully_Me_SO_Lords 2013年

2
我在GIS上发布了次优解决方案(带有工作R代码),并在Mathematica上发布了最优解决方案(如果可以找到它们的话,将使用三种甚至两种颜色)。该解决方案是递归的;对我帖子回复给出了线性编程解决方案。歧管GIS早就内置了五色算法。(很难实现四色;要实现
五色

如果到目前为止还没有“代码”,我的ArcGIS for Desktop建议将从多边形邻域工具开始,以获取列出每个多边形的所有邻域的表。
PolyGeo

@PolyGeo:谢谢您提供的工具(我不知道),但是我无法用它来解决我的问题
radouxju 2014年

Answers:


12

首先,感谢您的所有回答和评论。不幸的是,现有工具无法与最新版本的QGIS和ArcGIS完全兼容。因此,我使用@polygeo指示的工具,@ Alexandre的QGIS插件和@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种颜色。


2
这太棒了-非常感谢分享。我在ArcGIS 10.2中注意到PolygonNeighbors输出表上的字段名称已稍有更改-这些字段现在称为src_OBJECTnbr_OBJECT
Stephen Lead

该脚本是否最佳,即是否确保使用最少的颜色?
低于雷达

1
据我了解,需要原始力量。如我的帖子所述,您必须运行几次才能有机会获得4种颜色。
radouxju

仍然很棒!也许src_ *和nbr_ *字段名称取决于输入类型。我现在使用地理数据库fc输入和Desktop 10.5来运行它,它们分别名为src_OBJECTID和nbr_OBJECTID。可以调整脚本以列出以src和nbr开头的字段,因此输入类型(或ArcGIS版本)无关紧要。
贝尔



3

这是@radouxju的答案对函数的改编。它将在输入要素图层中添加一个颜色字段并进行计算。无论PolygonNeighbors的字段名称结尾如何,它都应该起作用(对于不同的用户/输入/弧形版本,它们似乎有所不同(?))

def color_me(feature_layer):
    import arcpy
    try:
        arcpy.AddField_management(feature_layer, 'color', 'SHORT')
    except:
        print 'field alread exists'   

    arcpy.CalculateField_management(feature_layer, 'color',  '10' , 'PYTHON')

    arcpy.PolygonNeighbors_analysis(feature_layer, r'in_memory\neighbor_table' )
    graph = []
    neighbor_fields = [f.name for f in arcpy.ListFields(r'in_memory\neighbor_table') if f.name.startswith(('src', 'nbr'))]
    cursor=arcpy.da.SearchCursor(r'in_memory\neighbor_table' , neighbor_fields)
    for row in cursor:
        graph.append(row)

    pols = arcpy.da.UpdateCursor(feature_layer, ('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)
    arcpy.Delete_management(r'in_memory\neighbor_table')

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.