Düzenli İfadeler kullanarak özellik verileri nasıl kolayca düzenlenir?


30

QGIS kullanan yüksek lisans öğrencileri için bir ders yazıyorum. Görevlerden biri nitelik verilerinin değiştirilmesini gerektiriyor ( ilgileniyorsanız, burada pdf eğitim taslağına bakınız ).

Asıl soru, nitelik verilerini düzenlemelerini sağlamaktır. Bu sorunun daha önce sorulduğunu ve cevabın basit olduğunu biliyorum: sadece satırın sıralamasını ve sütun başlıklarının aynı kalmasını sağlamak için LibreOffice calc komutunu kullanın ve değiştirin. Bu yaklaşımı daha önce çok etkili olmak için kullandım.

Ne yazık ki, çözüm artık işe yaramıyor: .dbf dosyasını LibreOffice (5.4.2) veya OpenOffice (3.4.1) 'e kaydetme Calc, verileri QGIS perspektifinden karıştırıyor (sadece nitelik tablosunda rastgele tamsayı sayıları görünüyor) ve bunun yerine ek bir .dbt dosyası oluşturur.

Öyleyse soruyu sormak için: bir sınıf yüksek lisans öğrencilerine bunu gelecek hafta nasıl yapmaları gerektiğini söylerim? Aşağıdaki seçenekleri değerlendirdim:

  1. Bunun yerine R kullanın (benim için harika, ama öğrenciler için korkutucu)
  2. Dosyayı bir .csv olarak düzenleyin ve sonra zaman damgasına göre katılın (iyi, ancak aşırı karmaşık görünüyor ve 2 saatlik pratikte daha fazla hataya neden olabilir)
  3. Alternatif bir program kullanın: Her ikisi de hızlı bir şekilde iyi sonuçlar veren Gnumeric ve Excel'i denedim.

Bu soruyu cevaplamaya yardımcı olmak için tekrarlanabilir bir örnek oluşturdum . QGIS'te "points.shp" dosyasını açın, nitelik tablosunu izleyin ve ardından kapatın. LibreOffice'deki "points.dbf" öznitelik tablosundaki birkaç hücreyi düzenleyin - kaydedin. QGIS'te "points.shp" dosyasını tekrar açın ve şifreli nitelik tablosunu izleyin. .Zip klasöründeki diğer şekil dosyaları, sorunun benim için nasıl göründüğünü göstermek için LibreOffice ve OpenOffice tarafından zaten bozulmuş.

Kısacası, bu sorunu en iyi nasıl çözebilirim?


2
Siteye hoş geldiniz, bunun gerçekten iyi sorulan bir soru olduğunu söylemek isterim ve umarım iyi çözümler bulabiliriz. Sanırım biraz python bu öğrenciler için söz konusu değil, ilk aşamada bu soruna bu şekilde yaklaşırdım ...
sgrieve

13
Bir şekil dosyasının .DBF bölümünü doğrudan düzenlemek, rutin kullanım için önerilemeyecek kadar tehlikelidir ve acemiler tarafından hiç kullanılmamalı - en azından birileri verileri önemsemiyorsa. Bununla birlikte, benzer bir yapıya sahip daha güvenilir bir çözüm mevcuttur: şekil dosyasında benzersiz bir tanımlayıcı alanı koruyun. Asla düzenleme. Bunun yerine, öznitelikleri aynı tanımlayıcıya katılan (GIS'inizin okuyabileceği herhangi bir biçimde) ilgili bir tabloda tutun. Şimdi, büyük ölçüde, tanımlayıcı alanını koruduğunuz sürece, şekil ve öznitelik arasındaki bağlantıyı kaybetmeden öznitelik tablosunu serbestçe düzenleyebilirsiniz.
whuber

1
Python çözümleri, uygulanması ve anlaşılması kolay olduğu sürece iyi olurdu ... İyi bir seçenek olan bir tanımlayıcı numara tutmaya gelince - (soruma 2. seçenek) ve muhtemelen varsayılan cevabım. Ancak, ek dosyalar içermeyen daha basit bir "hızlı düzeltme" yapmayı umuyordu (her bir şekil dosyası için IMO yeterli!)
RobinLovelace

3
Ne demek istiyorsun, her bir şekil dosyası için? 9'u dene! :-) (İndeks dosyaları, hangi GIS'in kullanıldığına bağlı olarak birikebilir.) Bir veri setini saklamak için birden fazla ilgili dosyaya ihtiyacınız olduğunda - ve şekil dosyaları en az üç kere gerektirir - bu gerçekten fazladan bir sorun değil ek dosyalar atmak. Siz de onunla birlikte bir meta veri dosyası ekleyin. :-) Birleştirmeyi ayarladıktan sonra, otomatik olarak gerçekleşmiyor mu? (Yine de birleştirme için zaman damgasının nasıl kullanılabileceğini göremiyorum. Bunun yerine sürüm kontrol sistemi için kullanılacaktı.)
whuber

