Erreur OpenStreetMap PyQGIS

Sep 17 2020

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

1 til_b Sep 17 2020 at 22:26

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 .