QGIS öznitelik tablosu alanını otomatik hale getirme?


9

QGIS ve sahip olduğum bir Excel çalışma sayfasını kullanarak hidrolojik projeler yapmak için çalışıyorum. Bunu yapmak için, bir boru bölümünü temsil eden bir vektör katmanında bulunan çizgilerin bazı bilgilerini çıkarmak istiyorum.

Çıkarmam gereken bilgiler:

  • Kimlik Numarası
  • uzunluk
  • X, Y başlangıç ​​ve bitiş koordinatları

Ben "$ uzunluk" ve X ve Y koordinatları için başka bir algoritma kullanarak bu alanı yakalamak için bir yol buldum, ancak bunun için Öznitelikler tablosunu açmak gerekir, her öznitelik sütununda ifadeleri koymak ve alanları güncelleştirmek için tıklatın.

Bir çizgi çizdiğimde bu alanların otomatik olarak doldurulması için bir yol var mı? Yani, bir çizgi çizer / düzenlerim (düzenlemeye başla veya düğümü bitir) ve öznitelik tablosunu açtığımda uzunluk alanları ve X, Y koordinatları doldurulur ve güncellenir.


1
Geçici bir tabloda yapıldığından düzenleme modundayken mümkün olup olmadığından emin değilsiniz. Ama eylemlere bir göz atabilirsiniz. Bunları örneğin hesaplamalarınızı doldurmak için python kodunu çalıştırmak için kullanabilirsiniz. Yine de attribut tablosundan çalıştırmak için ekstra bir düğmeye basmanız gerekir. Olanaklara bir göz atabilir ve fikrinize uyup uymadığını görebilirsiniz.
Mat

Yanıtlar:


7

Bu alanlara yalnızca QGIS içinde ihtiyacınız varsa, sanal alanları kullanabilirsiniz. Bunlar $length, diğer değerlere veya geometriye bağlı bir ifade (gibi ) kullanılmasına izin verir .

Alan hesaplayıcısını açın, ad uzunluğu ile yeni bir alan ekleyin, "Sanal Alan" onay kutusunu işaretleyin ve $lengthifade olarak (veya diğer alanlar için başka bir şey) girin.

Ancak bunlar excel dosyasına kaydedilmez.

Bir excel dosyasını geometri için bir shp dosyasıyla senkronize tutmak ve excel dosyasına türetilmiş alanlar eklemek istiyorsanız , bu kavramın farkında olan ve özellikler değiştirildiğinde, eklendiğinde veya silindiğinde alanları otomatik olarak güncelleyen ShpSync adlı bir eklenti vardır .


Aslında, aşağıdaki cevap tam olarak nasıl yapmak istediğimi gösteriyor, ancak söylediğin bu eklenti projemin bir sonraki adımı için işe yarayacak. Yardımınız için teşekkür ederiz
LeoNazareth

15

İlginç soru! İstediğini başarmanın başka bir yolunun farkında değilim, ama PyQGIS kullanıyorum.

Aşağıdaki kodu okuyun. İçinde bazı metinler vardır: 'lines', 'length', 'startX', 'startY', 'endX', 'endY'. Kodunuzdaki bu adları verileriniz üzerinde çalışması için ayarlayabilirsiniz. İlki katman adı, geri kalanı ise alan adlarına karşılık gelir. Çizgi katmanınızın bu alanlara sahip olduğunu varsayıyorum (sonuçta, değerlerin orada yazılmasını istiyorsunuz).

Katman adınızı ve otomatik olarak güncellenmesini istediğiniz alanların adlarını ayarladıktan sonra komut dosyasını kopyalayıp QGIS Python konsoluna yapıştırın.

Her şey yolunda giderse, alan değerlerinin iki senaryoda otomatik olarak güncellendiğini görebilmeniz gerekir: 1) Yeni özellikler eklendiğinde ve 2) Geometriler değiştirildiğinde.

# Initialize required variables
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
lengthField = myLayer.fieldNameIndex( 'length' )
startXField = myLayer.fieldNameIndex( 'startX' )
startYField = myLayer.fieldNameIndex( 'startY' )
endXField = myLayer.fieldNameIndex( 'endX' )
endYField = myLayer.fieldNameIndex( 'endY' )

# Slot, updates field values
def updateFeatureAttrs( fId, geom=None ):
    f = myLayer.getFeatures( QgsFeatureRequest( fId ) ).next()    
    if not geom:
        geom = f.geometry() 
    myLayer.changeAttributeValue( fId, lengthField, geom.length() )
    myLayer.changeAttributeValue( fId, startXField, geom.vertexAt( 0 )[0] )
    myLayer.changeAttributeValue( fId, startYField, geom.vertexAt( 0 )[1] )
    myLayer.changeAttributeValue( fId, endXField, geom.asPolyline()[-1][0] )
    myLayer.changeAttributeValue( fId, endYField, geom.asPolyline()[-1][1] )

# Update feature attributes when new features are added or geometry changes
myLayer.featureAdded.connect( updateFeatureAttrs )
myLayer.geometryChanged.connect( updateFeatureAttrs )

Bu nasıl çalışır:

QGIS'deki alanların otomatik güncellenmesi

Komut dosyasını çalıştırırken herhangi bir sorun yaşarsanız, bu cevabın altına bir yorum ekleyin.