3
Bunları veritabanlarına tanıtmak için herhangi bir eğiliminiz varsa , spatiaLite, OSM verileri için alan düzenleme ve komut satırı araçları için bir GUI'ye sahiptir. O zaman biraz SQL dahil olabilirsiniz ve öğrencileriniz eğrinin çok üstünde olabilirler.
Scro

Yanıtlar:


18

Ryan Garnett'in QGIS dahilinde yapması tavsiyesine dayanarak bulduğum en basit cevap:

Regexp_replace kullanın

Bu yetenek 1 yıl önce Jürgen Fischer tarafından saha hesaplayıcısına eklendi ( bu hata raporunda gösterildiği gibi ). Bir süre bunun nasıl yapıldığını bulmaya çalıştım, ancak "qgis regex" ve diğer belirsiz terimleri aramayı başaramadım.

İşlevselliği, muhtemelen "isim" sütunundaki tüm değerleri standartlaştırma ihtiyacıyla en iyi şekilde gösterilebilir. Örneğin, "Tesc" desenini içeren tüm hücreleri 'Tesco' ile değiştirmemiz gerekirse, "Tesco, Revir Yolu" gibi gereksiz bilgileri kaldırarak (OSM'nin sıkça kattığı), aşağıdaki işlev kullanılabilir:

regexp_replace ("ad", 'Tesc. *', 'Tesco')

görüntü tanımını buraya girin

Sanırım bu Pythonic düzenli ifade işlevi, sanırım daha önce kullandığım grep'ten biraz farklı.

Bunun nasıl çalıştığı hakkında daha fazla dokümantasyon ( QGIS web sitesindeki ayrıntı birkaç kelimeyle sınırlıdır) gerektiğini düşünüyorum, bu nedenle ileride başvurmak üzere aşağıdaki sayfaları yer imlerine ekledim:

Bu çözümün birkaç avantajı var:

  1. Basit: ilave program veya eklentiye gerek yok
  2. (Pythonic?) İşlevlerini (metni temsil eden "" "ilginçtir. Uyarı:" sembolü yoktur veya simge başarısız olur) ve komut satırı işlevlerini kullanarak, düzenli ifadelerin gücünü tanıtır.

Kendi soruma cevap verdiğim için özür dilerim ve beni ışığa yönlendiren için çok teşekkürler! İnşallah bu soru, benzer sorunlarla karşılaşan diğer kişilerin de eğitimsel kullanımı olacaktır.


3
Endişelenmeyin, kendi sorularınızı cevaplamak sorun değil.
underdark

Sana yardım edecek bir şey bulmana sevindim. Paylaştığın için teşekkür ederim, bunu kullanacağımı biliyorum.
Ryan Garnett


9

Bu, mezun öğrenciler için bir öğrenme hedefi olabileceği için aptalca bir cevap olabilir, ancak Saha Hesaplayıcı kullanımıyla QGIS'deki özellikleri düzenlememenin bir nedeni var mı? QGIS'in önceki sürümlerinde (1.7 öncesi), doğrudan QGIS içinde düzenleme özellikleri mümkün değildi; bu nedenle OpenOffice vb.

1.7 ve 1.8'den itibaren, koşullu ifadeleri gerçekleştirme özelliği ile nitelik verilerini doğrudan Alan Hesaplayıcı'da düzenleyebilirsiniz. Öznitelik düzenleme için ek seçenekler sağlayabilen Python Öznitelik eklentileri de vardır. Bu, bir öğretici olabilir ve veya öğreticiniz için bir seçenek olabilir.

Önceki bir Master öğrencisi ve şimdi bir üniversite çalışanı olarak, bu konuyu, QGIS dışında gerçekleştirmesi için önceki gerekliliği anlıyorum ve şimdi QGIS içindeki tüm nitelik düzenlemelerini gerçekleştirme yeteneğini takdir ediyorum. İsterseniz, size bu konuda daha fazla yardımcı olmaktan memnuniyet duyarım.


1
Merhaba Ryan, evet bu ideal bir çözüm olurdu. Öznitelik tablosundaki metni arama ve değiştirme, dağınık OSM adlarını standartlaştırma, bu .dbf dosyasını doğrudan denemeye ve düzenlemeye zorluyor. QGIS içinde düzenlemeyi tercih ederim. Python Öznitelik eklentisini deneyecek - fikir çözümü olabilir. Aslında soruyu daha net hale getirip regex arama / değiştirme kabiliyetini arıyorum olmalıydım.
RobinLovelace

@ user1694378 hala sorunuzu netleştirebilirsiniz.
underdark

Beni dürtmek için teşekkür ederim, bunu yapmak istediklerimi daha iyi yansıtır.
RobinLovelace

3

DBF dosyalarınızı değiştirmek için LibreOffice's Base'i kullanabilirsiniz .

  1. Üssü Aç (Ana Menü)
  2. "Mevcut bir veritabanına bağlan" seçeneğini seçin ve "dBASE" türünü seçin.
  3. DBF dosyalarınızın bulunduğu klasörü seçin.
  4. İstediğiniz gibi son seçenekleri seçin ve "Bitir".
  5. Veri tabanı bağlantı dosyanızı istediğiniz şekilde adlandırın (örn. "MyxBasefiles.odb) ve bir yere kaydedin. Bundan sonra bu dosyaya tıklayarak veritabanı dosyalarınıza erişin. OoOoo, Nice.
  6. Sol paneldeki "Tablolar" ı seçin ve veri dosyalarınız ("tablolar" olarak adlandırılır) vardır. Onlarla uğraşmak.

Şimdi düzenlemeye başlayabilirsiniz. Umarım bu amaçlarınız için yeterince iyi olmalıdır.

DBF Explorer’ı yalnızca Windows olsa da deneyebilirsiniz . Yine de arama ve değiştirme var.

görüntü tanımını buraya girin


1
Merhaba RK Hemen cevap için teşekkürler: .dbf dosyalarını düzenlemek için güvenilir ve güvenli bir yol gibi görünüyor. Sadece söylediklerini denedim ve işe yaradığını söylemekten memnun oldum.
RobinLovelace

Bilmek güzel. Güzel dersin var orada. :)
RK

Ama ... Sadece söylediklerini denedim ve bireysel hücreler için işe yaradığını söylemekten memnuniyet duyuyorum. Maalesef, bu özel uygulama için% 100 bir çözüm değil, çünkü OOBase'in bir [hata] nedeniyle öğretici için gereken arama değiştirme işlevine sahip olmadığı görünüyor ( lists.freedesktop.org/archives/libreoffice-bugs/2010 -Aralık /… ). Kesinlikle tek tek hücreler üzerinde çalıştı olsa da: test edildi. Bu, arama değiştirme işlevini kaçırmadığım sürece hücre bazında düzenleme için% 90'lık bir çözüm. Örneğin, "Tesc. *" Girişlerinin "Tesco" ile nasıl değiştirileceğine dair bir fikriniz var mı?
RobinLovelace

OO Base hata için daha iyi bir bağlantı: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace 8:12

Cevabım güncellendi.
RK
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.