| Повече ▼

Как да избегнем срив на QGIS, когато към него се добави слой със символи?

Как да избегнем срив на QGIS, когато към него се добави слой със символи?


Когато изпълнявам следващия код в конзолата Python на QGIS с линеен векторен слой:

symbol1 = QgsLineSymbolV2.createSimple ({'penstyle': 'solid', 'color': 'black', 'width': '3'}) symbol2 = QgsLineSymbolV2.createSimple ({'penstyle': 'dash', 'color' : 'white', 'width': '0', 'customdash': '8; 4', 'use_custom_dash': '1'}) route = iface.activeLayer () renderer = route.rendererV2 () type1 = symbol1. type () type2 = symbol2.type () print "Съвместим ли е слоят със символи?", symbol1.isSymbolLayerCompatible (type2) #Създаване на символни слоеве symbol_layer1 = symbol1.symbolLayer (0) symbol_layer2 = symbol2.symbolLayer (0) #Добавяне на символен слой 2 към symbol1 (сега с два символни слоя) symbol1.appendSymbolLayer (symbol_layer2) renderer.setSymbol (symbol1) route.triggerRepaint () iface.legendInterface (). refreshLayerSymbology (route)

Получих следния резултат:

което показва, че символът2 (QgsLineSymbolV2 клас), като символен слой (символ_слой2 принадлежи QgsLineSymbolLayerV2 клас), той правилно се добавя към symbol1. Когато обаче този код се стартира отново, QGIS се срива и той затваря всички прозорци. Това поведение не се появява, ако символът има само един символен слой; когато се коментира, при първото време на изпълнение, редът с тази инструкция:

symbol1.appendSymbolLayer (symbol_layer2)).

Как мога да предотвратя втория срив на QGIS, когато използвам символ с 2 или повече слоя символи?


Разум

Когато създавате символ, той притежава неговите слоеве. Когато добавите слой към съществуващ символ, той поема собствеността върху добавения слой. Собствеността означава, че е свободна да я изтрие, когато пожелае.

Във вашия пример и двата символа поемат собствеността върху symbol_layer2 (symbol2, защото създаде symbol_layer2, symbol1, защото symbol_layer2 е добавен към него).

Сега, когато стартирате кода за втори път, symbol2 се заменя с нов, така че python изтрива symbol2, а symbol2 изтрива symbol_layer2, защото той притежава собствеността.

Когато по -късно зададете нов символ на визуализатора, той изтрива стария символ (който сте задали при първото стартиране на кода), защото вече не се използва. (Старият) символ1 се изтрива и с него символ_слой2, от който символ1 също поема собствеността. Но - лош късмет - това вече е изтрито от symbol2. И изтриването на едно и също нещо два пъти води до срив ...

Решение

Клонирайте символния слой, така че и двамата да имат собствено копие, върху което да работят

symbol1.appendSymbolLayer (symbol_layer2.clone ())

Или премахнете слоя символи от symbol2

symbol_layer2 = symbol2.takeSymbolLayer (0)

Или директно създайте слой със символи, вместо да заемате такъв, изграден от символ.

Това грешка ли е?

Не, това е очаквано поведение.

Има няколко възможности за причиняване на сривове с код на python. Има обаче възможност за подобрение в API документите. Това скоро ще се промени.


Гледай видеото: QGIS การตดขอมลเวกเตอรในโปรแกรม QGIS How to clip vector layer by QGIS