7 votos

¿Cómo puedo calcular un centroide ponderado con respecto a una trama, por ejemplo, centrado en la población

En ArcGIS 10.0, ¿cómo calculo el centroide ponderado de una colección de polígonos, donde quiero que el peso sea una capa raster. En particular, estoy usando un trama de conteos de población y me gustaría generar el centroide ponderado por la población como resultado.

8voto

John Owen Puntos 897

Este mensaje en los foros de ESRI proporciona la lógica de usar$$XMap, $$YMap, some map algebra, and zonal summaries to come up with the x and y coordinates for each weighted centroid.

The following code is my attempt at replicating the now removed $$XMap and $ $ YMap expresiones de la cuadrícula en python en ArcGIS 10.0:

 import arcpy
import numpy

# reference to the weight raster
weightRas = arcpy.Raster("weighted_raster")

# dimensions for the arrays
numColumns = weightRas.width
numRows = weightRas.height

# create arrays that will hold coordinate values
xCoords = numpy.zeros( (numRows,numColumns), dtype='float32' )
yCoords = numpy.zeros( (numRows,numColumns), dtype='float32' )

# each cell center is offset by mean width/height
xOffset = weightRas.meanCellWidth
yOffset = weightRas.meanCellHeight

# set direction of the offsets
if( (weightRas.extent.upperRight.X - weightRas.extent.upperLeft.X) < 0 ) :
    xOffset = -xOffset
if( (weightRas.extent.lowerLeft.Y - weightRas.extent.upperLeft.Y) < 0 ) :
    yOffset = -yOffset

# the start of x coords for the raster is the center of the first pixel in the
# upper left corner, which is the upper left extent's x coord plus half the offset
x = weightRas.extent.upperLeft.X + (xOffset / 2)
y = weightRas.extent.upperLeft.Y + (yOffset / 2)

# now fill the arrays
for i in range(0,numColumns):
    xCoords[:,i] = x
    x = x + xOffset

for i in range(0,numRows):
    yCoords[i] = y
    y = y + yOffset

# finish by converting back to raster, specifying the lower left corner of the
# raster as well as cell size for x and y, which we pull from our weight raster
xMap = arcpy.NumPyArrayToRaster( xCoords, arcpy.Point(weightRas.extent.lowerLeft.X, weightRas.extent.lowerLeft.Y), weightRas, weightRas )
yMap = arcpy.NumPyArrayToRaster( yCoords, arcpy.Point(weightRas.extent.lowerLeft.X, weightRas.extent.lowerLeft.Y), weightRas, weightRas )
 

En este punto tengo rásteres de coordenadas xyy y puedo seguir usando la lógica en el enlace anterior.

5voto

cjstehno Puntos 131

Hay un truco: puedes crear redes de fila y columna de los índices mediante la realización de FlowAccumulation cálculos en constante cuadrículas, como en FlowAccumulation(1) (índices de las columnas, empezando en 0, el aumento a la derecha) y FlowAccumulation(64) (fila índices, a partir de 0, aumentando hacia arriba).

Para sus propósitos que es lo suficientemente bueno. Cuando usted realmente necesita $$XMap and $$YMap, cambiar la escala de la fila/columna de los índices de la cellsize y cambio por el origen (además de, tal vez, la otra mitad un cellsize en ambas direcciones para obtener las coordenadas de la celda de los centros).

No hay secuencias de comandos necesarios (y mucho más rápido en la ejecución, también)!

Ahora, para responder a su pregunta: convertir los polígonos formato de cuadrícula después de la primera de computación de la población por unidad de área. Llame a esta cuadrícula [densidad], porque es una densidad de población. Calcular [índice de fila] y [índice de columna] cuadrículas como se muestra arriba. Para obtener las coordenadas x de los centroides, se divide el zonal sumas de [densidad]*[índice de columna] por el zonal sumas de [densidad] (hay uno de cada uno por poligonal de la zona). Hacer una operación similar con la fila de los índices para obtener las coordenadas de los centroides. Si se desea, convertir estos centroides (que son el promedio de la fila/columna índices) a las coordenadas mediante el escalado de las cellsize y añadiendo las coordenadas del origen (más de la mitad de la cellsize).

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