OpenStreetMap PyQGIS hatası

Sep 17 2020

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

1 til_b Sep 17 2020 at 22:26

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 .