7 votos

La disolución de polígonos falla en computadoras con poca cantidad de RAM

Cuando intento disolver un polígono a través de un script arcpy, la operación falla con el error 999999 en ordenadores con poca cantidad de RAM [~3 GB] (problema conocido).

Desafortunadamente ninguno de los dos este , que ni que trabajar para mí, así que estaba pensando en dividir el polígono en trozos más pequeños primero, procesarlos y luego fusionarlos de nuevo? Pero no tengo ni idea de cómo hacerlo. ¿Alguna idea? ¿Tal vez hay otro enfoque que no se me ha ocurrido?

Se puede encontrar un ejemplo de polígono de prueba aquí me estoy disolviendo en el campo "Godziny" con la configuración por defecto:

arcpy.Dissolve_management(path_to_original_shp, path_to_dissolved_shp, "Godziny")

AÑADIDO: Desafortunadamente cuando probé la solución de Geog y funcionó fue sólo una casualidad. Aún así, 99 de cada 100 disoluciones fallan. Sin embargo, las condiciones de fracaso son bastante extrañas. Si corro a disolverme como herramienta en ArcMap se disuelve muy bien (en unos 30 segundos). Si lo ejecuto desde el intérprete de Python (no importa si está en ArcMap o no) también se disuelve bien. Sin embargo, si lo ejecuto desde mi script como una de las funciones de una cadena de procesamiento, falla (se queda atascado durante unos 20-30 minutos, con el uso de la memoria creciendo lenta pero constantemente a lo largo del tiempo, y luego da un error 999999 - "Topología inválida").

La forma en que ejecuto este script es un poco inusual, porque tengo una GUI construida con wxpython que ejecuto en ArcMap, desde la cual se ejecuta la cadena de procesamiento con disolución. Lo ejecuto en una máquina Windows XP SP3 con 3 GB de RAM. Si utilizo una máquina con más RAM y Windows 7 u 8 (64 bit pero sin geoprocesamiento de fondo de 64 bit) todo funciona perfectamente. Además, si comento la disolución y el resto de la cadena, la ejecuto, luego comento la primera parte y la ejecuto desde el punto de disolución también funciona bien. Eso me dio la idea de que podría estar de alguna manera bloqueando los recursos, así que he intentado hacer gc.collect(), pero sin éxito.

Acabo de intentar ejecutar el guión desde la línea de comandos y también funciona bien... Así que supongo que hay algo malo al disolverse de mi extensión GUI, sin embargo no tengo ni idea de cómo mi extensión podría influir en la función ya que no estoy modificando el entorno de ninguna manera.

La cadena de procesamiento que estoy haciendo se parece a esto:

    arcpy.CheckOutExtension("spatial")

    # getting necessary licences
    ccm1_cut = ExtractByMask(project_manager.conf_dict["CCM1"], project_manager.conf_dict["hordist"])
    ccm2_cut = ExtractByMask(project_manager.conf_dict["CCM2"], project_manager.conf_dict["hordist"])
    ccm3_cut = ExtractByMask(project_manager.conf_dict["CCM3"], project_manager.conf_dict["hordist"])
    ccm4_cut = ExtractByMask(project_manager.conf_dict["CCM4"], project_manager.conf_dict["hordist"])
    ccm5_cut = ExtractByMask(project_manager.conf_dict["CCM5"], project_manager.conf_dict["hordist"])

    # merging ccm layers
    ccm_merged = Con(IsNull(ccm1_cut), Con(IsNull(ccm2_cut), Con(IsNull(ccm3_cut), Con(IsNull(ccm4_cut),
                    Con(IsNull(ccm5_cut), project_manager.conf_dict["lu_speed"], ccm5_cut), ccm4_cut), ccm3_cut), ccm2_cut), ccm1_cut)

    walk_speed_cut = ExtractByMask(project_manager.conf_dict["walkspeed"], project_manager.conf_dict["hordist"])

    travel_speed_raster = walk_speed_cut / ((Float(ccm_merged)) / 100)
    travel_speed_raster.save(travel_speed)

    # creating path distance
    ipp = project_manager.get_ipp_path()
    path_dist_raster = PathDistance(ipp, travel_speed)

    # normalising to hours
    path_dist_norm_raster = Divide(path_dist_raster, 3600)
    path_dist_norm_raster.save(travel_time_normalised)

    # creating hour classes
    remap_range = RemapRange(create_remap_range_ccm())
    temp_reclass = Reclassify(travel_time_normalised, "VALUE", remap_range, "NODATA")
    temp_reclass.save(travel_time_classes)

    # converting travel time raster to polygons
    arcpy.RasterToPolygon_conversion(travel_time_classes, travel_time_classes_shp, "SIMPLIFY", "VALUE")

    # calculating time value
    arcpy.AddField_management(travel_time_classes_shp, "Godziny", "SHORT")
    arcpy.CalculateField_management(travel_time_classes_shp, "Godziny", "[GRIDCODE]", "VB")

    # dissolving polygons
    arcpy.Dissolve_management(travel_time_classes_shp, travel_time_classes_dissolved, "Godziny")
    ...

