Nitelikler bir çokgen katmanından diğerine kopyalanıyor mu?


11

Başıma gelemediğim bir sorunum var. İki çokgen katmanım var:

  • Çokgen A - aynı alanlara sahip çokgen B'nin bir alt kümesidir ve Çokgen B ile aynı çokgenlere sahiptir
  • Çokgen B - Çokgen A'da olmak istediğim özellik verilerine sahip

Bu nasıl yapılabilir? QGIS aracını "Özelliklere Göre Katıl" işlevini denedim, ancak bazı çokgenler diğerlerinin içindeyken, bulduğu ilk kesişmeye (dış çokgene) bağlanma eğilimindedir.


Polygon A'nın sentroidlerini (puanlarını) oluşturun ve A'dan nitelikleri korumak ve A'dan nitelikleri korumak için yeni dosyaya aktarın.
Mapperz

3
@Mapperz Bu tehlikeli bir yaklaşımdır, çünkü genellikle olası görünen bir cevap üretmesine rağmen hatalar üretebilir. Çokgenler birbiriyle çakışırsa, tüm bahisler kapalıdır. Çakışma olmadığında bile, bir çokgenin sentroidinin farklı (çakışmayan) bir çokgenin içinde uzanması mümkündür . Doğruluk genel olarak sadece A'daki tüm çokgenler üst üste binmeyen ve dışbükey olduğunda garanti edilebilir.
whuber

+1 @ Diego - sorunuz ilginç tartışmalara / tartışmaya yol açıyor; ilginç bir tane!
Dano

Yanıtlar:


9

@Dano, en iyi şekilde tam bir cevapta ele alınan bazı sorunları haklı olarak ortaya çıkarır.

@Celenius tarafından daha önce not edilen bir zorluk , B ve A (her iki yönde) arasındaki birleşimin tüm alanları çoğaltmasıdır; bunu düzeltmek zahmetli olabilir. Ben yorumlarda bariz kolay yolu (bir e-tabloya ihracat) veri bütünlüğü soruları gündeme getiriyor önerdi. Zaten Celenius'un önerisiyle ele alınan bir başka zorluk , hiçbir özellik kombinasyonu hem A hem de B için bir anahtar olarak hizmet edemediğinde bu sorunu çözmekle ilgilidir, çünkü bu bir veritabanına katılmayı engeller. Mekansal birleşme bu problemin üstesinden gelir.

O halde iyi bir çözüm nedir? Bir yaklaşım, istenen verileri içeren B'nin karşılık gelen kayıtlarını tanımlamak için A'yı kullanır. Çokgenlerin konfigürasyonları hakkındaki varsayımlara bağlı olarak - örtüşüp örtüşmemeleri, bazılarının başkalarını içerip içermemeleri vb. - bu çeşitli şekillerde yapılabilir: diğer katmandaki nesneleri seçmek için bir katman kullanmak veya birleştirmeler. Buradaki nokta , bu aşamada yapmak istediğimiz tek şey B'nin A'ya karşılık gelen alt kümesini seçmektir.

O seçimi elde olması, seçim dışa aktarmak ve A. yerini izin Yapıldı .

Bu çözüm , B'deki tüm alanların A'daki karşılıklarını değiştirmeyi amaçladığını varsayarsa Değilse , B'ye (kaynak) A'ya (hedef) 1-1 birleştirmesi gerçekten gereklidir . Tanımlayıcılara dayalı birleştirme en iyisidir, ancak çokgen kimliğine (Celenius) birleştirme yapmak kimlikleri yoksa ve A ve B'deki karşılık gelen çokgen şekillerinin biraz farklı olma şansı yoksa iyi çalışır . (Bu ince bir noktadır ve sinsi hataların olası nedenidir, çünkü B'de A'ya karşılık gelmeyen çokgenlerde yapılan daha önceki düzenlemeler, GIS "yapışıyorsa" veya "topolojiyi koruyorsa", B'deki diğer çokgenleri hala görünmez şekilde değiştirebilir. veya yerel düzenlemeler sırasında otomatik olarak global değişiklikler yapabilir.)

