[QGIS-Developer] Unable to export map with PyQGIS 3

Dimitris Kar dkarakostis at gmail.com
Wed Oct 24 05:53:20 PDT 2018


Thanks a lot all!

On Wed, Oct 24, 2018 at 12:23 PM Kari Salovaara <kari.salovaara at pp1.inet.fi>
wrote:

> Please look at
> https://locatepress.com/books
> where You can find all essential for QGIS
>
> Cheers, Kari
>
> Dimitris Kar kirjoitti 24.10.2018 klo 11:21:
>
> Hey Raymond,
>
> Thank you very much for your answer. It worked. Are you aware of any
> resources, online trainings, books or anything else which focuses on the
> pyqgis3? What would be your recommendation on this.
>
> Cheers
> Dimitris
>
> On Wed, Oct 24, 2018 at 10:09 AM Raymond Nijssen <r.nijssen at terglobo.nl>
> wrote:
>
>> Hi Dimitris,
>>
>> It is indeed hard to learn pyqgis 3 with outdated docs.
>>
>> The following code worked for me (suggested by Martin Dobias):
>>
>> settings = QgsMapSettings()
>> settings.setOutputSize(QSize(512,512))
>> settings.setExtent(layer.extent())
>> settings.setLayers([layer])
>>
>> job = QgsMapRendererSequentialJob(settings)
>> job.start()
>> job.waitForFinished()
>> img = job.renderedImage()
>> img.save("/tmp/rendered.png")
>>
>> When you call job.start(), it will start rendering in background and
>> immediately return. That's why you need to call job.waitForFinished()
>> to block your code until the final image is ready. This approach has a
>> downside that it blocks the main thread and therefore the GUI will be
>> blocked until rendering has finished. If you would like to avoid this
>> blocking, after job.start() you could have a slot that would listen to
>> finished() signal coming from "job" - and save the image there. This
>> approach makes the code a bit more complex, but the GUI does not get
>> blocked and you can even start multiple jobs at a time in parallel.
>>
>> Hope it helps you. Good luck learning pyqgis!
>>
>> Raymond
>>
>>
>>
>> On 24-10-18 09:47, Dimitris Kar wrote:
>> > I am trying to learn and work with PyQGIS 3.
>> >
>> > It is a very challenging task cause documentation is really [limited
>> and
>> > out of date][1].
>> >
>> > What I am trying to do is to:
>> >
>> >   1. create a project
>> >   2. add a layer
>> >   3. save the project
>> >   4. export it as a png
>> >
>> > I have done the first 3 steps (see code below).
>> >
>> >      import sys
>> >      import qgis
>> >      from qgis.core import QgsVectorLayer
>> >      from qgis.core import QgsApplication
>> >      from qgis.core import QgsProject
>> >      from qgis.core import QgsMapRendererJob, QgsMapSettings
>> >      from qgis.gui import QgsMapCanvas
>> >      from PyQt5.QtGui import QImage, QColor, QPainter
>> >      from PyQt5.QtCore import QSize
>> >
>> >      # PYTHON APPLICATIONS
>> >
>> >      # prefix path: the location where qgis is installed in the system
>> >      # the easiest way to find the prefix path to run the following
>> > commaand from the python console of qgis: QgsApplication.prefixPath()
>> >
>> >      #1. CREATE THE APPLICATION
>> >      QgsApplication.setPrefixPath('/usr', True)
>> >      # second parameter into false disables the gui
>> >      qgs = QgsApplication([], False)
>> >      #load providers
>> >      qgs.initQgis()
>> >
>> >      #2. CREATE THE PROJECT
>> >      # create project
>> >      project_name = '/home/dkar/workspaces/qgis/data/test_project_2.qgz'
>> >      project = QgsProject.instance()
>> >      new_project = project.write(project_name)
>> >
>> >      #3. READ/OPEN THE PROJECT
>> >      # modify the project e.g. adding more layers and save it.
>> >      new_project = project.read(project.fileName())
>> >
>> >
>> >      #4. ADD A VECTORLAYER
>> >      # add a layer in the QgsProviderRegistry
>> >
>> > layer=QgsVectorLayer("/home/dkar/workspaces/qgis/data/pakistan_1.shp",
>> > "pakistan", "ogr")
>> >
>> >      if not layer.isValid():
>> >          print("Layer failed")
>> >
>> >      #5. ADD LAYER TO THE REGISTRY
>> >      project.addMapLayer(layer, True)
>> >      project.write('/home/dkar/workspaces/qgis/data/test_project_2.qgz')
>> >
>> >      #6. SAVE THE PROJECT
>> >      all_layers = QgsProject.instance().mapLayers()
>> >
>> >
>> >      img = QImage(QSize (800, 600), QImage.Format_ARGB32_Premultiplied)
>> >      # set image's backgroud color
>> >      color = QColor(255, 255, 255)
>> >      img.fill(color.rgb())
>> >
>> >      #create painter
>> >      p = QPainter()
>> >      p.begin(img)
>> >      p.setRenderHint(QPainter.Antialiasing)
>> >
>> >      # THIS IS WHERE THE ISSUE APPEARS
>> >      # THIS IS WHERE THE ISSUE APPEARS
>> >      render = QgsMapRendererJob() # THIS IS WHERE THE ISSUE APPEARS
>> >
>> >      # set layer set (am I using here the prohect?)
>> >      lst = [layer.id <http://layer.id>()] # cause "layer" is the name
>> of
>> > the variable
>> >      render.setLayerSet(lst)
>> >
>> >      # to remove the provider and layer registries from memory
>> >      qgs.exitQgis()
>> >
>> >
>> >
>> > But when I try to do the last part, following the instructions from the
>> > existing documentation. I get issues because the specific function
>> > (`QgsMapRenderer`) doesn't exist anymore in QGIS 3.
>> >
>> > I am not sure how to solve the issue.
>> >
>> > I see in the documentation that this function:
>> >
>> >      QgsMapRenderer
>> >
>> > was replaced by
>> >
>> >      QgsMapRendererJob
>> >
>> > But then when I try to import and use it in the code as:
>> >
>> >      from qgis.core import QgsMapRendererJob, QgsMapSettings
>> >          render = QgsMapRendererJob()
>> >
>> > I get an error message:
>> >
>> >      TypeError: qgis._core.QgsMapRendererJob represents a C++ abstract
>> > class and cannot be instantiated
>> >
>> > Any idea how to proceed with this?
>> >
>> >    [1]:
>> >
>> https://docs.qgis.org/testing/pdf/en/QGIS-testing-PyQGISDeveloperCookbook-en.pdf
>> >
>> > _______________________________________________
>> > QGIS-Developer mailing list
>> > QGIS-Developer at lists.osgeo.org
>> > List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
>> > Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
>> >
>>
>> --
>> Terglobo
>> Fahrenheitstraat 1
>> 5223 BJ 's-Hertogenbosch
>> The Netherlands
>> +31 (0) 6 25 31 49 83
>> _______________________________________________
>> QGIS-Developer mailing list
>> QGIS-Developer at lists.osgeo.org
>> List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
>> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
>
>
>
> _______________________________________________
> QGIS-Developer mailing listQGIS-Developer at lists.osgeo.org
> List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20181024/3a8cec7b/attachment.html>


More information about the QGIS-Developer mailing list