[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