Я пытаюсь заставить слои обновляться автоматически при изменении источника данных. Я использую R, чтобы написать шейп-файл с атрибутом и раскрасить в соответствии с этим атрибутом в QGIS.
Я хочу написать новый шейп-файл с другими значениями атрибутов и обновить цвета карты Qgis. Шаг 1 запускает этот процесс, шаг 2 заставляет слой перезагрузиться из измененного шейп-файла. Его шаг 2, о котором я беспокоюсь здесь.
Другие вопросы / списки рассылки, которые упоминаются triggerRepaint
в слое - это не работает. Другие предложения включают setCacheImage(None)
и снова это не работает. Слой обновляется в конце концов, но я действительно не вижу логики, и иногда это происходит неожиданно после того, как я ничего не сделал. Или, может быть, я сделал что-то две минуты назад.
Единственный воспроизводимый способ обновить его - дублировать слой из меню легенды - дубликат всегда получает свои данные из текущего шейп-файла, а оригинальный слой тоже обновляется! Так что должен быть какой-то способ сделать это.
Я думаю, что он работал лучше в 2.8, но это 2.10, так что, возможно, где-то есть новая ошибка.
Связано, но у меня не работает в 2.10:
Как автоматически перезагрузить растровые слои, если источник изменился в QGIS?
Другие вещи, которые я пробовал:
layer.dataProvider().dataChanged.emit()
- работал один раз, потом не снова на том же слое
Я думаю, что я выяснил, почему дублирование слоя работает - если я создаю новый одноуровневый слой на основе обновленного слоя, а затем вызываю .triggerRepaint()
обновленный слой, он обновляется на холсте карты:
QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()
Если я использую другой источник слоя, он не будет работать, так что, похоже, если вы создадите объект слоя на основе того же источника слоя ...
Быстрый тест только что с растровым слоем (из GeoTIFF), и просто вызов, rlayer.triggerRepaint()
кажется, надежно обновляет вид растра на холсте карты.
layer.setCacheImage(None)
и layer.triggerRepaint()
?
triggerRepaint()
на исходном слое. v 2.10.1-Пиза