Bu noktada, her alanın iki kopyası vardır: [Foo] A ve B için ortak bir alansa, birleşim A. [Foo] ve B. [Foo] içerir. Bir alan hesaplaması kullanarak B. [Foo] 'yu A. [Foo] içine kopyalayın. Gerekli tüm alanlar için tekrarlayın. Bu yapıldıktan sonra birleştirmeyi kaldırın.

Bu prosedür, birçok alan söz konusu olduğunda biraz zahmetli olsa da , özellikleri

  • Komut dosyası yazmak kolay ve hızlıdır.
  • Komut dosyası yazıldığında , veriler üzerinde yapılan işlemleri belgeleyen bir denetim izi bırakılır . Bu, veri bütünlüğünü korumak için çok önemlidir.
  • Birleştirmeden sonra yanlış alanın korunması (böylece o alan için yeni veriler yerine eski verilerin tutulması) veya önemli bir alanın silinmesi gibi bazı toptan satış hatalarına karşı savunur.
  • Veri yönetimini ve veri kurallarını uygulama gibi hataları önlemek ve tanımlamak ve veritabanındaki tüm tablolar ve katmanlar arasında tutarlılığı sağlamak için çalışan veritabanı yönetim sistemi tarafından sunulan yerleşik savunmalardan yararlanır.

Bu öneriye dahil olan yol gösterici ilkelerden bazıları

  1. Bu görev için tasarlanmamış veya uygun olmayan yazılımlar kullanmak yerine verileri işlemek için bir veritabanı yönetim sisteminizi kullanın.
  2. İşlemler kesinlikle gerektirmediğinde veritabanı yapılarını (alan silme veya ekleme gibi) değiştirmekten kaçının.
  3. Çalışmayı basitleştirmek, belgelemek ve işlemleri tekrarlanabilir hale getirmek için yazılımın otomasyon yeteneklerini kullanın.

Çoğu durumda aynı sonuca ulaşmanın daha hızlı ve daha kolay yollarının olduğu itiraz edilebilir . Evet, olabilir ve etkili olabilirler ve genellikle dikkatli bir şekilde yapıldıklarında çalışırlar. Ancak, verileri riske atan çözümlerin genel amaçlı cevaplar olarak önerilmesi ve savunulması zordur. En iyi şekilde, veri bozulmasının hızla belirginleşmesi ve bu tür hataların sonuçlarının önemsiz olduğu küçük veri kümeleri olan tek seferlik durumlarda kullanılır.


+1 @ whuber - Buradaki tüm değişkenleri tartmaya çalıştığınız açıktır; iyi düşünülmüş bir cevap. Lütfen benim orijinal cevabımın eklenmesine bakın, çünkü yorum kutusunda yer kalmayacak.
Dano

1
"Celenius" ne olduğunu merak insanlar için bu konu çeşitli yerlerden bahsetti: şimdi @djq olarak biliyorum, ve onun yanıtı burada . Geri dönüş makinesi için şeref: web.archive.org/web/20120127210858/http://gis.stackexchange.com/…
matt wilkie

5

Arcmap'de Poligon B'yi Poligon A'ya mekansal olarak birleştirebilirsiniz; bu niteliklerle ilgili olacaktır. Alan adları aynı olduğundan, adın yeni bir birleşimini oluşturur.


Ben bunu koyardım. Benim gözümde, bu kısa cevap doğru.
Simon

4

Shapefile "B" tablosunu Excel'e aktarın ve tekrarlanan sütunları ve ihtiyacınız olmayan bilgileri içeren sütunları silin. Paylaşılan tanımlayıcı sütununuzu sakladığınızdan emin olun, ardından uygun klasöre kaydedin. ArcMap'e gidin, tabloyu ekleyin, ardından Shapefile "A" üzerine sağ fare ile bir masa birleştirmesi gerçekleştirin . Bağlantı, bunun nasıl yapılacağı hakkında bir videoya yönlendirmelidir.


