QGIS 처리 / SEXTANTE와 함께 메모리 내 벡터 레이어 사용


10

qgis:clip콘솔 에서 알고리즘 을 실행하려고하는데 메모리 내 계층을 오버레이 매개 변수로 사용할 때 오류가 발생합니다. 이것이 예상됩니까, 아니면 내가 잘못하고 있습니까?

암호:

mem_layer = QgsVectorLayer("Polygon?crs=epsg:4326", "temp_layer", "memory")
if not mem_layer.isValid(): raise Exception("Failed to create memory layer")            
mem_layer_provider = mem_layer.dataProvider()

clip_polygon = QgsFeature()
clip_polygon.setGeometry(QgsGeometry.fromRect( 
    QgsRectangle(
        self.output_layer.extent().xMinimum() + 10,
        self.output_layer.extent().yMinimum() + 10,
        self.output_layer.extent().xMaximum() - 10,
        self.output_layer.extent().yMaximum() - 10
    )
))
mem_layer_provider.addFeatures([clip_polygon])
mem_layer.updateExtents()

output = self.output_layer_path + "2"
processing.runalg("qgis:clip", layer, mem_layer, output) # Fails

위의 코드에서, self.output_layerlayer이다 벡터 레이어 개체 (QgsVectorLayer - 디스크 모양 파일로드 적절한 것들), self.output_layer_path경로와 파이썬 문자열 객체이다.

내가 얻는 오류는 다음과 같습니다.

"C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\GeoAlgorithm.py", line 150, in     
    execute self.processAlgorithm(progress)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\algs\ftools\Clip.py", line 72, 
    in processAlgorithm index = utils.createSpatialIndex(layerB)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\algs\ftools\FToolsUtils.py", 
    line 31, in createSpatialIndex features = QGisLayers.features(layer)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\QGisLayers.py", line 211, 
    in features return Features(layer)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\QGisLayers.py", line 218, 
    in __init__ self.iter = layer.getFeatures()
AttributeError: 'NoneType' object has no attribute 'getFeatures'

처리 호출을 다음과 같이 변경하면 오류없이 실행됩니다.

processing.runalg("qgis:clip", layer, self.output_layer, output) # Runs fine

또한 도움이 필요한 경우 processing_qgis.log에 로그인 할 때 실패한 알고리즘입니다.

processing.runalg("qgis:clip","C:/path/to/shapefile.shp|layerid=0|subset=CONTINENT = 
    'Europe'","Polygon?crs=epsg:4326","C:/path/to/output")

1
도구가 하드 드라이브의 물리적 계층을 처리해야 할 것으로 예상됩니다. 그냥 생각, 그런데 왜 당신은 일시적으로 (당신이 위치해야 할 경우 임시 파일에 당신에게 레이어를 저장하려고하지 않는 import tempfiletempfile.gettempdir). 어쨌든 qgis-processing의 작동 방식
Curlew

필요한 경우 .. 이런 레이어를 위해 메모리에서 작업하기가 더 쉽고 깨끗합니다. 예상되는 경우 답변으로 게시하면 수락 할 수 있습니다.
Oystein

답변:


12

결과적으로 메모리 계층을 사용하기 전에 목차에 추가하는 한 잘 작동합니다. dataobjects.getObjectFromUriQGIS 소스 의 함수가 달리 처리 할 수없는 것 같습니다 .

따라서 다음은 매우 잘 작동합니다.

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
processing.runalg("qgis:clip", layer, mem_layer, output)

또한 처리 기능의 출력으로 메모리 레이어를 사용하는 방법에 대한 최근의 질문 을 참조하십시오 (기본적으로 processing.runandload대신 사용 processing.runalg).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.