변경된 데이터 소스에서 Qgis 레이어 업데이트


13

데이터 소스가 변경되면 레이어를 자동으로 업데이트하려고합니다. R을 사용하여 속성으로 shapefile을 작성하고 QGIS에서 해당 속성에 따라 색상을 지정합니다.

다른 속성 값으로 새 shapefile을 작성하고 Qgis 맵 색상을 업데이트하고 싶습니다. 1 단계는 해당 프로세스를 트리거하고 2 단계는 수정 된 모양 파일에서 레이어를 다시로드합니다. 그것의 2 단계 나는 여기서 걱정하고 있습니다.

다른 질문 / 메일 링리스트 채터 triggerRepaint가 레이어에서 사용한다고 언급 했지만 작동하지 않습니다. 다른 제안으로는 setCacheImage(None)작동하지 않는 것이 있습니다. 레이어는 결국 업데이트되지만 실제로 논리를 볼 수 없으며 때로는 아무것도하지 않은 후에 놀랍게 발생합니다. 아니면 2 분 전에 뭔가를했을 수도 있습니다.

그것을 업데이트 할 수있는 재현 가능한 방법 중 하나는 범례 메뉴에서 레이어를 복제하는 것입니다. 복제본은 항상 현재 모양 파일에서 데이터를 가져오고 원래 레이어도 자체적으로 업데이트됩니다! 따라서 어떤 방법이 있어야합니다.

2.8에서 더 잘 작동한다고 생각하지만 이것은 2.10이므로 어딘가에 새로운 버그가있을 수 있습니다.

관련이 있지만 2.10에서 작동하지 않습니다.

QGIS에서 소스가 변경된 경우 래스터 레이어를 자동으로 다시로드하는 방법은 무엇입니까?

내가 시도한 다른 것들 :

  • layer.dataProvider().dataChanged.emit() -한 번 작업 한 다음 같은 레이어에서 다시 작동하지 않음

레이어 복제가 작동하는 이유를 추적했다고 생각합니다. 업데이트 된 레이어를 기반으로 새 스로 어웨이 레이어를 만든 다음 업데이트 된 레이어를 호출 .triggerRepaint()하면 맵 캔버스에서 업데이트됩니다.

QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()

다른 레이어 소스를 사용하면 작동하지 않으므로 동일한 레이어 소스를 기반으로 레이어 객체를 만드는 것 같습니다 ...

GeoTIFF의 래스터 레이어를 사용한 빠른 테스트와 그냥 호출 rlayer.triggerRepaint()하면 맵 캔버스에서 래스터의 뷰가 안정적으로 업데이트되는 것 같습니다.


샘플 코드를 게시해야 할 수도 있습니다.
Nathan W

@NathanW 내가하고있는 대부분의 일은 GUI에서로드 레이어에서 스타일을 지정 한 다음 Python 콘솔에서 레이어와 몇 줄을 얻는 것입니다. 나는 원리를 작동시킬 수있을 때까지 플러그인의 프레임 워크에 이것을 붙이지 않았다! 빠른 답변 ( "call layer.updateFromNewDataYouFool ()")이 있기를 바랐지만 나중에이 코드를 더 많은 코드 (R 코드 포함하여 shapefile을 작성)로 채울 것입니다.
Spacedman

확실히, 당신은 이후 두 명령을 사용하여 시도 : layer.setCacheImage(None)layer.triggerRepaint()?
Matthias Kuhn

예 @ MatthiasKuhn- 때로는 효과가 있지만 자주는 아닙니다. 방금 수정 된 shapefile을 작성 하고 Python 콘솔 (오른쪽 레이어)에서 시각적 업데이트없이 가지 작업을 모두 수행했습니다. 지금까지 100 % 효과를 보인 가장 간단한 방법은 위에서 언급 한대로 원본 레이어 소스를 기반으로 한 다음 원본 레이어를 기반으로 새로운 버리기 레이어 객체를 만드는 것 triggerRepaint()입니다. v 2.10.1-Pisa
Spacedman

이것이 OGR 연결 풀의 도입과 관련이있을 수 있다는 의혹이 있습니다. 디스크의 파일을 바꾸 거나 기존 파일을 편집 하면 차이가있는 경우 몇 가지 테스트를 수행 할 수 있습니까 ?
Matthias Kuhn

답변:


5

이것은 OGR 연결 풀의 도입과 관련이 있습니다. [1]

QGIS 2.10 이전에는 모든 단일 액세스 (예 : 다시 그리기)에서 파일이 다시 열립니다.

QGIS 2.10부터 파일 핸들은 열린 상태로 유지되며 이는 파일을 교체 할 경우 핸들이 여전히 Unix 기반 시스템 의 이전 파일 을 가리킴을 의미합니다.

QGIS 2.10 : 해결 방법

불행히도 QGIS가 QGIS 2.10에서 파일을 다시 열도록하는 API는 없습니다. 해결 방법으로 못생긴 해킹을 사용할 수 있습니다.

layer.dataProvider().changeAttributeValues( { -1: { 0: 0 } } )
layer.triggerRepaint()

QGIS 2.12 : 솔루션

방금 QGIS 2.12부터 사용할 수 있는 새로운 방법소개했습니다 .

layer.dataProvider().forceReload()
layer.triggerRepaint()

일반적인 접근

파일 덮어 쓰기 방법 을 제어 할 수있는 경우 디스크에서 파일을 완전히 교체 (삭제 / 다시 작성)하지 않고 기존 파일을 쓰기 권한으로 열고 내용을 변경할 수 있습니다.

[1] 연결 풀은 특정 데이터 소스에 대한 액세스 속도를 크게 향상시키기 위해 도입되었습니다.


최고의 솔루션 인 것 같습니다. 는 .changeAttributeValues"기능 ID와 모양을 읽을 수 (-1) 가능한 범위에서 시도 ERROR 1."는 나타납니다 하지만 괜찮습니다.
Spacedman

2

지도를 이동하거나 새로 고치면 업데이트되어야합니다.

이 기사에서는 PyQGIS에서 다음을 사용할 수 있다고 말합니다.

myLayer.triggerRepaint()

모든 레이어를 새로 고치려면 다음 기능을 사용할 수 있습니다.

def refresh_layers(self):
    for layer in qgis.utils.iface.mapCanvas().layers():
         layer.triggerRepaint()

내 질문에서 말했듯이, 내가 준 링크에서 언급했듯이 triggerRepaint()작동하지 않습니다. refresh()지도 캔버스에서 작동하지 않습니다. 캐시 이미지를 None(API 문서에서 더 이상 사용되지 않음)으로 설정하면 작동하지 않습니다. 방금 새로 수정 된 shapefile 레이어 에서이 모든 것을 시도하고 맵을 이동하고 비스를 켜고 끄면 작동하지 않았습니다. 레이어를 "중복"하면 즉시 업데이트됩니다. 이 것들을 직접 시도해 보셨습니까 (2.10)?
Spacedman

이 답변에 @ nathan-w가 필요하다고 생각합니다. 나는 그것을 직접 시도하지 않았다 ...
Alex Leith

IRC에서 #qgis를 시도했지만 qgis-dev 메일 링리스트에 게시해야 할 수도 있습니다.
Spacedman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.