6 votos

Hallar el valor medio de las áreas de los polígonos en una celda de red

Quiero asignar valores de profundidad a cada celda de la cuadrícula de la red de pesca que tengo, tomando la media ponderada por área de los valores de un mapa de contorno/isopaca.

El mapa se interpoló utilizando las profundidades de los pozos individuales mediante la herramienta de análisis geoestadístico Inverse Distance Weighting.

Adjunto una imagen de mi ejemplo junto con la tabla de atributos.

Example

Al principio pensé que Estadísticas zonales en forma de tabla sería perfecto pero me obligaría a convertir a raster primero (o incluso cambiar la salida de la herramienta IDW) pero he leído que la conversión a raster es una mala opción ( ¿Funciona la interpolación IDW en ArcGIS Geostatistical analyst como método de interpolación exacta? ). ¿Existe un método mejor?

6voto

Anton8000 Puntos 165

A menos que te entienda mal, esto debería funcionar:

  1. Intersect Malla y contornos
  2. Calcular una columna de valores ponderados por área
  3. Disolver por ID de red de pesca y sumar los valores ponderados por área
  4. Calcule los promedios totales dividiendo con las áreas de las formas

Puede hacerlo manualmente, con el ModelBuilder o utilizando el Ventana Python y el código de abajo (cambiar las cuatro líneas como se indica):

import arcpy
arcpy.env.overwriteOutput=1

fishnet = r'C:\Default.gdb\fishnet_4km' #Change to match your data
contours = r'C:\Default.gdb\contour' #Change to match your data
valuecolumn = 'AvgValue' #Change to match your data
outfc = r'C:\Default.gdb\fishnet_with_averages' #Change to match your data

#Intersect fishnet and contours
tempfc=r'in_memory\intersect'
arcpy.Intersect_analysis(in_features=[fishnet,contours], out_feature_class=tempfc)

#Calculate areaweighted values per intersection
arcpy.AddField_management(in_table=tempfc, field_name='AvgArea', field_type='DOUBLE')
with arcpy.da.UpdateCursor(tempfc,['AvgArea',valuecolumn,'SHAPE@AREA']) as cursor:
    for row in cursor:
        row[0]=row[1]*row[2]
        cursor.updateRow(row)

#Dissolve by fishnet ID and calculate sum of areasums
fishnetID = '{0}{1}'.format('FID_',arcpy.Describe(fishnet).name)
arcpy.Dissolve_management(in_features=tempfc, out_feature_class=outfc, 
                         dissolve_field=fishnetID, 
                         statistics_fields=[['AvgArea','SUM']])
arcpy.AddField_management(in_table=outfc, field_name='Areaweighted_average', field_type='DOUBLE')

#Calculate areaweighted average
with arcpy.da.UpdateCursor(outfc,['Areaweighted_average','SUM_AvgArea','SHAPE@AREA']) as cursor:
    for row in cursor:
        row[0]=row[1]/row[2]
        cursor.updateRow(row)

Entradas: enter image description here La salida: enter image description here

2voto

GeoWill Puntos 91

La herramienta que necesitas es Tabular la intersección . Tendrá que utilizar una tabla pivotante para transformar los resultados para tener un registro por celda, y luego unir estos resultados de nuevo a su clase de característica fishnet. El proceso está documentado en el enlace anterior.

Esto puede usar mucha memoria, así que asegúrate de que tus archivos sean locales. Una forma sencilla de facilitar el trabajo en su máquina sería dividir la red de pesca y ejecutarla como un proceso por lotes. Para más discusión y scripts alternativos de python/R vea aquí

2voto

xenny Puntos 670

Si entiendo bien, deberías usar la salida raster de tu interpolación espacial y las estadísticas zonales si quieres la salida más precisa. No te asustes con la discusión sobre la exactitud en ¿Funciona la interpolación IDW en ArcGIS Geostatistical analyst como método de interpolación exacta? .

Estadísticamente hablando, un interpolador exacto es un interpolador en el que el valor interpolado en la ubicación de un punto de entrada es exactamente el mismo que el valor de este punto. La respuesta dice entonces que rara vez se está exactamente en la misma ubicación cuando se tienen píxeles, por lo tanto no se tendrá exactamente el mismo valor para un píxel y el punto "conocido" que está dentro de este píxel (excepto en el centro).

Sin embargo, la superficie continua que se interpola se mide siempre en el centro de cada píxel, que son entonces "exactos" con respecto al interpolador. Por tanto, los píxeles son una buena forma de discretizar una superficie interpolada, y mucho más precisa que los polígonos en su caso particular (el hexágono es probablemente un círculo simplificado con 6 segmentos).

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