Menemukan nilai sel raster terdekat berdasarkan titik vektor?

9

Saya memiliki dua lapisan di ArcGIS: Satu adalah titik vektor dan yang lainnya adalah lapisan raster. Saya ingin menambahkan nilai grid data raster ke titik vektor. Masalahnya adalah titik vektor jauh dari grid raster yang ada dengan nilai, jadi perintah "Sampel" tidak mengembalikan nilai untuk titik vektor tersebut.

Jadi pertanyaan saya adalah: Bagaimana saya bisa menemukan sel raster terdekat diberi titik vektor dan mengekstrak nilai dari sel?

Sebenarnya ada dua hal yang perlu saya lakukan:

  1. Identifikasi outliner di dalam ranger (Biasanya 1-2 sel jauhnya dari raster yang ada)
  2. Tetapkan nilai dari raster terdekat kepada mereka, jika mereka berada dalam kisaran

Diedit: Saya memiliki sekitar 3000 titik vektor dan masalah saya adalah ini: masukkan deskripsi gambar di sini

Saya perlu menambahkan nilai raster berdasarkan lokasi ke titik-titik vektor. Saya menggunakan alat "Contoh" dan berfungsi dengan baik untuk sebagian besar poin.

Namun, ada situasi seperti ini masukkan deskripsi gambar di sini

Titik kanan bisa mendapatkan nilai dari raster ("Contoh" berfungsi) tetapi titik kiri tidak bisa karena masalah perataan.

Raster ke poligon tidak berfungsi karena saya mendapatkan pesan kesalahan bahwa saya tidak dapat mengubahnya menjadi vektor karena mereka keluar dari domain. Saya juga punya poin seperti inimasukkan deskripsi gambar di sini

Poin-poin teratas itu seharusnya tidak mendapatkan nilai apa pun karena mereka terlalu jauh dari raster.

Saya memikirkan cara untuk bekerja:

Langkah 1. Lakukan "sampel" terlebih dahulu

Langkah 2. Pilih nilai nol setelah operasi "sampel"

Langkah 3. buat zona penyangga (dalam 1 derajat desimal) berdasarkan titik nol

Langkah 4. gunakan statistik zona ?? ? atau alat lain untuk loop melalui semua sel raster di buffer, temukan yang terdekat, ekstrak nilainya dan taruh di titik vektor.

Saya terhenti di langkah 4. Saya tidak tahu alat apa di ArcSDK yang bisa saya gunakan untuk mencapai fungsi ini.

Atau yang lain ... Apakah Anda punya ide yang lebih baik untuk menghadapinya?

Saya memiliki 20 layer raster seperti ini dan saya ingin membuatnya secara otomatis (menggunakan model builder dan arcobject).

Terlihat
sumber
@whuber: Metodemu terdengar sangat pintar. Pertanyaan saya adalah saya menangani data pada skala global dan bagaimana saya bisa menentukan x0 dan x1 untuk raster garis besar?
Terlihat
Periksa propertinya setelah menambahkannya ke proyek.
whuber
1
Statistik zona adalah jalan buntu. Berdasarkan hasil edit Anda, ada solusi langsung sederhana: perluas raster sedikit di sekitar batasnya dan cicipi raster yang diperluas. Ada banyak cara untuk melakukan ini, tetapi mereka semua memerlukan sedikit fasilitas dengan perhitungan raster. Salah satu yang paling sederhana adalah memperbesar jangkauan analisis, menghitung rata-rata fokus dan (menggunakan 'con') menempelkan nilainya ke zona batas NoData. Ini menetapkan rata-rata nilai raster terdekat untuk setiap lokasi sampel off-raster.
whuber
@whuber Ada masalah lain adalah saya tidak tahu di mana outliners berada. Jadi sebenarnya ada 2 prosedur dalam proses saya: mengidentifikasi outliner dan memberikan nilai kepada mereka.
Terlihat
Apa itu "outliner"? Jika suatu titik tidak tercakup oleh nilai raster, Anda tidak dapat membantu tetapi menemukannya: ini akan menjadi titik yang tidak menerima nilai apa pun ketika Anda menerapkan Samplealat.
whuber

Jawaban:

8

