Vektör noktasına göre en yakın raster hücre değerini mi buldunuz?


9

ArcGIS'te iki katmanım var: Biri bir vektör noktası, diğeri bir raster katmanı. Raster veri kılavuzunun değerini vektör noktasına eklemek istiyorum. Sorun, vektör noktasının değeri olan mevcut ızgara ızgaralarından uzak olmasıdır, bu nedenle "Örnek" komutu bu vektör noktası için değer döndürmez.

Benim sorum şu: Bir vektör noktası verilen en yakın tarama hücresini nasıl bulabilirim ve değeri hücreden nasıl çıkarabilirim?

Aslında yapmam gereken iki şey var:

  1. Bir ranger içindeki dış çizgiyi tanımlayın (Genellikle mevcut rasterimden 1-2 hücre uzakta)
  2. Bir aralıktaysa, onlara en yakın taramadan bir değer atayın

Düzenlendi: Yaklaşık 3000 vektör noktam var ve sorunum şu: resim açıklamasını buraya girin

Raster değerini vektör noktalarına konumlara dayalı olarak eklemem gerekiyor. "Örnek" aracını kullandım ve çoğu nokta için iyi çalışıyor.

Ancak, böyle bir durum var resim açıklamasını buraya girin

Sağ nokta değeri rasterden alabilir ("Örnek" çalışır) ancak sol nokta hizalama sorunları nedeniyle olamaz.

Raster çokgene çalışmıyor çünkü onları alan dışına oldukları için vektör haline getiremediğim hata mesajı alıyorum. Ayrıca bunun gibi puanlarım varresim açıklamasını buraya girin

Bu üst noktalar herhangi bir değer almamalıdır çünkü rasterden çok uzaktalar.

Etrafta çalışacak bazı şeyler düşündüm:

Adım 1. Önce "örnek" yapın

Adım 2. "Örnek" işlemlerinden sonra null değeri seçin

Adım 3. Boş noktaları temel alarak tampon bölgeleri (1 ondalık derece içinde) oluşturun

Adım 4. Bölgesel istatistikleri kullanın ?? ? veya arabellekteki tüm raster hücreleri arasında dolaşmak, en yakını bulmak, değerini çıkarmak ve vektör noktasına koymak için başka araçlar.

4. adımda takılı kaldım. ArcSDK'da bu işlevi gerçekleştirmek için hangi aracı kullanabileceğimi bilmiyorum.

Yoksa başka ... Bununla başa çıkmak için daha iyi bir fikrin var mı?

Bunun gibi 20 raster katmanım var ve bunu otomatik olarak yapmak istiyorum (model oluşturucu ve arcobject kullanarak).


@whuber: Metodunuz çok zekice geliyor. Sorum şu: Küresel ölçekte veri işliyorum ve ana hat için x0 ve x1'i nasıl belirleyebilirim?
Görülme

Projeye ekledikten sonra özelliklerini inceleyin.
whuber

1
Bölgesel istatistikler çıkmaz sokaktır. Düzenlemenize dayanarak, basit bir doğrudan çözüm var: Raster'i sınırının biraz etrafında genişletin ve genişletilmiş rasterden örnek alın. Bunu yapmanın birçok yolu vardır, ancak hepsi raster hesaplamalarıyla küçük bir tesis gerektirir. En basitlerinden biri, analiz kapsamını genişletmek, bir odak ortalaması hesaplamak ve ('con' kullanarak) değerlerini NoData sınır bölgesine yapıştırmaktır. Bu, her bir tarama dışı örnek konumuna ortalama raster değerleri atar.
whuber

@whuber Başka bir sorun daha var, ana hatların nerede olduğunu bilmiyorum. Yani benim sürecimde aslında 2 prosedür var: dış çizgileri tanımlayın ve onlara değer atayın.
Görülme

"Anahat" nedir? Raster değerinin kapsamadığı bir noktaysa, yardım edemezsiniz, ancak bulamazsınız: bunlar, Samplearacı uyguladığınızda herhangi bir değer almayan noktalar olacaktır .
whuber

Yanıtlar:


8

Raster taslağı, başlangıç ​​noktasının sol alt köşesinde sınırlanmış, koordinatları (say) (x0, y0) ve sağ üst köşesinde (x1, y1) bulunan bir dikdörtgeni işgal eder: bunlar herhangi bir rasterde kolayca keşfedilen özelliklerdir. Raster kapsamı dışındaki herhangi bir noktayı raster sınırındaki en yakın noktaya taşımak ve raster değerlerini yeni konumlardan çıkarmak için bu bilgileri kullanabilirsiniz.

