OpenStreetMap PyQGIS hatası
Bir python eklentisinin geliştirilmesiyle ilgili bir problemim var, OpenStreetMap haritasını katmanların arkasında görüntülemeye çalışıyorum, sadece harita katmanlarla senkronize değil, onu hatta konumu bulamıyor.
Haritanın coğrafi konumu, katmanlarıminkine uymuyor.
#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")
sonuç:
Yanıtlar
Oluşturucu ayarlarında bir hedef CRS belirlemeniz gerekir. Aşağıdakiler benim için çalışıyor.
Bir test bellek katmanı oluşturun
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()
OSM katmanı ekleyin, not edin httpsve tile.değil 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')
Ayarları tanımlayın, bunlar sizin.
settings = QgsMapSettings()
settings.setLayers([vlayer,maplayer])
settings.setBackgroundColor(QColor(255, 255, 255))
settings.setOutputSize(QSize(800, 690))
Ayarlamam gereken şey buydu, aksi takdirde OSM katmanı görüntülenmezdi. edit: Görünüşe göre, vlayer CRS ile aynı olması gerekiyor. Bu, PyQIS yemek kitabının 10.2 bölümünde de bahsedilmektedir .
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")
Sonuç, doğru yerleştirilmiş
Tam kod burada bir GIST olarak .