Garis besar raster menempati persegi panjang yang dibatasi di kiri bawah oleh asalnya, memiliki koordinat (katakanlah) (x0, y0), dan di kanan atas oleh (x1, y1): ini adalah properti yang mudah ditemukan dari raster apa pun. Anda dapat menggunakan informasi ini untuk memindahkan titik di luar batas raster ke titik terdekat pada batas raster dan mengekstrak nilai raster di lokasi baru.

Tugas-tugas seperti ini sering kali diselesaikan dengan mempertimbangkan dimensi yang lebih rendah . Tingkat raster satu dimensi hanyalah interval angka, katakanlah dari x0 ke x1> x0, ditulis secara konvensional [x0, x1]. Misalkan Anda ingin menemukan titik terdekat dalam interval ini ke angka yang diberikan x. Ada tiga kasus: x <x0 (x ke kiri), x0 <= x <= x1 (x ada dalam interval), dan x1 <x (x adalah ke kanan). Jelas poin terdekat adalah masing-masing x0, x, dan x1. Formula untuk hasil ini adalah

x -> min (maks (x, x0), x1),

seperti yang Anda lihat dengan merenungkan masing-masing dari tiga kasus secara terpisah.

Karena luasnya raster adalah produk Cartesian dengan dua interval, [x0, x1] * [y0, y1], rumus yang sama bekerja dalam dua dimensi. Cukup terapkan pada setiap interval. Dengan demikian koordinat titik yang diproyeksikan dapat dihitung (dalam Kalkulator Lapangan, katakanlah) sebagai