Bunun gibi görevler genellikle daha düşük boyutlar dikkate alınarak kolayca çözülür . Tek boyutlu bir taramanın kapsamı, geleneksel olarak yazılmış [x0, x1] gibi x0 ila x1> x0 arasında sadece bir sayı aralığıdır. Bu aralıktaki belirli bir sayıya en yakın noktayı bulmak istediğinizi varsayalım. Üç durum vardır: x <x0 (x sola doğrudur), x0 <= x <= x1 (x aralıktadır) ve x1 <x (x sağa doğrudur). Açıkça en yakın noktalar sırasıyla x0, x ve x1'dir. Bu sonuç için bir formül

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

Gördüğünüz gibi üç vakanın her birini ayrı ayrı düşünerek.

Rasterlerin boyutu, [x0, x1] * [y0, y1] olmak üzere iki aralıklı Kartezyen ürünü olduğundan , aynı formül iki boyutta çalışır. Sadece her aralığa uygulayın. Böylece, yansıtılan noktanın koordinatları (Alan Hesaplayıcısında, diyelim ki) şu şekilde hesaplanabilir:

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

İşte bu formül, bir ızgaranın çevresine ve içine rastgele yerleştirilmiş 100 nokta ile eylemde:

şekil

Kesik çizgiler, taşınacakları konumların kapsamı dışındaki noktaları görsel olarak ilişkilendirir.

Bu hesaplanan koordinatlardan bir nokta katmanı oluşturun Sampleve raster değerlerini ayıklamak için aracı uygulayın . Sonuçları orijinal nokta katmanına geri ekleyin.

Pratik bir mesele olarak , yeni noktaların ızgara kapsamı içinde uzanmasını engelleyebilecek kayan nokta yuvarlanması ile ilgili sorunları önlemek için, x0 ve y0'ı gerçek kökenden biraz daha büyük yapmak akıllıca olacaktır (onlara hücre boyutunun yarısını ekleyebilirsiniz) ve benzer şekilde, x1 ve y1'i biraz daha küçük yapın.

Özetle , iş akışı orijinal nokta katmanının tablosundaki iki alanı (yeni koordinatlar) hesaplamak, bu yeni koordinatlardan bir nokta olay katmanı oluşturmak, Samplearacı çalıştırmak ve bir veritabanı birleştirme (uzamsal birleştirme değil) işleminden oluşur.


Rasterdeki hücrelerden çok daha fazla vektör noktanız olduğunda , @celenius tarafından verilen çözümü tercih etmelisiniz (rasterleri noktalara dönüştürmeyi ve uzamsal birleştirme kullanmayı önerir). Normal olarak, rasterlerin çok sayıda hücresi vardır - milyonlarca milyarlarca - ve noktalara dönüşüm o kadar zaman alıcı ve disk tüketiyor ki dikkatle yaklaşılmalıdır.

Alternatif olarak, Celenius'un çözümünü , yalnızca sınırı boyunca değerlerle bir tamsayı ızgarası yapmak için bir raster hesaplaması kullanarak hızlandırabilirsiniz . Dönüştürme o da birkaç puan olacak çünkü bir nokta katmanına hızlı ve kolaydır. Buna "sınır katmanı" diyelim. Izgarayı sınır katman noktalarında örnekleyin, böylece ızgara değerlerini sınır katmanının öznitelik tablosuna kopyalayın. SampleOrijinal nokta katmanıyla çalıştıktan sonra , bir numunenin başarıyla alındığı tüm noktaları kaldırın. Örnekleme işlemini tamamlamak için sınır katmanını uzamsal olarak kalan noktalara birleştirin.

( Yalnızca sınırı boyunca değerlere sahip bir ızgara oluşturmanın bir yolu , sınır boyunca başarısız olan bir odak komşu operasyonu uygulamaktır: örnekler arasında eğim bulma, tepe gölgeleme, 3 x 3 mahalle odak istatistikleri bulunur. Bu, tek hücreli bir ızgara oluşturur. NoData hücrelerini algılamak ve NoData ile veri hücreleri arasında dönüştürme yapmak için IsNull ve SetNull öğelerinin kullanılması , sınır dışında NoData değerleriyle dolu bir ızgara oluşturur .)


