Algoritma: kaynak çoklu çizgiyi referans çoklu çizgiye taşıma (tamamen veya kısmen)


10

Sistemimizde, bazı kaynak hatlarını (düşük hassasiyetle) referans hatlarına (yüksek hassasiyetle) taşımak istediğimiz gereksinimler vardır. Aşağıdaki resimler normal kullanım durumlarını verir. Kırmızı olan bir kaynak hattı ve mavi olan bir referans hattıdır.

Kırmızı olan kaynak hattı ve mavi olan referans hattıdır

Bu durumda, kaynak hattı kısmen hareket ettirilecek ve sonuç yeşil çizginin gösterdiği gibi olacaktır:

Sonucu taşı 1

Kaynak hattının tamamen taşınması gereken durumlar vardır.

ÖRNEK 2

Sonuç:

Sonucu taşı 2

Şu anda çözümümüz, kaynak hattının kafa / bitiş noktasını referans çizgisine yansıtmak ve bunun tersi, daha sonra kaynak ve referans çizgisinde yansıtılan noktaları bulmaktır. Bu öngörülen noktalarla, kaynak ve referans hattının gerekli kısmını çıkarabilir ve sonra bunları yeni bir tane halinde birleştirebiliriz.

Bu çoğu durumda işe yarar, ancak bu yöntemin çalışmadığı durumlar da vardır. Özellikle, çizgiden herhangi biri "C" benzeri bir şekle sahipse veya kafa noktası bitiş noktasına çok yakın olduğunda. Sonraki iki resim senaryoyu veriyor.

C gibi şekil çizgisi

Algoritmamı uygulayarak sonucu elde ederiz:

Sonuçlar

Bir şekilde anlaşılabilir, çünkü mevcut algoritma sadece yansıtılan noktaları bulur ve satırları çıkarır.

Beklediğimiz şey şudur:

Beklenen sonuçlar

Bunu yapmak için daha sağlam bir algoritmaya ihtiyacım olan şey, böylece önceki gibi özel durumları da ele alabilir. Bir çizgiden diğerine her noktayı yansıtmaya ve yansıtılan çizginin baş / bitiş noktasına en yakın olan iki yansıtılan noktayı bulmaya çalıştım, ancak şans yoktu. Yine de beklenmedik sonuçlar veren vakalar bulabiliyorum.

Daha önce benzer sorunlarla karşılaşan biri var mı? Aynı işi yapabilen bir yazılım veya kütüphane olması da harika olurdu. Herhangi bir cevap takdir edilecektir.


1
ArcGIS'teki Topolojinin nesnelerin çakışıp çakışmadığını nasıl kontrol ettiğini incelediğinizde size yardımcı olabilir: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… paragraf "Küme işleme".
Jens

Cevabınız için teşekkür ederim, @Jens. Ama korkarım ki istediğim bu değil.
mfdev

Bu hat bir ağı mı temsil ediyor? Aralarında topolojik ilişkiler var mı?
julien

Bir ağ olmak zorunda değil ve muhtemelen topolojik bir ilişki yok.
mfdev

Yanıtlar:


4

Benim tahminim, son vakaların genellikle makine tarafından programlanamayan istisnalar olacağıdır. Benzer sorunlarla çalıştım ve her zaman belirli bir miktar manuel düzenleme gerektiriyorlardı. Ayarlamanız gereken şey, vaka tarafından üretilen ve bunları bir iş yönetimi sisteminde son kullanıcıya sunan istisnalardır.


Bunun benzer bir örneği burada görülebilir: vividsolutions.com/jcs JCS, geometri birleşmesini otomatikleştirmek için uzun bir yol kat eder, ancak tamamen birleştiremediği geometriler için manuel KG de içerir. vividsolutions.com/… Ondan üretilmiştir ve KG'ye izin verir ve zor geometriler için sorun izleme ekler.
DPierce

1
Tüm topolojik çözümler programlama ile otomatik hale getirilemez ve büyük işletmelerde, bu tür çözümler örneğe benzer şekilde geliştirilir; zira konflasyon düşmesi, yüksek değişim oranına sahip karmaşık taşıma geometrileri ile doğada büyük ve döngüsel olabilir.
lewis

2

Bu algoritma için bir geç tolerans ve bir dönüş toleransına ihtiyacınız olacak (Ben zaten bir geç toleransınız olduğunu varsayalım).

Baş noktasını kaynak çizgisinden referans çizgisine yansıtın. Bu öngörülen noktada referans çizgisini kesin.

Kaynak hattı boyunca hareket yönü elde etmek için kaynak hattını baş noktasından ilk tepe noktasına doğru hareket ettirin. İki referans çizginizin her birini yansıtılan kaynak noktasından bir sonraki tepe noktasına kadar hareket ettirin. Hareket yönü, kaynak hattınızdaki ana noktadan hareket yönünün dönüş toleransı içindeyse, algoritmanızı normal olarak uygulayın, ancak yalnızca referans çizgisinin bu bölümünü kullanın. Algoritma kaynak satırının sonuna ulaşırsa, işlem tamamlanmıştır. Değilse, dönüştürülmüş parça ile dönüştürülmemiş parça arasındaki kaynak hattını kesin (bitiş noktasını içerecektir).

Şimdi dönüştürülmemiş parçayı alın ve bitiş noktasını orijinal referans çizgisine yansıtın. Daha önce yaptığınız prosedürün aynısını uygulayın ... hareket yönünü bulmak için kaynağı uç noktadan ilk tepe noktasına kadar çevirin. Proje bitiş noktasındaki referans çizgisini kırın ve öngörülen bitiş noktasından hareket yönünün dönüş toleransı içinde olup olmadığını bulmak için her birini çaprazlayın. Öyleyse, algoritmayı normal olarak uygulamak için referans çizgisinin bu parçasını kullanın.

Unutmayın, bu noktada sadece dönüştürülmemiş parçayı kullanıyorsunuz, bu nedenle kafa noktası dönüşümü ile çakışmayacaksınız.

Son olarak, gerekirse iki ortaya çıkan çizgi parçasını birleştirin: kafa noktası dönüştürülen parça, yansıtılan kafa noktasından dönüştürülmemiş kırılma noktasına ve daha sonra uç noktada dönüştürülmüş parçadan dönüştürülmemiş kırılma noktasından yansıtılan bitiş noktasına.

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.