(x, y) -> (min (maks (x, x0), x1), min (maks (y, y0), y1).

Berikut adalah rumus ini dalam aksi dengan 100 poin yang ditempatkan secara acak di sekitar dan dalam batas kotak:

Angka

Garis putus-putus mengasosiasikan titik di luar batas ke lokasi di mana mereka akan dipindahkan.

Buat layer titik dari koordinat yang dihitung ini dan terapkan Samplealat untuk mengekstrak nilai raster. Gabungkan hasilnya kembali ke lapisan titik asli.

Sebagai hal yang praktis , untuk menghindari masalah dengan penyatuan titik mengambang yang mungkin membuat titik-titik baru tidak berada dalam jangkauan kisi, akan lebih bijaksana untuk membuat x0 dan y0 sedikit lebih besar dari asal yang sebenarnya (Anda mungkin menambahkan setengah dari ukuran sel ke mereka) dan, juga, buat x1 dan y1 sedikit lebih kecil.

Singkatnya , alur kerja terdiri dari penghitungan dua bidang (koordinat baru) di tabel lapisan titik asli, membuat lapisan peristiwa titik dari koordinat baru tersebut, menjalankan Samplealat, dan melakukan penggabungan basis data (bukan gabungan spasial).


Ketika Anda memiliki lebih banyak titik vektor daripada sel dalam raster , Anda harus memilih solusi yang diberikan oleh @celenius (yang mengusulkan konversi raster ke titik dan menggunakan gabungan spasial). Namun, biasanya, raster memiliki banyak sel - jutaan hingga miliaran - dan konversi ke titik sangat memakan waktu dan memakan disk sehingga harus didekati dengan hati-hati.

Atau, Anda bisa mempercepat solusi Celenius dengan menggunakan perhitungan raster untuk membuat kisi integer dengan nilai hanya sepanjang batasnya. Konversi yang ke lapisan titik adalah cepat dan mudah karena akan memiliki beberapa poin. Sebut saja ini "lapisan batas." Contoh grid pada titik-titik layer batas, dengan demikian menyalin nilai-nilai grid ke tabel atribut layer boundary. Setelah berjalan Sampledengan lapisan titik asli, hapus semua titik di mana sampel berhasil diperoleh. Secara spasial gabungkan layer batas ke titik yang tersisa untuk menyelesaikan proses pengambilan sampel.

(Salah satu cara untuk membuat kisi dengan nilai hanya sepanjang batasnya adalah dengan menerapkan operasi lingkungan fokus yang gagal di sepanjang batas: contoh termasuk menemukan lereng, hillshading, statistik fokus lingkungan 3 x 3. Ini menciptakan kisi dengan satu sel cincin tebal NoData di sekitar tepinya. Menggunakan IsNull dan SetNull untuk mendeteksi sel NoData dan mengkonversi antara NoData dan sel data menghasilkan kotak yang berisi nilai-nilai NoData kecuali di sekitar batas.)

whuber
sumber
Singkatnya, alur kerja terdiri dari menghitung dua bidang (koordinat baru) di tabel lapisan titik asli, membuat lapisan titik peristiwa dari koordinat baru tersebut, menjalankan alat Sampel, dan melakukan penggabungan basis data (bukan gabungan spasial). Bisakah Anda menguraikan cara melakukan ini? (Anda dapat melihat foto saya untuk masalah saya). Terima kasih!
Terlihat
Saya memiliki sekitar 15% poin memiliki masalah ini. bagaimana Anda bisa menentukan x0 dan x1 untuk setiap titik?
Terlihat
1
@ Di antara x0, y0, x1, y1 adalah untuk grid. Koordinat titik (x, y) dapat dihitung dalam Kalkulator Bidang seperti yang dijelaskan dalam bantuan ArcGIS atau dalam beberapa utas di situs ini. Ada item menu untuk membuat layer titik XY dan basis data bergabung: ini adalah operasi standar dan dasar.
whuber
4

Anda dapat mengonversi raster ke titik ( ref ), dan kemudian melakukan penggabungan spasial pada titik (dari raster) ke titik.

(Saya baru tahu bahwa poin dapat bergabung secara spasial di sini kemarin )

djq
sumber
1
+1 untuk pendekatan yang cerdas. Untuk kisi-kisi besar, di mana hal ini menjadi tidak praktis, konversikan hanya sel batas raster ke titik. (Saya jelaskan bagaimana di akhir jawaban saya.)
whuber
Saya memiliki ribuan sel dari setiap lapisan raster dan saya memiliki 20 lapisan seperti itu ... jadi mengubah mereka menjadi titik-titik vektor memakan waktu ...
Dilihat
Juga, ketika saya mencoba melakukan raster ke poligon, saya mendapatkan pesan kesalahan sebagai ERROR 000864 Input raster: Input tidak ada dalam domain yang ditentukan. GALAT 000863: Tipe data GP tidak valid
Terlihat
Apakah Anda mendapatkan kesalahan saat mengonversi raster ke poin?
djq
@celenius Berhasil tetapi butuh waktu lama.
Terlihat
1

Anda bisa mengonversi layer raster menjadi poligon menggunakan alat Raster to Polygon dan menjalankan spatial join (klik kanan pada layer point dan pilih Joins and Relates - Join, pada drop down pertama pilih opsi spatial join dan pilih yang terdekat untuk opsi pada tombol readio), atau gunakan alat Dekat.

artwork21
sumber
Bagaimana Anda menggunakan hasil dari join spasial untuk mengekstraksi nilai raster yang sesuai?
whuber
@whuber, dalam dialog Gabung Data ketika Anda memilih opsi "paling dekat dengan itu" join spasial memilih fitur poligon terdekat (hasil dari alat Raster ke Polygon) dan menambahkan info atribut ini ke fitur titik. Apakah ini pertanyaan yang Anda tanyakan? Balasan awal saya diposting sebelum editnya. Saya menduga raster Seen mungkin terlalu besar untuk dikonversi menjadi poligon?
artwork21
Idenya bukan untuk menemukan raster terdekat. Sungguh, apa yang diinginkan adalah cara untuk meramalkan nilai-nilai raster di luar batas aslinya. Pertanyaannya mengusulkan pendekatan tetangga terdekat: pada titik terdekat tidak pada raster, cari sel terdekat di raster dan gunakan nilai sel itu.
Whuber
Setelah membaca kembali komentar terakhir Anda, Anda mungkin mengusulkan untuk mengubah raster bukan menjadi "poligon" tetapi menjadi lapisan poligon dengan satu poligon untuk setiap sel (atau rangkaian sel yang berdekatan). Jika demikian, ini mungkin berhasil dengan raster yang sangat kecil, tetapi mengapa Anda mengusulkan ini - yang merupakan operasi yang kompleks dan mahal (dan hanya bekerja untuk grid integer) - bukannya solusi serupa tetapi lebih efisien yang ditawarkan @celenius sebelumnya? Apa keunggulan yang ditawarkan solusi Anda?
whuber
@whuber, lapisan poligon sudah benar. Ya, metode celenius akan membutuhkan memori lebih sedikit.
artwork21