Özetle, iş akışı orijinal nokta katmanının tablosundaki iki alanı (yeni koordinatlar) hesaplamak, bu yeni koordinatlardan bir nokta olay katmanı oluşturmak, Örnek aracını çalıştırmak ve bir veritabanı birleştirme (uzamsal birleştirme değil) işleminden oluşur. Bunu nasıl yapacağınızı açıklar mısınız? (Sorunum için resimlerimi görebilirsiniz). Teşekkürler!
görüldü

Bu problemde yaklaşık% 15 puan var. her nokta için x0 ve x1'i nasıl belirleyebilirsiniz?
görüldü

1
@ Görünen x0, y0, x1, y1 ızgaralar içindir. Nokta koordinatları (x, y), ArcGIS yardımında açıklandığı gibi Alan Hesaplayıcıda veya bu sitedeki birkaç iş parçacığında hesaplanabilir. XY nokta katmanı ve veritabanı birleştirmeleri yapmak için menü öğeleri vardır: bunlar standart, temel işlemlerdir.
whuber

4

Rasteri noktalara ( ref ) dönüştürebilir ve ardından noktalarda (rasterlerden ) noktaya uzamsal birleştirme yapabilirsiniz.

(Noktaların dün burada mekânsal olarak birleştirilebileceğini öğrendim )


1
Zekice bir yaklaşım için +1. Bunun uygulanamaz hale geldiği büyük ızgaralar için yalnızca rasterlerin sınır hücrelerini noktalara dönüştürün. (
Cevabımın

Her bir raster katmanından binlerce hücrem var ve bunun gibi 20 katmanım var ... bu yüzden bunları vektör noktalarına dönüştürmek zaman alıcı ...
görüldü

Ayrıca, çokgene tarama yapmaya çalıştığımda, ERROR 000864 gibi bir hata iletisi alıyorum Giriş raster: Giriş tanımlı etki alanı içinde değil. HATA 000863: Geçersiz GP veri türü
görüldü

Raster'i noktalara dönüştürürken hata mı alıyorsunuz?
djq

@celenius Çalışıyor ama çok zaman aldı.
Görülme

1

Raster katmanı çokgen raster aracını kullanarak raster katmanını çokgene dönüştürebilir ve uzamsal birleştirme çalıştırabilir (nokta katmanına sağ tıklayıp Birleştir ve İlişkiler - Katıl'ı seçebilir, ilk açılır menüden uzamsal birleştirme seçeneğini belirleyebilir ve en yakın olanı seçebilirsiniz. düğmesine basın) veya Yakın aracını kullanın.


Uygun raster değerini elde etmek için uzamsal birleşimin sonucunu nasıl kullanıyorsunuz?
whuber

@whuber, "ona en yakın" seçeneğini belirlediğinizde Verilere Katıl iletişim kutusunda, uzamsal birleştirme en yakın çokgen özelliğini (Raster'ten Çokgene aracından sonuç) seçer ve bu özellik bilgisini nokta özelliğine ekler. Sorduğun şey bu mu? İlk cevabım düzenlemesinden önce gönderildi. Seen'in rasterinin çokgene dönüştürülemeyecek kadar büyük olabileceğini tahmin ediyorum.
artwork21

Fikir en yakın raster bulmak değil. Gerçekten, istenen bir raster değerlerini orijinal boyutunun ötesinde tahmin etmenin bir yoludur. Soru en yakın komşu yaklaşımı önermektedir: rasterde olmayan herhangi bir noktada, rasterdeki en yakın hücreyi bulun ve o hücrenin değerini kullanın.
whuber

Son yorumunuzu yeniden okuduktan sonra, raster "bir çokgene" değil , her hücre (veya bitişik hücre kümesi) için bir çokgen içeren bir çokgen katmanına dönüştürülmeyi öneriyor olabilirsiniz . Öyleyse, çok küçük rasterlerle başarılı olabilir, ancak daha önce sunulan benzer ama daha verimli bir çözüm yerine neden karmaşık, pahalı bir işlem olan (ve yalnızca tamsayı ızgaraları için çalışır) bunu öneriyorsunuz? Çözümünüz ne gibi avantajlar sunuyor?
whuber

@whuber, çokgen katmanı doğrudur. Evet, celenius yöntemi daha az belleğe mal olur.
artwork21
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.