Kapsayı hesaplamak için bir algoritma + bir dizi arktan örtüşüyor


10

Gübre bir çiftliğe yayılan bir kamyonun kat ettiği yolu temsil eden yaylar içeren bir şekil dosyası var.

Diyelim ki yayılma genişliği 30m, yani kamyon gübre aracın her iki yanında 15m yayılabilir.

Şunu gösteren bir çokgen kümesi oluşturmak istiyorum:
1) Gübre alan toplam alan
2) Çakışma alanları, yani iki ayrı geçişin birbirine çok yakın olduğu, böylece çiftliğin bazı kısımları iki kez doğru "dozu aldı "gübre.

Saf bir yaklaşım, sadece yayların etrafında tamponlar olarak kapsama poligonları oluşturmaktır. Bu, yayılma çizgilerinin birbirinden farklı olduğu özel durumda çalışır. Bununla birlikte, kamyon sürekli olarak azalan bir sarmalda çiftliğin etrafında dolaşabilir ve basit bir tampon, sarmalın iki geçişinin birbirine çok yakın olduğu örtüşmeleri gösteremez (sarmal tek bir yaysa, üst üste binen parçaları olmayan tek bir çokgen).

İlgili ise, TatukGIS VCL DK kullanıyorum, ancak gerçekten belirli bir çözüm yerine bir algoritma arıyorum.

Şu ana kadar tartışmaya yanıt olarak bazı açıklamalar:

1) Herhangi bir meta verisi olan vektör verilerine güvenemiyorum (örn. GPS günlükleri veya yayılma oranı). Kullanıcının bir katman seçmesine ve bir genişlik genişliği belirtmesine izin veriyorum, sonra rapor çalışıyor.

2) Raporun amacı, kullanıcıya "vasıflı" anlamına gelen "en düşük çakışma ile en yüksek kapsama alanı" sağlayan araç operatörünün ne kadar "yetenekli" olduğunu göstermektir.

3) Vektör arazisinde raster arazisinden daha rahatım, bu yüzden vektör tabanlı çözümleri tercih edeceğim.

Teşekkürler,

Darren.


1
Bunun tahmin edilen fırtına yollarına dayalı kümülatif yağış tahmin eden yöntemlere benzer olup olmayacağını merak ediyorum.
Kirk Kuykendall

Yanıtlar:


3

Belki de en basit çözüm, tek geometriyi parçalara ayırmak ve bu ayrı segmentleri tamponlamaktır: spiral durumunuzda, her bir yayı tamponlar, ardından bir sayı bulmak için tek tek yaylarla kesişirsiniz. Segmentlerin uçlarını sadece segmentlerin soluna ve sağına tamponlayarak yanlış çakışmalardan kaçınmaya dikkat edin.

Başka bir yaklaşım, veriler üzerinde bir çokgen ızgarayı kaplamaktır ve daha sonra her ızgara hücresi içinde kesişen her çizgi parçasını ayrı ayrı tamponlar. Bu konuda doğru olmak için, ızgara hücresini analiz altına almak, arabelleğe almak, daha sonra kesişen segmentleri toplamak ve bunları tamponlayarak orijinal hücre penceresinde analiz etmek istersiniz.

Bu seçeneklerin her ikisi de size örtüşmenin makul bir tahminini vermelidir, birkaç daha doğru yaklaşım düşünebilirim, ancak veriler hakkında bir şeyler bilmeleri gerekir.


Teşekkürler. İlk önerinizin çizgileri boyunca düşünüyordum - geometriyi parçalara ayırıp tamponlama. Sanırım segmentlerin uçlarını da tamponlamam gerekecek, böylece köşelerde yuvarlak kenarlar elde edeceğim. Dik açılı bir çizgiyle başladığım durumu düşünürsek - uçları arabelleğe almazsam, köşenin dışında bir kare eksik olan üst üste gelen iki dikdörtgenle sonuçlanırım (metin olarak ifade etmek zor!)
20'de dbruning

