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"
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.
1 votos
QGIS tiene un plugin llamado "TopoColor" que permite al usuario elegir un atributo y el plugin hará una evaluación de los datos y determinar el número mínimo de colores necesarios para no tener ninguna característica polígonos tocando a otro. Si usted tiene ganas de cavar en el código, usted podría ser capaz de portar el concepto de ArcMap.
0 votos
¿Con "segmentos" te refieres a cada línea individual entre los vértices? Tu imagen de ejemplo sugiere que podría no ser el caso.
0 votos
@jvangeld: Cada autopista está representada por uno o más segmentos de línea discretos. Los segmentos son elementos independientes: las autopistas NO son multigeometrías. Por si sirve de algo, descubrí que había un campo ya calculado que se utilizaba para simbolizar la capa (como en la sugerencia anterior). Por curiosidad, sigo buscando una solución (si el tiempo me lo permite).
0 votos
@jvangeld: He actualizado la imagen para mostrar cómo se ve el producto final, espero que sea un poco más claro en lo que estoy tratando de lograr.
1 votos
+1 pregunta interesante. Me pregunto si esto podría ser pensado como un problema del mapa en cuatro colores para los vectores. ¿Están sus carreteras en una red geométrica?