@ whuber - Tüm yaklaşım sağlamdır ve verilerin bütünlüğünü sağlar. Bu cevabı çürütmek için söyleyebileceğim tek şey, bazı durumların / projelerin bize yaklaşımımızda bu yöntemsel olmak için zaman ya da bütçe sağlamadığıdır.

Gerçek bir örnek:

Bir Junior Madencilik Şirketi, kaynağı "kanıtlama" yeteneklerine dayanarak yüz milyonlarca dolar nakit infüzyonu ile büyük bir cevher üzerinde oturuyor. Yayınların ve jeoloji haritalarının / verilerinin masaüstü incelemesi, çok hedefli ve çok maliyetli bir sondaj programına yol açar. Testler ilk çalıştırmadan geri döndüğünde, bu değerler bir tablo birleşimi aracılığıyla ilgili nokta konumlarına etiketlenir ve verilerin DataMine'e içe aktarılması için özenle hazırlandığı bir Excel formatında pompalanır (3D cevher gövdesi enterpolasyonu için).

Tecrübelerime göre , proje Jeologlar gerekli o HER harfine kural / kongre biçimlendirme (boşluk, hiçbir özel karakterler, vb) ve Datamine ithalat dosyası bir .csv formatında teslim edildiğini takip ettiğini, bu veriler Excel'de hazır olsa o (o zamanlar yine de). Bu, hedefe yönelik sondaj işlemlerine daha fazla yatırım yapılmasına neden olur ve süreci (bazı durumlarda) defalarca tekrar ziyaret ederiz. Bütün bunlar genellikle son derece sıkı ve kritik bir zaman çizelgesinde meydana geldi.

Her birimizin kendi hikayemiz ve bir şeyler yapma konusundaki yaklaşımımıza dahil ettiğimiz kendi deneyimlerimiz vardır. Bunu söyledikten sonra, deneyimim Excel'i mutlak bir zorunluluk ve iş akışlarımda hayati bir araç olarak gördü; bildiğim bu. Bu verilerin hazırlanmasında her KG / KK önlemini aldık. Excel'den uzaklaşacağınız yerde kullanmaktan başka seçeneğim yoktu.


(-1) Birleştirme yapmak için Excel'i kullanmak, bir GIS veya RDBMS ile gerçekleştirmekten daha zor olmakla kalmaz, aynı zamanda ciddi hatalar da davet eder.
whuber

8
Excel basittir, çalışır ve bu nedenle şimdiye kadar üretilen herhangi bir yazılımdan daha fazla tespit edilmemiş toptan satış hatalarından sorumludur. Excel'in işlenmesini çok kolaylaştıran hatalara karşı korumak için geliştirilen DBMS'lerin temel ilkelerini ihlal eder, örneğin (1) bazı sütunları sıralamak, ancak diğerleri değil; (2) veri türlerini değiştiren tipografik hatalar; (3) verileri silen sokak tuş vuruşları; (4) satır veya sütunların yanlışlıkla silinmesi; (5) metin gibi tarihlere ait verilerin gizli dönüştürülmesi; (6) verilerin gizli kesilmesi; (7) sayısal değerlerin gizli yuvarlanması; ve daha fazlası.
whuber

2
bu cevap ve sonuçta ortaya çıkan yorum, "kötü" bir yanıtın nasıl iyi sonuçlar doğurabildiğinin, aksi takdirde ortaya çıkmayabilecek bilgileri ortaya çıkarabileceğinin harika bir örneğidir. "Vurmaktan" kaçınmak için lütfen silmeniz gerektiğini düşünmeyin.
matt wilkie

3
... ve isabeti telafi etmek için BÜYÜK BİR SORU , verileri işlemek için Excel'in neden çok ciddi sorunlara yol açabileceğini sormak olacaktır. Ve nasıl güvenle kullanılır.
matt wilkie

1
(+1) Düşünceli ve iyi tanımlanmış düzenleme için. @matt stats.stackexchange.com hakkındaki Excel'deki büyük bir veri kümesiyle çalışmanın iyi bir yolu ne olabilir? ve Excel'i bir istatistik tezgahı olarak görüyoruz .
whuber