Sanırım segmentlerin uçlarını da tamponlamam gerekecek, böylece köşelerde yuvarlak kenarlar elde edeceğim. Ayrıca, her bir segment için tamponu bir önceki segment için tamponla kesişmeyi ve sonra her tamponun sadece "yeni" kısımlarını bir ana tamponda biriktirmeyi düşünüyordum. Göz ardı edilmesi fikri, önceki segmentle çakışıyor, ancak pikap daha eski segmentlerle çakışıyor.
20'de dbruning

2

Çözüm yok, ancak bazı girdiler:

Bu sorun, harita genellemesinde çizgi birleşme tespit problemine benzemektedir . Kıvrımlı bir çizgiye büyük bir stil uygulandığında ortaya çıkar (sembol kendiliğinden çakışır):

resim açıklamasını buraya girin

Bu belge sf. 176 ila 180 (Fransızca ... üzgünüm), kendi kendine kesişen parçaları tespit etmek için bir algoritma verir. İlke, scw tarafından önerildiği gibi , bir segment artı 0, 1 veya 2 daire yayından oluşan her bir segmentin tek bir yan tamponunu kullanmaktır. JTS , bu tek taraflı tamponun yararlı olabilecek bir uygulamasını içerir.


Neden kendi kesişim noktalarını tespit etmekle ilgileniyorsunuz? Ve neden "tek taraflı" tamponlar öneriyorsunuz? Sorunun hiçbiri de almanca görünmüyor.
whuber

Amaç, kamyonun birkaç kez gübre yaydığı yeri, yani yayılma alanının kendisiyle kesiştiği yeri tespit etmektir.
julien

2

Bir vektör çözümü, potansiyel olarak kritik bir değişkeni kaçıracaktır : zaman ve onun aracılığıyla yayılma oranı. Traktör daha hızlı hareket ettiğinde, birim alan başına daha az gübre yayılır ve daha yavaş hareket ettiğinde (bir dönüşe yavaşlama ve birinden hızlanma) birim alan başına daha fazla gübre yayılır. Ayrıca, traktör dönerken malzemeyi yayarsa, malzeme dönüşün içine doğru daha yoğun olacak ve dışarıya daha az konsantre olacaktır.

Zaman verileri, traktörün ilerlemesinin GPS kaydında mevcut olacaktır. Eğimler (kat edilen mesafenin geçen zamana bölünmesi) her noktadaki hızları tahmin edecektir. Alternatif olarak, (yaklaşık olarak) bir alanın içi içinde sabit bir hız ve alanın sınırının makul bir dahili tamponu içinde daha düşük bir hız kabul edilebilir.

Raster temsili bu sorunları çözebilir. Traktörün yolunu rasterleştirin. Bu, traktör tarafından geçilmeyen tüm hücreleri NoData değerlerine (veya sıfıra) ayarlar. Traktör standart, sabit bir hızda hareket edecek olsaydı, veri hücrelerinin her birine sabit bir değer koymak yeterli olacaktır. Şimdi, örneğin, traktör bu hızın iki katında hareket ediyor olsaydı, (muhtemelen) uygulama oranı yarıya inerdi ve bu, hücrelerdeki değerin yarıya indirilmesiyle temsil edilebilir.

Genel olarak, herhangi bir hücreye konacak değer birim alan başına uygulama oranıdır . Traktör, y m / sn hızında seyahat ederken saniyede x Kg gübre her iki tarafa 15 m'ye eşit olarak yayılıyorsa , x / y Kg / sn / [m / sn] / (2 * 15 m) = x / (30 y ) Kg / m ^ 2 gübre. Dolayısıyla, x / (30 y ) her hücreye konacak değerdir. x verilir ve y GPS verilerinden hesaplanır.

Kendiliğinden kesişme prensipte sorun değildir . Traktörün yolu kendi kendine kesişirse, bir hücreyi her karşıladığında katkıları ekleyin. Şebekenin nasıl oluşturulduğuna ve CBS yazılımının yeteneklerine bağlı olarak, bunu gerçekleştirmek için bazı özel işlemlerin yapılması gerekebilir.

