[QGIS-Developer] Unable to export map with PyQGIS 3
Kari Salovaara
kari.salovaara at pp1.inet.fi
Wed Oct 24 03:23:26 PDT 2018
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 <mailto: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> <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
> <mailto: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 <mailto: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 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20181024/be55bb54/attachment.html>
More information about the QGIS-Developer
mailing list