ArcGIS'te yeni olan ve iki nokta arasındaki mesafeyi “balık yüzerken” hesaplamak istiyor


9

Belirli bir ödevin su alanı olan Hidrografi adlı bir katmanımız var. Bir istasyon noktam ve bir hedef noktam var. Bu iki nokta arasındaki mesafeyi hesaplamam gerekiyor ama hidrografinin içinde. (tekneler karadan geçemezler)

DefenseService mesafe hesaplaması pasif görünüyor, ancak herhangi bir Raster'i girdi olarak almadığı için düz bir çizgi gibi görünüyor. Öklid neredeyse orada gibi gözüküyor ama ileri doğru hiçbir şey bulamıyorum.

ArcGIS Explorer 2500, ArcGIS for Server 10.1 SP1 Enterprise kullanıyorum ve hizmetlerimizi ve araçlarımızı C # ile yazıyoruz.

Hidrografinin yüklenmesi, IPoints'in oluşturulması, ancak bundan sonra ne yapacağım konusunda bir kayıp var!

Herhangi bir yardım takdir, lütfen.


1
Burada 'kabul edilmiş cevap yok' ama bence çok benzer bir soru: gis.stackexchange.com/questions/33799/…
Mapperz

Heyecan seviyem programcı olmadığını söyleyene kadar hemen yükselmeye başladı. Bu araçlar kullanılarak yapılamaz. Seçilen bir konuma ve hedeflerin listesine sahip özel bir araç penceresi var. Sunucuda bir yöntemi çağırmak ve her hedefe mesafeleri ile listeyi doldurmak gerekiyor.
SASS_Shooter

Hidrografi katman çizgileriniz veya çokgenleriniz mi?
Conor

Bir raster haline dönüştürdüğümüz çokgenler.
SASS_Shooter

Kullanım durumunuz biraz kafa karıştırıcı. Bir gölün kenarındaki iki noktadan en kısa mesafeyi mi bulmaya çalışıyorsunuz? Veya istasyonlarınız bir nehir istasyonuna (gölün dibinde) karşılık geliyor mu?
DPierce

Yanıtlar:


4

Uzamsal Analist Uzantısından Maliyet Mesafesi ve Maliyet Yolu Araçlarını kullanın .

Hidrografi Çokgenlerinizden bir Raster oluşturabilirsiniz. Daha sonra, suyu temsil eden tarama hücrelerinin düşük bir değer (örneğin 1) ve diğer tarama hücrelerinin yüksek bir değer (örneğin 1000) aldığından emin olun. Daha sonra bu raster kullanabilirsiniz maliyet mesafesi raster içinde Maliyet Path Aracı .


Evet - Maliyet Mesafesinin girdi olarak bir raster aldığını ve başlangıç ​​ve bitiş için hidrografi rasterindeki puanlarımın bulunduğunu buldum. Döndürülen değer, uzunluk elde edebileceğim bir Polyline.
SASS_Shooter

1

Kanallar ve doğal su yolları üzerinde centrelines için benzer bir şey yaptım. Kullandığım yaklaşım noktaları TIN yapmak, TIN'i ikiye ayırmak ve sonra orijinal köşelerden ikinci bir TIN oluşturmak ve daha sonra en iyi çözümü oluşturmayacakları anlaşılır hale geldiği anda değiştirilmiş bir Dijkstra algoritmasını kullanarak değiştirilmiş bir TIN oluşturmaktı. . Değişiklik, hattın 'çözüm' noktasında sonlanabileceği ya da daha önce var olan önceki bir yolun olabileceğiydi. Bunun için hazır bir çözüm yoktur ve bir programcı değilseniz veya en azından birinin iyi tarafına girecek bir konumda değilseniz, tek seçeneğiniz bir coğrafi veri tabanına bir ofset ile izlemek ve şekil_uzunluğu alanı.


TIN = Üçgen Düzensiz Ağ, her nokta en yakın komşularına bağlanacak ve hiçbir çizgi kesişmeyecek şekilde bir kafes kafes ve bağlantı çizgileri. Bunun için bkz. Http://en.wikipedia.org/wiki/Delaunay_triangulation . ESRI TIN nesnelerini kullanmadım, bunun yerine üçgenleme için bir kod buldum ve onları bellekte tuttum, http://www.codeproject.com/Articles/492435/Delaunay-Triangulation-For-Fast-Mesh-Generation gibi bir şey .

En kısa yol algoritması için bkz. Http://en.wikipedia.org/wiki/Dijkstra 's_algoritması güzel bir resme sahiptir; karmaşık isme rağmen gerçekten çok basit.

Çizgileri oluşturan noktalardan bir Delaunay üçgenleme yaptım, daha sonra üçgenin her bir kenarının orta noktasını (temel geometri ... ortalama X, ortalama Y) buldum ve daha sonra çokgenlerin içine düşen noktaları, orta yol ve sınırdaki tüm köşelere bağlantılar. Daha sonra, su yolunun bankalarını takip eden yönler hariç, Dijkstra algoritmasını kullanarak ağı izler ve sonunda A noktasından B noktasına yaklaşık olarak su yollarının merkezinden aşağı doğru giden bir yol bulacaksınız. Olası birçok yol olacak, bu yüzden her bir tepede bir ağırlık tuttum ve kümülatif uzunluk kaydedilen uzunluğu aştığında bir yolu durdurdum ve eğer daha az olsaydı, apeksi daha kısa kümülatif uzunlukla güncelleyin - bu, izlenen yollar ve oldukça fazla olabilir;