Bu hazırlığı yaptıktan sonra, geri kalanı hızlı ve kolaydır: 15 m yarıçaplı dairesel bir mahalle kullanan bu ızgaranın odak toplamı , her hücrede birim alana yayılan kümülatif miktarı bulur.


1
+1, çekirdeğin (traktörü temsil eden) bir yol boyunca (her sıra yerine) hareket etmesine izin veren bir aracınız varsa, bu sorun daha yönetilebilir olacaktır.
Kirk Kuykendall

@Kirk Bir yolu, satırları veya çekirdeği olan her şeyi takip etmeye gerek yoktur. Odak toplamına eşlik eden bakış açısı değişikliğini takdir etmek önemlidir: soruna bir nokta yolundan malzeme yaymak olarak soruna bakmak yerine, alana her noktada ne kadar malzeme biriktiğini hesaplamaktan biri olarak bakın. . Açıkçası aynı çözümle aynı problem. Hareketli çekirdek yaklaşımı (ve önerilen tamponlama yaklaşımları) ilk bakış açısını alır; odak toplamı, ikincisi. Ancak odak toplamı aracı mevcuttur; hareketli bir çekirdek hesaplaması değildir.
whuber

Hız ve yayılma oranını biliyorsak, özetlediğiniz raster yaklaşımının en iyi yöntem olacağını düşünüyorum. Maalesef bu özel senaryoda ikisini de bilmiyoruz. Son kullanıcımız bu kapsama raporuna girdi olarak herhangi bir katman seçebilir ve belirli bir meta verisi olan geometriye güvenemeyiz.
20'de dbruning

@dbruning Bu yaklaşım bilinen hız / spread oranlarını gerektirmiyor gibi görünmektedir ; sadece onlara izin verirse (+ daha doğru gerçeklik modeli). Bununla birlikte, istediğiniz metrikleri (toplam alan kapsamı; çakışma alanı) sistemden çıkarmak için biraz hücre eşiği + sayımı gerektirecek ve orada da doğruluk ödünleşmeleri var.
Dan S.

@ dbruning Eğer spread oranını bilmiyorsanız, göreli bir spread oranı elde edersiniz. Hızı bilmiyorsanız, insanların nasıl traktör kullandıklarını hala bilirsiniz (veya bilmeleri gerekir) ve göreceli hızların makul tahminlerini türetebilmelidir. Sabit hızlar ve sabit yayılma oranları varsayarsanız yine de makul yanıtlar alırsınız; traktör güzergahlarının düz kısımları üzerinde tampon bazlı cevaplar üzerinde anlaşacaklardır; ve kavisli kısımlarda daha gerçekçi olmaları muhtemeldir.
whuber

2

StackExchange protokolünde% 100 emin değilim, bu yüzden bu sorumun cevabı olarak gönderiyorum. Sonuçta kullandığım cevap bu.

Temel algoritma:
1. Katmandaki tüm geometrileri, yayılma genişliğinin 1/2 katından daha uzun olmayan bölümlere ayırın.
2. Her bölüm için:
- Şekil boyunca geriye doğru bakarak ve bu bölümlerin kümülatif uzunluğunun yayılma genişliğinden (tampon yarıçapı = 1/2 yayılma genişliği) az olduğu önceki tüm bölümleri arabelleğe alarak bir "yuvarlama tamponu"
oluşturun - Oluşturun sadece bir sonraki segmentin bir "sonraki segment tamponu" (tampon yarıçapı = 1/2 yayılma genişliği)
- "yeni tampon" elde etmek için "bir sonraki segment tamponundan" "yuvarlanan tamponu" çıkarın
- "yeni tampon" un tümünü birleştirin şekil başına tek bir çokgen elde etmek için çokgenler birlikte.

Esasen bu, serpme aracı sürücüsünün üst üste binme cezası olmadan dik açılı (veya daha geniş) dönüşler yapmasına izin verir, ancak "eski zemine" yayılacak kadar çok keskin bir şekilde geri dönerse, örtüşmeye başlarız.

Mavi örtüşüyor

Spiral istediğim gibi görünüyor:

spiral

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.