1

1990'ların sonlarında, 55 su haritası haritasına ve binlerce sayısız özelliğe sahip olan tüm su kayağı ve su yollarımız için büyük ölçekli bir güncelleme aldık. Eski hidrolojimizin katma değer özelliklerini (göl isimleri, yüzey yüksekliği vb.) Tutmamız ve geometriyi değiştirmemiz gerekiyordu. Eski ve yeninin geometrisi, her çokgenin centroidlerinin hala yeni çokgen sınırlarıyla sınırlanacağını garanti edebileceğimiz kadar yakındı - bu önemli bir nokta, bu temel kesinlik olmadan aşağıdaki yaklaşım iyi bir fikir değil.

Bu özel durumda çözüm , nitelikleri geometriye getirmek yerine geometriyi niteliklere getirmekti. Yani, kavramsal olarak:

  1. * Layer_with_attributes * 'den çokgenleri silin, ancak tablo kayıtlarını tutun,
  2. * Layer_with_polys * 'den geometri * Layer_with_attributes * içine kopyalayıp yapıştırın *
  3. birleştirin ve kaydedin.

Bkz burada için daha uzun bir açıklama ve tarif için . Modern Arcgis veya Qgis'te, nitelik kaydını aynı anda silmeden bir geometriyi silmenin bile mümkün olmadığından emin değilim, ama hey, ne olursa olsun, işte fikir.


1

Emin değilim ama belki de bazı DBMS's SQL (?) Şekil alanlarında eşitlik işlemleri gerçekleştirmek. Bana öyle geliyor ki iki geometri aynıysa SQL =operatörü true ( WHERE A.Shape = B.Shape) döndürmelidir .

Bu, kullandığınız veritabanı için geçerliyse, uzamsal olmayan bir birleştirme için kullandığınız sözdizimini kullanarak bir uzamsal birleştirme yapabilmeniz gerekir.


Görünüşe göre ST_Equals yöntemi (bir OGC standardı) kullanılabilir.


0

Her zamanki gibi whuber haklı. İşleminiz hakkında iyice düşünmeniz gerekiyor. Özellikle bunlar büyük veri kümeleri ise ve bu işlem defalarca gerçekleştirilecekse veya veriler kritik öneme sahiptir.

Verilerinizi ve sorumluluklarınızı göz önünde bulundurun:

Ne yaptın?

Ne yapıyorsun?

Ne yapmak niyetindesin?

Ve her zaman sor: Neden?


Şimdi kolay bir cevap için doğrudan sorulan soruya yönelik. Her zaman bir şeyler yapmanın en az 5 yolu olduğunu, ancak genellikle sadece en iyi yol olduğunu unutmayın.

Tam kümenin alt kümede olmasını istediğiniz her özelliğe sahip olduğunu ve alt kümenin eski bilgiler dışında tam kümede bulunmayan bir şeyi olmadığını varsayarsak.

Alt küme topolojisinin tam kümeyle eşleştiğini tahmin etme (Origin / Projection ve XY Toleransı dahil).

1) "İç" onay kutusu işaretli olarak İşaret Etmek için Özelliği kullanın ve alt kümeden bir nokta özellik sınıfı veya şekil dosyası oluşturun.

2) Tam olarak yeni oluşturulan Nokta özelliği sınıfına veya şekil dosyasına dayalı olarak alt kümeye karşılık gelen tüm çokgenleri bulmak için Uzamsal Birleştirme Seçimi kullanın.

3) Seçimi tam kümeden dışa aktarın, bu yeni alt kümeniz olabilir.


0

Şüphesiz, Çokgen A Çokgen B'nin bir alt kümesiyse, en kolay yaklaşım Çokgen A'da döngü yapmak olacaktır, satır verilerini aramak için Çokgen A'da (ve A bir alt küme veya B ise B) olacak kimliği kullanın Çokgen B'yi tıklatın ve ardından Çokgen A'daki satırı güncelleyin.

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.