Saya benar-benar baru untuk Python dan saya ingin tahu apakah ada metode cepat untuk mendapatkan nilai sel pixel raster oleh pixel dan koordinat (peta koordinat XY pusat setiap pixel) menggunakan Python di ArcGIS 10?
Untuk menjelaskan ini lebih lanjut, saya perlu mendapatkan peta X, peta Y dan nilai sel dari piksel pertama dan menetapkan tiga nilai tersebut ke dalam tiga variabel dan ulangi langkah ini untuk sisa piksel lainnya (loop melalui seluruh raster).
Saya pikir saya perlu lebih menjelaskan pertanyaan saya. Masalahnya adalah, saya perlu mendapatkan lokasi XY piksel dari raster pertama dan mendapatkan nilai sel beberapa raster lain yang sesuai dengan lokasi XY tersebut. Proses ini harus berulang melalui setiap piksel dari raster pertama tanpa membuat shapefile titik menengah karena akan benar-benar memakan waktu karena saya harus menangani raster dengan hampir 8 miliar piksel. Juga, saya perlu melakukan ini menggunakan Python di ArcGIS 10.
@ James: Terima kasih banyak atas saran Anda. Ya ini akan bekerja untuk satu raster tetapi saya perlu mengumpulkan nilai sel untuk beberapa raster lainnya juga. Masalahnya adalah, setelah mendapatkan koordinat X dan Y dari piksel pertama raster pertama, saya perlu mendapatkan nilai sel raster kedua yang sesuai dengan X, lokasi Y dari raster pertama, lalu raster ketiga dan seterusnya. Jadi, saya pikir ketika perulangan melalui raster pertama, mendapatkan lokasi X dan Y dari sebuah piksel dan mendapatkan nilai sel dari raster lain yang sesuai dengan lokasi itu harus dilakukan secara bersamaan tetapi saya tidak yakin. Ini dapat dilakukan dengan mengonversi raster pertama menjadi titik shapefile dan melakukan Extractivivivalues to point function di ArcGIS 10 tetapi saya
@ hmfly: Terima kasih, Ya metode ini (RastertoNumpyarray) akan berfungsi jika saya bisa mendapatkan koordinat dari nilai baris dan kolom array yang diketahui.
@whuber: Saya tidak ingin melakukan perhitungan apa pun, yang perlu saya lakukan adalah menulis koordinat XY dan nilai sel ke dalam file teks dan itu saja
sumber
Jawaban:
Mengikuti ide @ Dango yang saya buat dan uji (pada raster kecil dengan tingkat dan ukuran sel yang sama) kode berikut:
Berdasarkan kode @hmfly, Anda dapat memiliki akses ke nilai yang diinginkan:
Sayangnya ada satu 'tetapi' - kode ini tepat untuk array NumPy yang dapat ditangani oleh memori sistem. Untuk sistem saya (8GB), array terbesar adalah sekitar 9000.9000.
Karena pengalaman saya tidak memungkinkan saya memberikan bantuan lebih lanjut, Anda dapat mempertimbangkan beberapa saran tentang berurusan dengan array besar: /programming/1053928/python-numpy-very-large-matrices
arcpy.RasterToNumPyArray
metode memungkinkan untuk menentukan subset dari raster yang dikonversi menjadi array NumPy ( halaman bantuan ArcGIS10 ) apa yang dapat berguna ketika memotong dataset besar menjadi submatrices.sumber
Jika Anda hanya ingin mendapatkan nilai piksel melalui (baris, kolom), Anda dapat menulis skrip arcpy seperti ini:
Tetapi, jika Anda ingin mendapatkan koordinat piksel, NumPyArray tidak dapat membantu Anda. Anda bisa mengonversi raster ke titik dengan RasterToPoint Tool, dan kemudian Anda bisa mendapatkan koordinat dengan Shape yang diajukan.
sumber
Metode paling sederhana untuk menghasilkan koordinat dan nilai sel ke file teks di ArcGIS 10 adalah fungsi sampel , tidak perlu kode dan terutama tidak perlu untuk mengulang setiap sel. Dalam ArcGIS <= 9,3x kalkulator raster, ia semudah
outfile.csv = sample(someraster)
yang akan menghasilkan file teks dari semua nilai dan koordinat sel (bukan nol) (dalam format z, x, y). Di ArcGIS 10, sepertinya argumen "in_location_data" sekarang wajib, jadi Anda perlu menggunakan sintaksSample(someraster, someraster, outcsvfile)
.Edit: Anda juga dapat menetapkan beberapa raster:
Sample([someraster, anotherraster, etc], someraster, outcsvfile)
. Apakah ini akan bekerja pada 8 miliar sel, saya punya ide nooo ...Sunting: Catatan, saya belum menguji ini di ArcGIS 10, tetapi telah menggunakan fungsi sampel selama bertahun-tahun dalam <= 9.3 (dan Workstation).
Sunting: Saya sekarang telah menguji di ArcGIS 10 dan tidak akan menghasilkan file teks. Alat mengubah ekstensi file menjadi ".dbf" secara otomatis. Namun ... kode python berikut berfungsi sebagai pernyataan aljabar peta SOMA dan MOMA masih didukung di ArcGIS 10:
sumber
Salah satu cara untuk melakukan ini adalah dengan menggunakan alat Raster_To_Point diikuti oleh alat Add_XY_Coordinates . Anda akan berakhir dengan shapefile di mana setiap baris dalam tabel atribut mewakili piksel dari raster Anda dengan kolom untuk X_Coord , Y_Coord dan Cell_Value . Anda kemudian dapat mengulangi tabel ini menggunakan kursor (atau mengekspornya ke sesuatu seperti Excel jika Anda mau).
Jika Anda hanya memiliki satu raster untuk diproses, itu mungkin skrip tidak layak - cukup gunakan alat dari ArcToolbox. Jika Anda perlu melakukan ini untuk banyak raster, Anda dapat mencoba sesuatu seperti ini:
[ Catatan: Saya tidak punya ArcGIS 10 dan saya tidak terbiasa dengan ArcPy, jadi ini hanya garis besar yang sangat kasar. Ini belum teruji dan hampir pasti membutuhkan penyesuaian untuk membuatnya bekerja.]
Anda kemudian dapat mengulangi tabel atribut shapefile menggunakan kursor pencarian atau (mungkin lebih sederhana) menggunakan dbfpy . Ini akan memungkinkan Anda untuk membaca data dari raster Anda (sekarang disimpan dalam tabel .dbf shapefile) menjadi variabel python.
sumber
Mungkin Anda bisa membuat file dunia untuk raster, rahasia raster ke array numpy. maka jika Anda mengulang array, Anda akan mendapatkan nilai sel dan jika Anda semakin memperbarui x, y dari file dunia Anda juga akan memiliki koordinat untuk setiap nilai sel. Semoga bermanfaat.
sumber
Kode Marcin bekerja dengan baik kecuali masalah pada fungsi rasCentrX dan rasCentrY menyebabkan koordinat ouput muncul pada resolusi yang berbeda (seperti yang diamati oleh Grazia). Perbaikan saya adalah untuk berubah
untuk
dan
untuk
Saya menggunakan kode untuk mengonversi ESRI Grid ke file CSV. Ini dicapai dengan menghapus referensi ke inRaster2, lalu menggunakan csv.writer untuk menampilkan koordinat dan nilai-nilai:
Saya juga tidak menemukan transpose yang diperlukan di
jadi dikonversi ke
sumber
Jelek tetapi sangat efektif:
sumber
Solusi sederhana menggunakan paket python open source:
Fiona berguna karena Anda dapat membuka shapefile, beralih melalui fitur, dan (seperti yang saya miliki) menambahkannya ke
dict
objek. Memang Fionafeature
sendiri sepertidict
juga, sehingga mudah untuk mengakses properti. Jika poin saya memiliki atribut, mereka akan muncul di dikt ini bersama dengan koordinat, id, dll.Rasterio berguna karena mudah dibaca dalam raster sebagai array yang numpy, tipe data yang ringan dan cepat. Kami juga memiliki akses ke
dict
properti raster termasukaffine
, yang merupakan semua data yang kami butuhkan untuk mengonversi raster x, y koordinat menjadi baris array, koordinat col. Lihat penjelasan bagus @ perrygeo di sini .Kita berakhir dengan
pt_data
tipedict
yang memiliki data untuk setiap titik dan diekstraksiraster_value
. Kami dapat dengan mudah menulis ulang shapefile dengan data yang diekstraksi juga jika kami mau.sumber