6 votos

focal estadísticas con radio variable

hay una manera fácil de hacer focal estadísticas en un mapa, con un radio variable para el barrio a buscar? Como en: que el radio de búsqueda se almacenan en otra trama?

he intentado algo como

f_max = arcpy.sa.FocalStatistics(Tau,arcpy.sa.NbrCircle(rad_ras,"CELL"), "MAXIMUM","DATA")

devuelve

Traceback (most recent call last):
  File "K:\Informatik\tools\arcpy\GKPROZ\test_3.py", line 383, in <module>
    ufereros_gq(r"F:\25sg\25107\TG7\access\gis_logger_tg7.mdb",gq_nummer, False)
  File "K:\Informatik\tools\arcpy\GKPROZ\test_3.py", line 300, in ufereros_gq
    f_max = arcpy.sa.FocalStatistics(Tau,arcpy.sa.NbrCircle(rad_ras,"CELL"), "MAXIMUM","DATA")
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Functions.py", line 4796, in FocalStatistics
    ignore_nodata)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Utils.py", line 47, in swapper
    result = wrapper(*args, **kwargs)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Functions.py", line 4783, in wrapper
    neighborhood = Utils.compoundParameterToString(neighborhood, ParameterClasses._Neighborhood)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Utils.py", line 75, in compoundParameterToString
    return str(parameter)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\ParameterClasses.py", line 202, in __str__
    self.units])
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\CompoundParameter.py", line 39, in _toString
    userProvidedPounds = [value == "#" for value in values]
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Functions.py", line 3598, in EqualTo
    in_raster_or_constant2)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Utils.py", line 47, in swapper
    result = wrapper(*args, **kwargs)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Functions.py", line 3595, in wrapper
    return _wrapLocalFunctionRaster(u"EqualTo_sa", ["EqualTo", in_raster_or_constant1, in_raster_or_constant2])
RuntimeError: ERROR 000732: Input Raster: Dataset # does not exist or is not supported

aunque la trama(s) existe. Supongo que esto significa que el Nbr función no puede trabajar con un mapa de bits, como la misma línea funciona bien para un valor fijo para el radio del círculo. He encontrado una solución en la que hago el centro de estadísticas de 10 veces con una radio diferente cada vez y, a continuación, utilizar arcpy.sa.De selección para elegir los 10. Sin embargo, esto es dolorosamente lento. Hay una manera mejor de hacerlo?

cualquier ayuda se agradece.

puedo usar ArcGis 10.0 SP4 en una información de licencia en Windows 7 de 64

4voto

ESV Puntos 4591

No hay una forma "fácil" de hacerlo que puedo ver por desgracia. Creo que tienes la idea correcta con el apilamiento de los rásteres con la correcta distancia focal y escoger la respuesta. Sin embargo Spatial Analyst parece un poco lento...

Me escribió una rápida secuencia de comandos para la prueba de los tiempos tomados, si yo hice el tratamiento en scipy.ndimage (versión 0.7 a ser compatible con arcpy) para compararlo con Spatial Analyst.

Mis resultados fueron aleatorias de las matrices de carrozas eran una sorprendente diferencia entre ArcGIS y nativo de Python (incluso teniendo en cuenta el dumping de la trama a un NumPy Matriz con arcpy):

tamaño de la matriz | 10x10 | 100x100 | 200x200 | 1000x1000
método | | | |
ndimage filtro genérico | 0.540 segundos | 4.722 segundos | 18.762 segundos | ERROR
ndimage max filtro | 0.002 segundos | 0.009 seg | 0.034 segundos | 0.780 segundos
arcpy focal de estadísticas y | | | |
recogida | 6.744 segundos | 3.418 segundos | 3.445 segundos | ERROR

Mi suspicision es la primera vez que utilice la herramienta Spatial Analyst se carga en la memoria para la duración de la secuencia de comandos, por lo que el tiempo tomado las gotas para la 100x100 y el 200x200 (si se ejecuta fuera de un bucle de todos los tres son aproximadamente de la misma 6,7 segundos).

Ejecutar en contra de 1000 puntos de empezar a ejecutar en las limitaciones con ArcGIS y arcGIS corrió fuera de la memoria (incluso con un pre-generados raster en el disco).

En el mientras tanto, sospecho que es mejor que use el nativo de filtro máximo en scipy.ndimage si se puede. Dicho esto, para ello tendrá que gestionar la memoria ya que dependiendo del tamaño de la trama y el formato que usted no quiere tener que leer todo en memoria a la vez!

En cualquier caso, un ejemplo de código de ejemplo para la variable de filtro:

import numpy as np
import numpy.ma as ma
from scipy import ndimage
import arcpy

a = arcpy.NumPyArrayToRaster(np.random.random((size, size)))
a_mask = arcpy.NumPyArrayToRaster(np.random.randint(0,5, (size, size)))

in_raster = arcpy.RasterToNumPyArray(a)
in_mask = arcpy.RasterToNumPyArray(a_mask)

max_filters = np.dstack([ndimage.filters.maximum_filter(in_raster,
                                                        footprint=get_circle(i, i),
                                                        mode="constant", cval=0)
                         for i in np.unique(in_mask)])
out_arr = np.take(max_filters, in_mask)
arcpy.NumPyArrayToRaster(out_arr).save("somewhere_on_disk.tif")

0voto

Lazer Puntos 3926

Creo que tienes la idea correcta con el apilamiento de los rásteres con la correcta distancia focal y escoger la respuesta. Sin embargo Spatial Analyst parece un poco lento...

Apuesto a que usted puede hacer que sea mucho más rápido mediante la creación de una máscara a partir de sus puntos el uso de EucAllocation. Establecer que la máscara antes de ejecutar FocalStatistics así que usted no necesita para realizar su cara FocalStatistics se ejecutan en toda la entrada de la trama. Puede crear una máscara para cada búfer de distancia -, pero incluso si usted utiliza una sola máscara generada usando su máxima distancia de búsqueda probablemente hay un montón de tiempo para ser salvos.

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