Finden Sie den Mittelpunkt eines Rasters in ArcGIS?


10

Wenn ich beispielsweise eine rechteckige und georeferenzierte Rasterdatei in ein ArcMap 10-Dokument geladen habe (.tiff mit zugehörigem tfw), wie kann ich den Mittelpunkt leicht finden und diesen Punkt in einer Punktvektorebene speichern?

Wie kann ich den Prozess auf alle anwenden, wenn ich mehrere solcher Raster in meinem ArcMap-Dokument habe?

Leider habe ich keine Python-Erfahrung. Daher ist eine programmatische Lösung in Ordnung, aber ich benötige spezielle Anweisungen zum Laden eines vorhandenen Skripts in ArcGIS 10 und zum Ausführen auf den betreffenden Rastern. (Übrigens sind die Raster alle in ihren separaten Ebenen).


1
Sind programmatische Lösungen akzeptabel?
Kirk Kuykendall

Ich würde gerne eine programmatische Lösung akzeptieren, habe aber keine Python-Erfahrung. Ich benötige Anweisungen zum Laden des Skripts in ArcGIS und zum Ausführen auf den betreffenden Rastern.
hpy

Antworten:


7

Obwohl die ursprüngliche Frage für 10.0 war, habe ich den folgenden Code für 10.3.1 aktualisiert.

Kopieren Sie diese und fügen Sie sie in das Python-Fenster in arcmap ein, um die RasterCenter-Funktion zu erstellen:

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)

Anschließend können Sie das Python-Fenster verwenden, um Ihre Feature-Class durch Aufrufen zu erstellen

RasterCenter("<reference to raster">)

Wenn Sie beispielsweise ein Raster mit dem Namen DEM haben, rufen Sie RasterCenter ("dem") im Python-Fenster auf und fügen eine Ebene mit dem Namen "dem_center" mit einem einzelnen Punkt in der Mitte des Rasters hinzu. Die Ebene wird im Speicher gespeichert. Wenn Sie sie also behalten möchten, exportieren Sie sie.

Um noch einen Schritt weiter zu gehen, können Sie das Skript in einer .py-Datei speichern und die .py-Datei im Suchpfad für Python ablegen. Speichern Sie es beispielsweise als RasterCenter.py und platzieren Sie es in PYTHONPATH (normalerweise ist der Ort dafür C: \ Python26 \ ArcGIS10.0 \ Lib).

Dann könnten Sie tun:

import RasterCenter
RasterCenter.RasterCenter("<reference to raster">)

6

Sehr einfach, einfach die Rastereigenschaften abrufen und den Mittelpunkt aus min, max x und y berechnen

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

Und die übliche Fehlerprüfung etc ....

Fügen Sie dann mit einem updateCursor zu Ihrer Punktetabelle hinzu


2
Netter Ansatz. Ich denke, Sie möchten Ihre Formeln für die Mittelkoordinaten verbessern: Sie sind das Mittel der Endpunkte, nicht ihre Unterschiede.
whuber

Dies sieht so aus, wie ich es suche. Da ich jedoch keine Erfahrung mit Skripten in ArcGIS habe, können Sie mir sagen, wie ein solches Skript geladen und ausgeführt wird. (Ich habe die ursprüngliche Frage aktualisiert, um dies widerzuspiegeln ...) Danke!
hpy

1
Sie können auf die Werte auch über die Raster-Extent-Eigenschaften zugreifen, z. B. raster = arcpy.Raster ("raster"), dann centreX = raster.extent.XMax - raster.extent.XMin
blord-castillo

1
@Whuber Ich kann den Fehler jetzt sehen, ich dachte an etwas anderes, was ich tat! Danke Whuber
Hairy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.