OpenStreetMap PyQGIS lỗi

Sep 17 2020

Tôi gặp sự cố khi phát triển plugin python, tôi đang cố hiển thị bản đồ OpenStreetMap đằng sau các lớp, chỉ có bản đồ không được đồng bộ hóa với các lớp, nó không thể tìm thấy nó hoặc thậm chí cả vị trí.

Vị trí địa lý của bản đồ không tương ứng với vị trí của các lớp của tôi.

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

kết quả:

Trả lời

1 til_b Sep 17 2020 at 22:26

Bạn cần đặt CRS đích trên cài đặt trình kết xuất. Những điều sau đây phù hợp với tôi.

Tạo một lớp bộ nhớ thử nghiệm

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

Thêm lớp OSM, lưu ý httpsvà tile., không 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')

Xác định các cài đặt, đây là của bạn.

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

Đây là những gì tôi cần thiết lập, nếu không lớp OSM sẽ không hiển thị. chỉnh sửa: Rõ ràng, nó cần phải giống như CRS vlayer. Điều này cũng được đề cập trong phần 10.2 của sách nấu ăn 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")

Kết quả, được đặt chính xác

Mã đầy đủ ở đây dưới dạng GIST .