Menemukan titik pusat raster di ArcGIS?


10

Jika saya memiliki, misalnya, file raster persegi panjang dan bergeoreferensi yang dimuat dalam dokumen ArcMap 10 (.tiff w / tfw terkait), bagaimana cara mudah menemukan titik pusatnya dan menyimpan titik itu dalam layer vektor titik?

Juga, jika saya memiliki beberapa raster seperti itu dalam dokumen ArcMap saya, bagaimana cara saya menerapkan proses untuk semua itu?

Sayangnya, saya tidak memiliki pengalaman Python. Oleh karena itu solusi terprogram OK, tetapi saya akan memerlukan instruksi khusus tentang cara memuat skrip yang ada ke ArcGIS 10, dan menjalankannya pada raster yang bersangkutan. (BTW, raster semuanya berada di lapisan terpisah).


1
Apakah solusi terprogram diterima?
Kirk Kuykendall

Saya ingin menerima solusi terprogram, tetapi tidak memiliki pengalaman python. Saya akan memerlukan instruksi tentang cara memuat skrip ke ArcGIS, dan menjalankannya pada raster yang dimaksud.
hpy

Jawaban:


7

Meskipun pertanyaan aslinya adalah untuk 10.0, saya telah memperbarui kode di bawah ini untuk 10.3.1.

Salin tempel ini ke jendela python di arcmap untuk membuat fungsi 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)

Kemudian, Anda dapat menggunakan jendela python untuk membuat kelas fitur Anda dengan memanggil

RasterCenter("<reference to raster">)

Jadi, misalnya, jika Anda memiliki raster bernama DEM, Anda memanggil RasterCenter ("dem") di jendela python, dan itu akan menambahkan layer bernama "dem_center" dengan satu titik di tengah raster. Lapisan disimpan dalam memori, jadi jika Anda ingin menyimpannya, eksporlah.

Untuk melangkah lebih jauh, Anda bisa menyimpan skrip ke file .py dan menempatkan file .py di jalur pencarian untuk python. mis. simpan sebagai RasterCenter.py dan letakkan di PYTHONPATH (biasanya tempat untuk ini adalah C: \ Python26 \ ArcGIS10.0 \ Lib)

Maka Anda bisa melakukan:

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

6

Sangat mudah, sederhana mendapatkan properti raster dan bekerja di titik pusat dari min, max x dan 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

Dan pengecekan error biasa dll ....

Kemudian tambahkan ke tabel poin Anda dengan updateCursor


2
Pendekatan yang bagus. Saya pikir Anda ingin meningkatkan rumus Anda untuk koordinat pusat: mereka adalah sarana titik akhir, bukan perbedaan mereka.
whuber

Ini terlihat seperti apa yang saya cari, tetapi karena saya tidak memiliki pengalaman skrip di ArcGIS, dapatkah Anda memberi tahu saya cara memuat dan menjalankan skrip seperti itu? (Saya telah memperbarui pertanyaan awal untuk mencerminkan ini ...) terima kasih!
hpy

1
Anda juga dapat mengakses nilai menggunakan properti tingkat raster, misalnya raster = arcpy.Raster ("raster"), lalu centreX = raster.extent.XMax - raster.extent.XMin
blord-castillo

1
@ Wuber Saya bisa melihat kesalahannya sekarang, saya memikirkan hal lain yang saya lakukan! Terima kasih Whuber
Berbulu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.