21 votos

¿Cómo aplicar el teorema de los cuatro colores en un mapa de polígonos en ArcGIS/ArcToolBox de forma automática?

Necesito aplicar el teorema de los cuatro colores en una forma poligonal de manera que no necesito elegir manualmente cada color para ponerlo en cada región. Deseo saber si hay alguna extensión, plug-in, script o base de datos que pueda ser usada con ArcGIS y ArcToolBox para hacerlo de manera matemática o programada, así que podría usarla por ahora en cada mapa que venga a crear.

enter image description here enter image description here enter image description here

12voto

xenny Puntos 670

En primer lugar, gracias por todas las respuestas y comentarios. Desafortunadamente, las herramientas existentes no eran totalmente compatibles con las últimas versiones de QGIS y ArcGIS. Por lo tanto hice mi propia solución usando la herramienta indicada por @polygeo, el plugin QGIS de @Alexandre y el nombre del algoritmo (mapa de cuatro colores) de @Jens.

Aquí está mi código para los interesados (para ArcGIS pero la segunda parte podría ser usada en QGIS también).

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)

Nótese que el algoritmo no garantiza que sólo se usen 4 colores: aunque se ha probado que la solución existe, la "fuerza bruta" es necesaria para lograrla. En mi caso, tengo 7 colores que son lo suficientemente pequeños. El script podría tener un bucle adicional hasta que se encuentre la solución, pero necesito hacerlo para cientos de mapas y 7 colores está bien.

4voto

auramo Puntos 161

Hay un Muestra del revelador VB6 y un Herramienta de geoprocesamiento ArcGIS 9.x pero de los comentarios sobre esto Idea de ArcGIS no funcionan a más de 10.0.

Tal vez a alguien le interese portarlo.

Una solución QGIS llamada TopoColour en los comentarios de esta cuestión conexa: Colorear los polígonos para que cada uno sea distinto de sus vecinos

2voto

sashkello Puntos 325

Si estás usando el QGIS, creo que lo que necesitas es el Colorear un plugin de mapa .

Desafortunadamente, el plugin sólo está disponible para la versión QGIS 1.8, pero siempre se puede descargar y ver cómo funciona el código!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X