OpenStreetMap PyQGIS-Fehler

Sep 17 2020

Ich habe ein Problem bei der Entwicklung eines Python-Plugins. Ich versuche, die OpenStreetMap-Map hinter Layern anzuzeigen. Nur die Map ist nicht mit den Layern synchronisiert, kann sie nicht finden oder sogar den Speicherort.

Die geografische Position der Karte entspricht nicht der meiner Ebenen.

#Vlayer is defined above the code / Vlayer est définie au-dessus du code 

urlWithParams = 'type=xyz&url=http://a.tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&zmax=19&zmin=0&crs=EPSG3857'
maplayer = QgsRasterLayer(urlWithParams, 'OpenStreetMap', 'wms')
settings = QgsMapSettings()
settings.setLayers([vlayer,maplayer])
settings.setBackgroundColor(QColor(255, 255, 255))
settings.setOutputSize(QSize(800, 690))

settings.setExtent(vlayer.extent())

render = QgsMapRendererParallelJob(settings)

render.start()
render.waitForFinished()

img = render.renderedImage()
img.save(QgsApplication.qgisSettingsDirPath()+"python/plugins/nro_print/img/render.png", "png")

Ergebnis:

Antworten

1 til_b Sep 17 2020 at 22:26

Sie müssen in den Renderer-Einstellungen ein Ziel-CRS festlegen. Folgendes funktioniert für mich.

Erstellen Sie eine Testspeicherebene

vlayer = QgsVectorLayer('Point?crs=epsg:4647&field=ID:integer(3)&field=value:double','test',"memory")

mypts = [QgsPointXY(32500000,5700000),
  QgsPointXY(32500010,5700010),
  QgsPointXY(32500010,5700060),
  QgsPointXY(32500040,5700090)
]

for p in mypts:
    pt = QgsGeometry.fromPointXY(p)
    f = QgsFeature(vlayer.fields())
    f.setGeometry(pt)
    vlayer.dataProvider().addFeatures([f])

vlayer.updateExtents()

Fügen Sie die OSM-Ebene hinzu, beachten Sie httpsund tile.nicht a.tile..

urlWithParams = 'type=xyz&url=https://tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&zmax=19&zmin=0&crs=EPSG3857'
maplayer = QgsRasterLayer(urlWithParams, 'OpenStreetMap', 'wms')

Definieren Sie die Einstellungen, diese gehören Ihnen.

settings = QgsMapSettings()
settings.setLayers([vlayer,maplayer])
settings.setBackgroundColor(QColor(255, 255, 255))
settings.setOutputSize(QSize(800, 690))

Dies musste ich einstellen, sonst würde die OSM-Ebene nicht gerendert. edit: Anscheinend muss es das gleiche sein wie das vlayer CRS. Dies wird auch in Abschnitt 10.2 des PyQIS-Kochbuchs erwähnt .

settings.setDestinationCrs(vlayer.crs())

settings.setExtent(vlayer.extent().buffered(30))

render = QgsMapRendererParallelJob(settings)

render.start()
render.waitForFinished()

img = render.renderedImage()
img.save("c:/temp/render.png", "png")

Ergebnis, das richtig platziert ist

Vollständiger Code hier als GIST .