Znalezienie punktu środkowego rastra w ArcGIS?

10

Jeśli mam, powiedzmy, prostokątny i georeferencyjny plik rastrowy załadowany do dokumentu ArcMap 10 (.tiff z powiązanym tfw), to jak łatwo znaleźć jego punkt środkowy i zapisać ten punkt w warstwie wektorowej punktów?

Ponadto, jeśli mam wiele takich rastrów w moim dokumencie ArcMap, jak zastosować proces do wszystkich z nich?

Niestety nie mam doświadczenia w Pythonie. Dlatego programowe rozwiązanie jest OK, ale będę potrzebował konkretnych instrukcji, jak załadować istniejący skrypt do ArcGIS 10 i uruchomić go na rastrach w pytaniach. (BTW, rastry są w osobnych warstwach).

hpy
źródło
1
Czy rozwiązania programowe są dopuszczalne?
Kirk Kuykendall
Chciałbym zaakceptować rozwiązanie programowe, ale nie mam doświadczenia w Pythonie. Będę potrzebował instrukcji, jak załadować skrypt do ArcGIS i uruchomić go na odpowiednich rastrach.
hpy

Odpowiedzi:

7

Chociaż pierwotne pytanie dotyczyło wersji 10.0, zaktualizowałem poniższy kod dla wersji 10.3.1.

Skopiuj wklej to do okna Pythona w arcmap, aby utworzyć funkcję 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)

Następnie możesz użyć okna Pythona, aby utworzyć klasę obiektów, wywołując

RasterCenter("<reference to raster">)

Na przykład, jeśli masz raster o nazwie DEM, wywołujesz RasterCenter („dem”) w oknie pythona, a to doda warstwę o nazwie „dem_center” z pojedynczym punktem na środku rastra. Warstwa jest przechowywana w pamięci, więc jeśli chcesz ją zachować, wyeksportuj ją.

Aby przejść o krok dalej, możesz zapisać skrypt w pliku .py i umieścić plik .py w ścieżce wyszukiwania dla Pythona. np. zapisz go jako RasterCenter.py i umieść w PYTHONPATH (zwykle miejscem na to jest C: \ Python26 \ ArcGIS10.0 \ Lib)

Następnie możesz zrobić:

import RasterCenter
RasterCenter.RasterCenter("<reference to raster">)
blord-castillo
źródło
6

Bardzo łatwo, łatwo uzyskaj właściwości rastrów i oblicz punkt środkowy od min, max x i 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

I zwykłe sprawdzanie błędów itp ...

Następnie dodaj do swojej tabeli punktów za pomocą kursora aktualizacji

Włochaty
źródło
2
Niezłe podejście. Myślę, że chcesz poprawić swoje formuły dla współrzędnych środkowych: są one środkami punktów końcowych, a nie ich różnicami.
whuber
Wygląda na to, czego szukam, ale skoro nie mam doświadczenia ze skryptami w ArcGIS, czy możesz mi powiedzieć, jak załadować i uruchomić taki skrypt? (Zaktualizowałem oryginalne pytanie, aby odzwierciedlić to ...) dzięki!
hpy
1
Można również uzyskać dostęp do wartości przy użyciu właściwości rastrowych zakresu, na przykład raster = arcpy.Raster ( "rastrowe"), a następnie CENTREXu = raster.extent.XMax - raster.extent.XMin
blord-Castillo
1
@ Whuber Widzę teraz błąd, myślałem o czymś innym, co robiłem! Dzięki Whuber
Hairy