Skip to content

Instantly share code, notes, and snippets.

@ThomasG77
Last active May 11, 2022 14:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ThomasG77/2d1531a8ec270b98606530d4108ea9df to your computer and use it in GitHub Desktop.
Save ThomasG77/2d1531a8ec270b98606530d4108ea9df to your computer and use it in GitHub Desktop.
import uuid
from io import BytesIO
import os
from flask import Flask, request, Response, send_file
app = Flask(__name__)
from qgis.PyQt.Qt import Qt
from qgis.PyQt.QtCore import QSize
from qgis.core import (QgsApplication, QgsFeature, QgsProject,
QgsGeometry, QgsVectorLayer, QgsMapSettings,
QgsMapRendererSequentialJob)
from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge
from qgis.server import *
QgsApplication.setPrefixPath("/usr", False)
qgisapp = QgsApplication([], False)
qgisapp.initQgis()
qgisserver = QgsServer()
@app.route('/qgis-server')
def qgisServer():
qgisrequest = QgsBufferServerRequest(request.url)
qgisresponse = QgsBufferServerResponse()
qgisserver.handleRequest(qgisrequest, qgisresponse)
response = Response(qgisresponse.body().data(), status=str(qgisresponse.statusCode()), headers=qgisresponse.headers()) #
return(response)
@app.route('/qgis-desktop')
def qgisdesktop():
canvas = QgsMapCanvas()
bridge = QgsLayerTreeMapCanvasBridge(
QgsProject.instance().layerTreeRoot(), canvas)
title = "PyQGIS Standalone Application Example"
canvas.setWindowTitle(title)
canvas.setCanvasColor(Qt.white)
layer_info = 'LineString?crs=epsg:4326'
layer = QgsVectorLayer(layer_info, 'MyLine' , "memory")
pr = layer.dataProvider()
linstr = QgsFeature()
wkt = "LINESTRING (1 1, 10 15, 40 35)"
geom = QgsGeometry.fromWkt(wkt)
linstr.setGeometry(geom)
pr.addFeatures([linstr])
layer.updateExtents()
QgsProject.instance().addMapLayer(layer)
canvas.setExtent(layer.extent())
canvas.setLayers([layer])
# canvas.zoomToFullExtent()
filename = str(uuid.uuid4())
filepath = '/tmp/{}.png'.format(filename)
QgsProject.instance().write('/tmp/out.qgs')
# canvas.saveAsImage(filepath)
settings = QgsMapSettings()
settings.setOutputSize(QSize(800, 600))
settings.setExtent(layer.extent())
settings.setLayers([layer])
job = QgsMapRendererSequentialJob(settings)
job.start()
job.waitForFinished()
img = job.renderedImage()
img.save(filepath)
with open(filepath, 'rb') as fh:
buf = BytesIO(fh.read())
os.remove(filepath)
# QgsProject.instance().write('/tmp/out.qgs')
return send_file(buf, mimetype='image/png')
if __name__ == '__main__':
app.debug = True
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment