OpenStreetMap PyQGIS त्रुटि

Sep 17 2020

मुझे अजगर प्लगइन के विकास पर एक समस्या है, मैं परतों के पीछे OpenStreetMap नक्शा प्रदर्शित करने की कोशिश कर रहा हूं, केवल नक्शे परतों के साथ सिंक्रनाइज़ नहीं है, यह इसे या यहां तक ​​कि स्थान नहीं मिल सकता है।

मानचित्र की भौगोलिक स्थिति मेरी परतों के अनुरूप नहीं है।

#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")

परिणाम:

जवाब

1 til_b Sep 17 2020 at 22:26

आपको रेंडरर सेटिंग्स पर एक गंतव्य सीआरएस सेट करना होगा। निम्नलिखित मेरे लिए काम करता है।

एक टेस्ट मेमोरी लेयर बनाएं

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 लेयर जोड़ें, नोट करें httpsऔर tile., नहीं 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')

सेटिंग्स को परिभाषित करें, ये आपके हैं।

settings = QgsMapSettings()
settings.setLayers([vlayer,maplayer])
settings.setBackgroundColor(QColor(255, 255, 255))
settings.setOutputSize(QSize(800, 690))

यह वही है जो मुझे सेट करने की आवश्यकता थी, अन्यथा ओएसएम परत प्रस्तुत नहीं करेगा। संपादित करें: जाहिरा तौर पर, यह vlayer CRS के समान होना चाहिए। इसका उल्लेख PyQIS कुकबुक की धारा 10.2 में भी किया गया है ।

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")

परिणाम, जिसे सही ढंग से रखा गया है

एक जिस्ट के रूप में यहां पूरा कोड ।