QGIS projenizi açtığınızda bu işlevselliği zaten hazır bulundurmanız kullanışlı olabilir. Eğer durum buysa, söyle bana, bunu yapmak için talimatlar gönderebilirim.


DÜZENLE:

Bu işlevselliğin QGIS projenizi her açtığınızda (diğer bir deyişle, .qgsçizgi katmanınızı içeren bir dosya) kullanılabilir olması için şu adımları izlemeniz gerekir:

  1. Git QGIS->Project->Project Properties->Macros, Python macrosseçeneği kontrol et ve tüm kodu bu kodla değiştir (katman ve alan adlarını gösteren değerleri ayarla):

    from qgis.core import QgsMapLayerRegistry, QgsFeatureRequest
    def openProject():    
        # Initialize required variables
        myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
    
        # Update feature attributes when new features are added or geometry changes
        myLayer.featureAdded.connect( updateFeatureAttrs )
        myLayer.geometryChanged.connect( updateFeatureAttrs )
    
    # Slot, updates field values
    def updateFeatureAttrs( fId, geom=None ):
        myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
        lengthField = myLayer.fieldNameIndex( 'length' )
        startXField = myLayer.fieldNameIndex( 'startX' )
        startYField = myLayer.fieldNameIndex( 'startY' )
        endXField = myLayer.fieldNameIndex( 'endX' )
        endYField = myLayer.fieldNameIndex( 'endY' )
        f = myLayer.getFeatures( QgsFeatureRequest( fId ) ).next()    
        if not geom:
            geom = f.geometry() 
        myLayer.changeAttributeValue( fId, lengthField, geom.length() )
        myLayer.changeAttributeValue( fId, startXField, geom.vertexAt( 0 )[0] )
        myLayer.changeAttributeValue( fId, startYField, geom.vertexAt( 0 )[1] )
        myLayer.changeAttributeValue( fId, endXField, geom.asPolyline()[-1][0] )
        myLayer.changeAttributeValue( fId, endYField, geom.asPolyline()[-1][1] )
    
    def saveProject():
        pass
    
    def closeProject():
        pass
  2. Emin projeniz, bu yolda makroları etkinleştirmek olun: Settings->Options->General->Enable macros: Always.

  3. QGIS projenizi kaydedin.

Şimdi, .qgskaydettiğiniz dosyayı her açtığınızda, yeni bir özellik eklediğinizde veya bir geometri değiştirdiğinizde (yani artık QGIS Python Konsoluna herhangi bir şey kopyalamanıza gerek kalmaz) çizgi katmanınızın özellikleri otomatik olarak güncellenecektir.


2. DÜZENLEME:

İnsanların bu tür sorunları çözmelerine yardımcı olmak için AutoFields adlı bir eklenti yayınladım . Hatta plobleminizi nasıl çözeceğinizi gösteren bir video bile hazırladım:

https://vimeo.com/germap/autofields-geometric-properties

AutoFields belgeleri: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis


2
Tam da aradığım şey buydu. Aslında kodunuzu, bu gönderi bağlantısında eski cevabınızda bulduğum X, Y koordinatlarını yakalamak için kullanıyordum, şimdi yayınladığınız gibi. Otomasyonu zaten test ettim ve mükemmel çalışıyor. Python kodunu ".pycl" dosyası olarak kaydettim. Bana QGIS projemi açtığımda nasıl mevcut olabileceğini açıklayabilirsen harika olur. Yardımın için teşekkürler.
LeoNazareth

1
Almanca, bu harika bir cevaptı! Teşekkürler! Gönderdiklerinizle sizden çok şey öğrendim!
jbgramm

1
Aslında tam olarak bunu yapmanıza izin verecek bir eklenti üzerinde çalışıyorum. Geliştirilmesine sadece boş zamanımı ayırabildiğim için, size beklenen bir çıkış tarihini söyleyemem. Bu arada, Tramo.shp'yi ekledikten sonra 1. kod snippet'imi çalıştırabilirsiniz, ayarlama: myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]Gelecekte eklentimle gerçekten ilgileniyorsanız, lütfen bana herhangi bir öneri gönderin, bunu takdir ediyorum. Bana GeoTux'dan ulaşabilirsiniz .
Germán Carrillo

1
Bu benim için harika olacak (ve elbette birçok insan için), kodu önerdiğiniz bu ayar ile zaten kullanıyorum. Yeni eklentinizi endişeyle bekleyeceğim ve yararlı bir şey düşünürsem sizinle iletişime geçeceğim. Herşey için teşekkürler.
LeoNazareth

1
@LeoNazareth, eklentiyi test etmek ister misiniz? Hazırlanıyor, ancak serbest bırakmadan önce bazı testler yapmak istiyorum. Test etmek istiyorsanız, lütfen bana bir e-posta gönderin .
Germán Carrillo

2

QGIS 3 için hiç halindeyken Layers Properties=> Attributes Form=> (örnekte, geometri değerleri ile alanı seçiniz area) => türü $areaiçinde Defaults valuekutusu ve kontrol Apply default value on update. Bu aynı zamanda yararlı olabilir: $perimeter, $y, $x,$id


1

Bir veritabanına (PostGIS) veri koymak ve (muhtemelen malzeme) görünümü ile QGIS veri ayıklamak.

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.