3

I'm using PyQGIS to run the processing algorithm "qgis:extractbyextent". The algorithm runs in a for loop using the current extent to perform the clip. Saving the OUTPUT to memory works fine and all CRS information is present:

for layer in orderedLayers:
    processing.runAndLoadResults("qgis:extractbyextent", {
                "INPUT": orderedLayers[layer], 
                "EXTENT": iface.mapCanvas().extent(), 
                "CLIP": 'False',
                "OUTPUT": 'memory:'}) 

If I try and save the OUTPUT to a GeoPackage (using the code below) the CRS information is lost for each saved layer. The context box pops up and I have to specify the CRS before the layer is saved to the gpkg. Once saved checking the layers in the gpkg no CRS information is present and adding a layer to the map from the browser panel requires the CRS to be specified again.

for layer in orderedLayers:
    processing.runAndLoadResults("qgis:extractbyextent", {
                "INPUT": orderedLayers[layer], 
                "EXTENT": iface.mapCanvas().extent(), 
                "CLIP": 'False',
                "OUTPUT": 'ogr:dbname=\'C:/my_filepath/my_gpkg.gpkg\' table=\"' + layer + '\" (geom)'}) 

Is there a way to specify the output CRS?

Update

Using just processing.run still lost the CRS information. One workaround is to add an extra step first setting OUTPUT to 'memory: ' and then using "native:savefeatures" to save to the gpkg.

To include the CRS in the OUTPUT the a_srs option can be used as shown below:

for layer in reversed(orderedLayers):
processing.runAndLoadResults("qgis:extractbyextent", {
                "INPUT": orderedLayers[layer], 
                "EXTENT": iface.mapCanvas().extent(), 
                "CLIP": 'False',
                "OUTPUT": 'ogr:dbname=\'C:/my_filepath/my_gpkg.gpkg\' table=\"' + layer + '\" a_srs="EPSG:27700" (geom)'
                })
Oliver Burdekin
  • 1,452
  • 1
  • 15
  • 27

2 Answers2

0

Looks like it's derived from ogr2ogr and the 'a_srs' parameter can be applied to the output.

https://gdal.org/programs/ogr2ogr.html#cmdoption-ogr2ogr-a_srs

Oliver Burdekin
  • 1,452
  • 1
  • 15
  • 27
BioMap
  • 26
  • 2
0

I'm unable to reproduce your issue with QGIS 3.16. Try using processing.run and add yourself the layer instead of using processing.runAndLoadResults like below

for layer in orderedLayers:
    result = processing.run("qgis:extractbyextent", {
                "INPUT": orderedLayers[layer], 
                "EXTENT": iface.mapCanvas().extent(), 
                "CLIP": 'False',
                "OUTPUT": 'ogr:dbname=\'C:/my_filepath/my_gpkg.gpkg\' table=\"' + layer + '\" (geom)'})
    l = QgsVectorLayer(result['OUTPUT'], 'demo')
    QgsProject.instance().addMapLayer(l)

Your issue, that a windows appears each time to ask you to select a projection may also be related to the fact you may not have choose the transformation dialog behavior whereas your projection in destination file could be fine. So, take a look at Deciding whether to Select Transformation in QGIS

ThomasG77
  • 30,725
  • 1
  • 53
  • 93
  • I tried using processing.run but layers still had no CRS assigned. Another workaround I tried was setting the output to 'memory: ' and then saving the layer to the gpkg with "native:savefeatures". This worked but is an extra step and I was looking for a way to set the CRS at the output stage. – Oliver Burdekin Jul 27 '21 at 08:45