Daha çox

Bir simvola bir simvol təbəqəsi əlavə edildikdə bir QGIS qəzasının qarşısını necə almaq olar?

Bir simvola bir simvol təbəqəsi əlavə edildikdə bir QGIS qəzasının qarşısını necə almaq olar?


QGIS -in Python Konsolunda bir xətt vektor təbəqəsi ilə növbəti kodu işlədərkən:

symbol1 = QgsLineSymbolV2.createSimple ({'penstyle': 'solid', 'color': 'black', 'width': '3'}) symbol2 = QgsLineSymbolV2.createSimple ({'penstyle': 'tire', 'color' : 'ağ', 'genişlik': '0', 'customdash': '8; 4', 'use_custom_dash': '1'}) marşrut = iface.activeLayer () renderer = route.rendererV2 () type1 = symbol1. type () type2 = symbol2.type () print "Symbol Layer Uyğundurmu?", symbol1.isSymbolLayerCompatible (type2) #Symbol Layers yaradın symbol_layer1 = symbol1.symbolLayer (0) symbol_layer2 = symbol2.symbolLayer (0) #Simvol Layer 2 əlavə edin to symbol1 (indi iki simvol təbəqəsi ilə) symbol1.appendSymbolLayer (symbol_layer2) renderer.setSymbol (symbol1) route.triggerRepaint () iface.legendInterface (). refreshLayerSymbology (marşrut)

Aşağıdakı nəticəni aldım:

simvolu olduğunu göstərən 2 (QgsLineSymbolV2 sinif), Symbol Layer kimi (symbol_layer2 aiddir QgsLineSymbolLayerV2 class), simvol1 -ə düzgün əlavə olunur. Ancaq bu kod yenidən işə salındıqda QGIS çökür və bütün pəncərələri bağlayır. Bu davranış simvolda yalnız bir simvol qatı varsa görünmür; şərh edildikdə, ilk icra vaxtında bu təlimatın xətti:

symbol1.appendSymbolLayer (symbol_layer2)).

2 və ya daha çox simvol qatlı bir simvol istifadə edərkən ikinci dəfə QGIS qəzasının qarşısını necə ala bilərəm?


Səbəb

Bir simvol yaratdığınızda, təbəqələrinin sahibi olur. Mövcud bir simvola bir qat əlavə etdiyiniz zaman, əlavə olunan qatın sahibi olur. Sahiblik, onu istədiyi vaxt silməyin pulsuz olduğu deməkdir.

Sizin nümunənizdə hər iki simvol symbol_layer2 -nin mülkiyyətini öz üzərinə götürür (symbol2layer2 yaratdığına görə symbol2, ona symbol_layer2 əlavə edildiyi üçün symbol1).

İndi kodu ikinci dəfə işlədərkən, symbol2 yenisi ilə əvəz olunur, buna görə də python simvolu2 və symbol2 simvolu_layer2 -ni silmək hüququna malikdir.

Daha sonra renderləyiciyə yeni bir simvol qoyduqda, artıq istifadə olunmadığı üçün köhnə simvolu (kodu ilk işlədərkən təyin etdiyiniz) silir. (Köhnə) simvolu1 silinir və onunla birlikdə simvolu1 olan mülkiyyətçi olduğu simvolu_layer2. Ancaq - şanssızlıq - bu artıq simvol2 ilə silindi. Və eyni şeyi iki dəfə silmək qəza ilə nəticələnir ...

Həll

Simvol qatını klonlayın, buna görə də hər ikisinin üzərində işləmək üçün öz nüsxəsi var

symbol1.appendSymbolLayer (symbol_layer2.clone ())

Və ya simvol oyunçusunu simvoldan uzaqlaşdırın2

symbol_layer2 = symbol2.takeSymbolLayer (0)

Və ya bir simvol ilə tikilmiş bir borc götürmək əvəzinə birbaşa bir simvol təbəqəsi yaradın.

Bu bir səhvdirmi?

Xeyr, bu gözlənilən davranışdır.

Python kodu ilə qəzalara səbəb olmaq üçün bir neçə variant var. Ancaq API sənədlərində təkmilləşdirmə üçün yer var. Bu tezliklə dəyişdiriləcək.


Videoya baxın: QGIS การตดขอมลเวกเตอรในโปรแกรม QGIS How to clip vector layer by QGIS