如何在 QGIS 的 python 代码中获取 google 底图?

How to get a google basemap in a python code for QGIS?

我正在为不同的用户创建一个 python 插件,其中包含每个人在 QGIS 中需要使用和使用的图层。

我可以使用以下代码从 Geoserver 添加栅格:

        wmsTicketDSM= QgsRasterLayer('contextualWMSLegend=0&crs=EPSG:27700&dpiMode=7&featureCount=10&format=image/png&layers=Ticket_DSM&password=XXXXXXXXXXXX&styles=&url=http://63.12.21.231:8080/geoserver/exchange_maps/wms&username=admin', 'Ticket_DSM', 'wms')
        if not wmsTicketDSM.isValid():
            print "Layer wmsTicketDSM failed to load!"
        else:
            print "Raster Layer wmsTicketDSM loaded!"
        QgsMapLayerRegistry.instance().addMapLayer(wmsTicketDSM,False)

现在我需要添加底图。如何在 python 上添加 Google 卫星地图?

Google 地图可以用作 Qgis 中的底图,将它们加载为 TMS(平铺地图服务)。从 QGIS 2.18 开始,Lutra.

已将对 TMS 的原生支持添加到 Qgis
import requests
service_url = "https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}"
service_uri = "type=xyz&zmin=0&zmax=21&url="+requests.utils.quote(service_url)
tms_layer = core.QgsRasterLayer(service_uri, "Google Hybrid", "wms")

其中 lyrs=y 用于混合地图,lyrs=s 用于卫星地图,lyrs=m 用于公路地图。

注意 uri 的 url 参数必须是百分号编码

QGIS 以前的版本可以支持使用 TileLayerPlugin by Minoru Akagi 公开所需的方法:

plugin = qgis.utils.plugins.get("TileLayerPlugin")
if plugin:
  from TileLayerPlugin.tiles import BoundingBox, TileLayerDefinition
  bbox = None    # BoundingBox(-180, -85.05, 180, 85.05)
  layerdef = TileLayerDefinition(u"title",
                                 u"attribution",
                                 "http://example.com/xyz/{z}/{x}/{y}.png",
                                 zmin=1,
                                 zmax=18,
                                 bbox=bbox)
  plugin.addTileLayer(layerdef)
else:
  from PyQt4.QtGui import QMessageBox
  QMessageBox.warning(None,
                      u"TileLayerPlugin not installed",
                      u"Please install it and try again.")

对于 Google 底图,将正确的 "attribution" 行和 url 行替换为以下内容:

"https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}"