Error de OpenStreetMap PyQGIS
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
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 .