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")
...