Alternatif olarak, üçgenleştirildikten sonra, üçgenlerin kenarlarını bir özellik sınıfı olarak iki nokta çizgisine dönüştürebilir, bir ağ oluşturabilir ve ardından bir iz yapabilirsiniz. ESRI izleme rutinlerinin benimkinden çok daha hızlı olduğundan eminim, ancak özel bir ihtiyacım vardı ve geometrik ağları kullanarak çözemedim.


Michael - Ben bir C # geliştiricisiyim. ArcGIS ve programlama araçları için çok yeni. Military Analyst kullanarak bir çözüm buldum, ancak tüm bilgeliklerinde ESRI onu bırakıyor. Puanları TIN ile ne demek istediniz ve hangi Dyjkstra algoritmasını kullandınız?
SASS_Shooter

1

Ben gelecekte bu konu okur herkes için ekliyorum.

İşte ben bu konuya kazma ve puanlar arasında tam bir mesafe elde öğrendim.

İlk sayımız RasterCatalog'un statik doğasından kaynaklandı. Bunun dayandığı rasterlerin değiştirilmesi RasterCatalog içindeki raster DEĞİŞTİRMEZ. Bizimki kıyı şeridi haritasına yakın hiçbir yerde olmayan eski bir versiyona sahipti. Alınan Ders: RasterCatalog'u HER ZAMAN temel alan Rasterleri değiştirdiğinizde yeniden oluşturun.

Ağırlıklar eklenen Mesafe Rasterı, çalışmak için oldukça hantal bir şey haline gelir. Şu senaryoya bakın: Raster orijinal değeri 1 toplam mesafedir. Bakmak istediğim mesafe 117 km'dir. Hücre boyutu 1 metredir. Raster artık 48 ağırlıklı bir değer ise, bakmak istediğim toplam mesafe 117 km * 48 olur! Dolayısıyla, CostDistance yöntemindeki mesafe hücre mesafesi değil, ağırlıklı mesafe, görünüşe göre her bir hücrenin toplamı = toplam mesafe için geçen değer olana kadar her bir hücredeki değeri ekler. Hücre boyutu 1 metre olsa bile !!!

Mesafe rasterinin tümü bir başlangıç ​​noktasına odaklanmıştır. Dolayısıyla, CostDistance yordamını çağırdığınızda, kaynak noktasını bu listeye dahil etmek istemezsiniz. bunu yaparsanız, 0 mesafe ile bir puan alırsınız (bu bile ESRI desteği gergin)

Yöntemlerin çoğu, işlemlerini kısıtlamak için Zarf'ı kullanırken, raster için bir değer ayarlayarak ve çokgen içinde bir alanı olmayan bir raster çıkarırken, tüm zarf ayarlarını yok sayar ve bunu otomatik olarak her zaman raster için uygular. Ne yazık ki bizim için, bunu sadece büyük örtüşen segmentler oluşturarak ve belirli bir kutulu alana bir segment atayarak kısaltabiliriz. Ancak bunu yaparken, örtüşen yanlış alanda birincil operasyon alanının bulunmamasına dikkat etmeliyiz (ki bu zor). (diğer bir deyişle, tüm örtüşmelerimizin herhangi bir birincil ilgi alanı içermeyecek şekilde dikkatle seçilmesi gerekir!) Bunun nedeni RasterCatalog'da seçilen Sahil Güvenlik istasyonunun bulunduğu yere göre doğru raster seçilmesidir. Sürecimizi daha da karmaşıklaştırmak için, örtüşme, haritanın kenarından kaçmadan ve diğer birincil ilgi noktalarıyla örtüşmeden menşe noktamızdan 120km'ye kadar gitmemize izin vermelidir. Sheesh.

Öğrendiğim diğer tek şey, raster için matematik yapmanın kolay olmasıdır, ancak rasterde 'tıkanıklık açmak' (blokajlar) veya bir değere sahip bir çörek ayarlamak ve çörekin bir değeri 1 (kilit gibi gecikmeler) karmaşık araçlar ve ArcObject çağrıları kombinasyonu ile sonuçlanır. Bu da öğrenilen son derse götürür: ArcObjects her şeyi yapamaz. Bu yüzden, bazen python ile yazılmış yavaş, hantal araçlarda bir şeyler yapmak zorunda kalıyorum. Ayrıca ESRI araç geliştiricilerinin tutarlılığı koruma konusunda hiçbir şey bilmediklerini öğrendim. Bazen bir raster veri tabanı aldılar, diğer zamanlarda bir rastere ihtiyaç duydular ve bazen bir özellik setine ihtiyaçları vardı. Ve verileri girdi olarak ihtiyaç duydukları formatta döndürmezler!

Şaşkın? Endişelenme, bu ESRI.

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.