Erreur OpenStreetMap PyQGIS
J'ai un problème sur le développement d'un plugin python, j'essaye d'afficher la carte OpenStreetMap derrière les couches, seule la carte n'est pas synchronisée avec les couches, elle ne peut pas la trouver ni même l'emplacement.
La position géographique de la carte ne correspond pas à celle de mes couches.
#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")
résultat:
Réponses
Vous devez définir un CRS de destination sur les paramètres du moteur de rendu. Ce qui suit fonctionne pour moi.
Créer une couche de mémoire de test
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()
Ajoutez une couche OSM, notez httpset tile.non 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')
Définissez les paramètres, ce sont les vôtres.
settings = QgsMapSettings()
settings.setLayers([vlayer,maplayer])
settings.setBackgroundColor(QColor(255, 255, 255))
settings.setOutputSize(QSize(800, 690))
C'est ce que j'avais besoin de définir, sinon la couche OSM ne serait pas rendue. edit: Apparemment, il doit être le même que le vlayer CRS. Ceci est également mentionné dans la section 10.2 du livre de recettes 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")
Résultat, qui est correctement placé
Code complet ici sous forme de GIST .