5 votos

Simbolización de segmentos individuales de la red de carreteras en ArcMap

Tengo una capa de autopistas a la que tengo que aplicar un estilo en ArcMap para diferenciar los distintos tramos de autopista, idealmente utilizando no más de 6-7 colores distintos. Cada autopista está dividida en una o más secciones. Las autopistas tienen atributos de número de carretera y número de sección que puedo utilizar para el estilo. La simbología deberá poder exportarse a ArcPad. Puedo calcular/añadir nuevos campos a la tabla, si eso ayuda.

He aquí una imagen de cómo puede quedar un tramo de autopista:

enter image description here

Tenga en cuenta que en la imagen, los colores no se repiten, pero definitivamente tendrán que ser en toda la red de carreteras. Lo único que pretendo es mostrar las secciones de las autopistas con un subconjunto limitado de colores.

0 votos

Puedes escribir un script en Python (o similar) que recorra cada segmento de línea y le asigne un color. El pseudocódigo podría ser algo como (1) obtener la línea. (2) comprobar si tiene un color - si no darle color n, e incrementar n. (3) encontrar su línea vecina. (4) comprobar si tiene color - si no, darle color n, e incrementar n. (5) obtener la línea siguiente, etc. Esto tendría que ser iterativo, con múltiples pasadas sobre la red para asegurar que los segmentos vecinos no comparten un color.

0 votos

¿Cuál es el número máximo de tramos por carretera? ¿Hay algún límite?

0 votos

@slead: Ese fue mi pensamiento inicial, pero es muy ineficiente y potencialmente lento en capas grandes. @ujjwalesri: Teóricamente no hay un límite máximo para el número de secciones. Actualmente, el número máximo de secciones es 82, pero eso podría cambiar.

1voto

Adam Puntos 343

En ArcMap vaya al menú Personalizar -> Gestor de estilos.

En tu estilo personal (o lo que te funcione) haz clic en Rampas de color. En el área de la derecha, haga clic con el botón derecho en Nuevo -> Rampa de color preestablecida...

Cambia los colores a lo que quieras. Si solo quieres 6 o 7 colores tendrás que repetir colores.

Utilice esta rampa para simbolizar los segmentos de autopista.

Con esto conseguirás el mismo efecto, aunque de una forma un poco más pirata.

0 votos

Gracias por la respuesta, sin embargo intentar hacer esto para 1600 funciones es simplemente inviable.

0 votos

@Sasa ¿Por qué no es viable? Cualquier solución que elijas va a tener que simbolizar cada uno de los 16000 segmentos individualmente. Tanto si lo haces programáticamente como si lo haces por categorías con una rampa como sugiero. Para que quede claro, le sugiero que simbolice por categoría utilizando el ID de cada segmento como categoría. El problema al que te enfrentarás es que podría simbolizar dos segmentos táctiles con el mismo color.

0voto

Jason Z Puntos 111

Ayer preparé un script rápido para añadir una categoría a cada tramo de autopista en función de los tramos con los que se cruza. El script decidirá automáticamente cuál es el número máximo de categorías a medida que avanza. No es necesariamente el método más eficiente / limpio, pero yo no tenía más tiempo libre para mirar en él. También soy bastante nuevo en python/arcpy, por lo que el código podría utilizar un poco de limpieza:

import arcpy
from arcpy import env

# Set the workspace
env.workspace = "C:/Projects/Misc/HighwaySymbology"

# Create a copy of the highways shapefile
arcpy.CopyFeatures_management("highways.shp", "highways_out.shp")

# Add a category field
arcpy.AddField_management("highways_out.shp", "hwycat", "LONG", 9)

# Create a feature layer
fl = arcpy.MakeFeatureLayer_management("highways_out.shp", "Highways")

# Create the update cursor
rows = arcpy.UpdateCursor("highways_out.shp")

# Create the in-memory layer to select with
arcpy.MakeFeatureLayer_management("highways_out.shp", "HwySelection")

# Loop through every highway segment, one by one
for row in rows:
    arcpy.SelectLayerByAttribute_management("HwySelection", "NEW_SELECTION", "FID = " + str(row.FID))

    arcpy.SelectLayerByLocation_management("Highways", "INTERSECT", "HwySelection", "", "NEW_SELECTION")
    numSelHwys = int(arcpy.GetCount_management("Highways").getOutput(0))

    # Number of selected highways should always be > 1, 
    # as it will at least select the current highway
    if numSelHwys > 1:
        # Loop through all sections of the road and find the
        # lowest unused highway category
        selHwys = arcpy.SearchCursor("Highways")

        hwyCategories = []
        for selHwyRow in selHwys:
            # Skip the current highway
            if selHwyRow.FID == row.FID:
                continue

            if selHwyRow.hwycat > 0:
                hwyCategories.append(selHwyRow.hwycat)

        # Sort the list and find the first available category
        hwyCategories.sort()
        lastCat = 0
        for cat in hwyCategories[:]:
            if cat - lastCat > 1:
                break
            else:
                lastCat = cat

        lastCat += 1
        row.hwycat = lastCat
        rows.updateRow(row)

    else:
        # No adjoining segments, set the category to 1
        row.hwycat = 1
        rows.updateRow(row)

print
print "DONE"

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