¿Encontrar el punto central de un ráster en ArcGIS?

10

Si tengo, digamos, un archivo ráster rectangular y georreferenciado cargado en un documento ArcMap 10 (.tiff w / tfw asociado), ¿cómo puedo encontrar fácilmente su punto central y almacenar ese punto en una capa vectorial de puntos?

Además, si tengo varios rásteres de este tipo en mi documento de ArcMap, ¿cómo aplico el proceso a todos ellos?

Desafortunadamente, tengo cero experiencia en Python. Por lo tanto, una solución programática está bien, pero necesitaré instrucciones específicas sobre cómo cargar un script existente en ArcGIS 10 y ejecutarlo en los rásteres en las preguntas. (Por cierto, los rásteres están todos en sus capas separadas).

hpy
fuente
1
¿Son aceptables las soluciones programáticas?
Kirk Kuykendall
Me gustaría aceptar una solución programática, pero no tengo experiencia en Python. Necesitaré instrucciones sobre cómo cargar el script en ArcGIS y ejecutarlo en los rásteres en cuestión.
hpy

Respuestas:

7

Aunque la pregunta original era para 10.0, he actualizado el siguiente código para 10.3.1.

Copie y pegue esto en la ventana de Python en arcmap para crear la función RasterCenter:

import arcpy, os
def RasterCenter(raster):
    #raster: string reference to raster
    raster = arcpy.Raster(raster)
    fcname = "{}_center".format(os.path.basename(str(raster)))
    x = raster.extent.XMin + (raster.extent.XMax - raster.extent.XMin)/2
    y = raster.extent.YMin + (raster.extent.YMax - raster.extent.YMin)/2
    featureclass = arcpy.CreateFeatureclass_management("in_memory", fcname, "POINT",spatial_reference = raster.spatialReference)
    with arcpy.da.InsertCursor(featureclass, ['SHAPE@XY']) as cursor:
        cursor.insertRow(((x, y),))
    mxd = arcpy.mapping.MapDocument("CURRENT")
    df = arcpy.mapping.ListDataFrames(mxd)[0]
    arcpy.MakeFeatureLayer_management(featureclass, fcname)
    layer = arcpy.mapping.Layer(fcname)
    arcpy.mapping.AddLayer(df, layer)

Luego, puede usar la ventana de Python para crear su clase de entidad llamando

RasterCenter("<reference to raster">)

Entonces, por ejemplo, si tiene un ráster llamado DEM, llama a RasterCenter ("dem") en la ventana de Python, y agregará una capa llamada "dem_center" con un solo punto en el centro del ráster. La capa se almacena en la memoria, por lo que si desea conservarla, expórtela.

Para ir un paso más allá, puede guardar el script en un archivo .py y colocar el archivo .py en la ruta de búsqueda de python. por ejemplo, guárdelo como RasterCenter.py y colóquelo en PYTHONPATH (normalmente el lugar para esto es C: \ Python26 \ ArcGIS10.0 \ Lib)

Entonces podrías hacer:

import RasterCenter
RasterCenter.RasterCenter("<reference to raster">)
castillo-blord
fuente
6

Muy fácil, simple, obtenga las propiedades de los rásteres y calcule el punto central desde min, max x e y

MinX = arcpy.GetRasterProperties_management("raster", "LEFT")
MinY = arcpy.GetRasterProperties_management("raster", "BOTTOM")
MaxX = arcpy.GetRasterProperties_management("raster", "RIGHT")
MaxY = arcpy.GetRasterProperties_management("raster", "TOP")

centreX = (MaxX + MinX) / 2
centreY = (MaxY + MinY) / 2

Y el error de comprobación habitual, etc.

Luego agregue a su tabla de puntos con un cursor de actualización

Peludo
fuente
2
Buen enfoque. Creo que desea mejorar sus fórmulas para las coordenadas del centro: son las medias de los puntos finales, no sus diferencias.
whuber
Esto se parece a lo que estoy buscando, pero dado que no tengo experiencia en scripts en ArcGIS, ¿puede decirme cómo cargar y ejecutar dicho script? (He actualizado la pregunta original para reflejar esto ...) ¡gracias!
hpy
1
También puede acceder a los valores usando las propiedades de extensión de ráster, por ejemplo, raster = arcpy.Raster ("raster"), luego centreX = raster.extent.XMax - raster.extent.XMin
blord-castillo
1
@Whuber ¡Puedo ver el error ahora, estaba pensando en otra cosa que estaba haciendo! Gracias Whuber
Peludo