Error de OpenStreetMap PyQGIS

Sep 17 2020

Tengo un problema en el desarrollo de un complemento de Python, estoy tratando de mostrar el mapa de OpenStreetMap detrás de las capas, solo que el mapa no está sincronizado con las capas, no puede encontrarlo o incluso la ubicación.

La posición geográfica del mapa no se corresponde con la de mis capas.

#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")

resultado:

Respuestas

1 til_b Sep 17 2020 at 22:26

Debe establecer un CRS de destino en la configuración del renderizador. Lo siguiente funciona para mí.

Crea una capa de memoria de prueba

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()

Agregue la capa OSM, note httpsy tile.no 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')

Define los ajustes, estos son tuyos.

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

Esto es lo que necesitaba configurar, de lo contrario, la capa OSM no se renderizaría. editar: Aparentemente, debe ser el mismo que el vlayer CRS. Esto también se menciona en la sección 10.2 del libro de recetas de PyQIS .

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")

Resultado, que se coloca correctamente

Código completo aquí como GIST .