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


评论

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

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

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

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

#1 楼

首先,感谢您的所有回答和评论。不幸的是,现有工具无法与最新版本的QGIS和ArcGIS完全兼容。因此,我使用@polygeo指示的工具,@ Alexandre的QGIS插件和@Jens的算法名称(四色图)制定了自己的解决方案。 (对于ArcGIS,但是第二部分也可以在QGIS中使用。)请注意,该算法不能保证仅使用4种颜色:事实证明,解决方案是存在的,“蛮力”是实现它的必要条件。就我而言,我得到了7种足够小的颜色。在找到解决方案之前,脚本可能会有一个额外的循环,但是我需要对数百张地图进行处理,并且可以使用7种颜色。

评论


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

–斯蒂芬·李
14年5月15日在1:01

此脚本是否最佳,即可以确保使用最少的颜色?

–雷达下方
17年2月8日在14:50

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

– radouxju
17年2月8日在15:17

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

– Bera
18年1月31日在10:35



#2 楼

有一个VB6开发人员示例和一个ArcGIS 9.x地理处理工具,但从此ArcGIS Idea的注释来看,它们不能在10.0+上运行。 />
以下相关问题的注释中给出了一个名为TopoColour的QGIS解决方案:彩色多边形,因此每个多边形都与邻域不同

#3 楼

如果您使用的是QGIS,我相信您所需要的是为地图着色。 !

#4 楼

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

def color_me(feature_layer):
    import arcpy
    try:
        arcpy.AddField_management(feature_layer, 'color', 'SHORT')
    except:
        print 'Could not add color field. Maybe it already 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')




评论


我现在正在使用它来查看雨水集水区。那些可以作为多部分多边形出现,并且彼此之间可以有甜甜圈孔,这似乎也适用于这些!它可以导致使用更多的颜色,但是仍然很适合我需要的颜色

–Zipper1365
20-4-10上午12:41