8voto

Geog Puntos 1604

La herramienta Disolver puede crear un Godzilla combinando características más pequeñas (pero aún así bastante grandes) en una sola característica. Esto se conoce como el problema combinatorio. La herramienta Disolver tiene una lógica que impide crear un Godzilla (recibirá la advertencia código 000059 ) pero esta lógica se basa en la memoria disponible de la máquina en el momento en que se ejecuta Dissolve. Así que, mientras que la salida puede no ser un Godzilla en la máquina en la que se ejecutó Dissolve, puede estar en otra máquina con menos memoria disponible. Aprenda más sobre Cortar a Godzillas en cubitos (La herramienta Dados toma características de entrada y un límite de vértice y produce una nueva clase de características con características en dados, como se ilustra a continuación. La herramienta Dados funciona con multipuntos, líneas y polígonos).

2voto

rg255 Puntos 111

Crearía un polígono de 4 regiones y "recortaría" cada una de las cuatro porciones en archivos de forma separados y luego ejecutaría la "disolución". Luego los uniría de nuevo y probablemente tendría que ejecutar un último "disolver".

Crearía los 4 polígonos a través de la herramienta de red de pesca basada en la envoltura del conjunto de polígonos de entrada.

aquí hay un enlace. http://forums.arcgis.com/threads/40500-Split-polygon

1voto

xenny Puntos 670

A veces ayuda trabajar con una capa en lugar de hacerlo directamente sobre los datos. Deberías intentar crear dicha capa antes de ejecutar las herramientas (con arcpy.MakeFeatureLayer_management), y luego borrar esta capa (con arcpy.Delete_management, borrando la capa, no la clase de característica, por supuesto)

También puede ayudar a evitar características multipartes usando la opción "SINGLE_PART" y a reducir el número de vértices usando " simplifica (se simplificó en la etapa de la conversión de trama a polígono.

Finalmente, hay un trabajo que se disuelve si tienes la licencia avanzada, pero lleva tiempo. Usa polígono para alinear con la opción identificar los polígonos izquierdo y derecho, une los campos originales que necesites para la disolución, selecciona todas las líneas que tengan un valor diferente a izquierda y derecha, y convierte esas líneas en polígonos: has disuelto tu conjunto de datos.

0voto

baba Puntos 61

Tuve este problema.

Esto es lo que Arcmap hace en el fondo y tú deberías hacer lo mismo.

  1. 10.000 cortes de características: seleccionar las 10.000 características superiores, hacer una capa, disolver
  2. Limpieza: siempre, pero siempre use "nombres generados por Arcpy" (hay una función, no la recuerde), no reutilice los nombres (capas o lo que sea) y elimine las capas no utilizadas/utilizadas al final de cada ciclo de iteración.
  3. Cambie el espacio de trabajo y el gdb de trabajo por defecto.

" Tengo un GUI construido con wxpython " -> deshazte del gui en wx. Hay problemas conocidos para esta combinación. El módulo arcpy usa algunos objetos COM/OLE en algún lugar. " A partir de la versión 0.5 Wx::ActiveX es compatible con los objetos de Win32::OLE " -> ¿estás usando la versión de 64 bits? ¡¿Estás usando Arcgis 10.1?!

¡Salud! Espero que esto te ayude a entender el problema principal.

0voto

Leonard Puntos 2832

Mi suposición es que es un problema de recolección de basura - una de las clases no se va a salir del alcance lo suficiente para que la recolección ocurra antes de que se reinicie. Los marcos de trabajo administrados no siempre lo resuelven cuando sus recursos están al máximo y el hecho de que sólo ocurra durante la versión del guión y luego de manera algo aleatoria (que podría deberse a otras operaciones del sistema) me sugiere esta causa.

En cuanto a las soluciones, es difícil de cambiar si el código en cuestión está envuelto en una clase propietaria. Si puedes forzar a GC de alguna manera (envolverlo todo en otra clase, ¿tal vez ponerlo fuera de alcance?) eso podría funcionar.

¿O tal vez crear rasters para los parámetros en la clase calculatefield_management y utilizar en su lugar un calculo raster, y luego convertirlo en polys al final, evitando así que se disuelvan todos juntos?

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