Bài 10: Đặt và tải lại nguồn dữ liệu bản đồ cơ sở (Basemap)

Bài 1: Bắt đầu với lập trình Python QGIS
Bài 2: Thêm lớp Vector
Bài 3: Thêm lớp Raster
Bài 4: Làm việc với lớp Vector
Bài 5: Cách thêm/xóa trường và cập nhật giá trị thuộc tính
Bài 6: Thêm dữ liệu CSV
Bài 7: Drawing Marker
Bài 8: Vẽ Polyline và Polygon
Bài 9: Animate GPS Track
Bài 10: Đặt và tải lại nguồn dữ liệu bản đồ cơ sở (Basemap)

Trong bài viết này, chúng tôi sẽ chuyển sang thảo luận thêm về Data Provider cụ thể về cách đặt nguồn dữ liệu lớp, tải lại và thêm nó vào Canvas bản đồ của QGIS.

Giả sử chúng ta có ba bản đồ cơ sở (OSM, Strava Heatmap và Stamen Terrain). Chúng tôi muốn tạo một chức năng để thêm và thay đổi sơ đồ cơ sở. Vì vậy, chúng ta có thể gọi hàm để đặt một sơ đồ cơ sở khác mà không cần thêm một lớp mới.

Có một số bước phải được thực hiện. Đầu tiên, chúng tôi bắt đầu ba biến cho mỗi sơ đồ cơ sở như sau:

#URL ADDRESS
osm="url=http://a.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png&zmax=19&zmin=0&type=xyz"
strava="url=https://heatmap-external-b.strava.com/tiles/all/bluered/{z}/{x}/{y}.png&zmax=19&zmin=0&type=xyz"
stamen="url=http://a.tile.stamen.com/terrain/{z}/{x}/{y}.png&zmax=20&zmin=0&type=xyz"

Sau đó, chúng tôi tạo một danh sách cho URL và tạo một danh sách cho tên lớp.

#INITIATE LIST FOR URL AND LAYER NAME
layer_list=[osm,strava,stamen] 
layer_name=["OSM","Strava Heatmap","Stamen Terrain"]

Tiếp theo, chúng tôi thêm một sơ đồ cơ sở ban đầu vào khung vẽ bản đồ QGIS.

#ADD INITIAL BASEMAP
uri=url_list[0] #OSM 
basemap_layer=QgsRasterLayer(uri,"basemap",'wms')
QgsProject.instance().addMapLayer(basemap_layer)

Bây giờ chúng ta tạo một hàm được gọi là change_basemap với một đối số tên của tên lớp. Trong chức năng này, chúng tôi thực hiện một số bước như: lấy chỉ mục của url dựa trên tên lớp. Đặt url của lớp bản đồ cơ sở với url mới. Tải lại nó và làm mới bản đồ canvas.

Để thiết lập url sơ đồ cơ sở mới và tải lại nó, chúng tôi đang sử dụng phương thức setDataSourceUri từ lớp QssDataProvider. Sau đó, chúng tôi nạp lại (repaint) lại lớp raster bản đồ cơ sở bằng phương thức triggerRepaint và tải lại nó. Để xem sơ đồ cơ sở mới, chúng ta phải làm mới khung vẽ bản đồ bằng phương thức refresh từ lớp iface. Các chức năng cơ sở thay đổi hoàn toàn như sau.

#FUNCTION TO CHANGE BASEMAP
def change_basemap(name):
    #GET URL INDEX BASED ON LAYER NAME
    index=layer_name.index(name)
    uri=url_list[index]

    #SET DATASOURCE AND RELOAD DATA
    basemap_layer.dataProvider().setDataSourceUri(uri)
    basemap_layer.dataProvider().reloadData()
    basemap_layer.triggerRepaint()
    basemap_layer.reload()
    
    #REFRESH QGIS MAP CANVAS
    iface.mapCanvas().refresh()

Mã code hoàn chỉnh như dưới đây.

#URL ADDRESS
osm="url=http://a.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png&zmax=19&zmin=0&type=xyz"
strava="url=https://heatmap-external-b.strava.com/tiles/all/bluered/{z}/{x}/{y}.png&zmax=19&zmin=0&type=xyz"
stamen="url=http://a.tile.stamen.com/terrain/{z}/{x}/{y}.png&zmax=20&zmin=0&type=xyz"

#INITIATE LIST FOR URL AND LAYER NAME
url_list=[osm,strava,stamen]
layer_name=["OSM","Strava Heatmap","Stamen Terrain"]

#ADD INITIAL BASEMAP
uri=url_list[0] #OSM 
basemap_layer=QgsRasterLayer(uri,"basemap",'wms')
QgsProject.instance().addMapLayer(basemap_layer)

#FUNCTION TO CHANGE BASEMAP
def change_basemap(name):
    #GET URL INDEX BASED ON LAYER NAME
    index=layer_name.index(name)
    uri=url_list[index]

    #SET DATASOURCE AND RELOAD DATA
    basemap_layer.dataProvider().setDataSourceUri(uri)
    basemap_layer.dataProvider().reloadData()
    basemap_layer.triggerRepaint()
    basemap_layer.reload()
    
    #REFRESH QGIS MAP CANVAS
    iface.mapCanvas().refresh()

Lưu mã và chạy nó. Sơ đồ cơ sở OSM sẽ được thêm vào khung bản đồ của QGIS. Để thay đổi nó, hãy nhập vào Python Console change_basemap (“Strava Heatmap”) để thay đổi sơ đồ cơ sở thành sơ đồ nhiệt Strava hoặc change_basemap(“Stamen Terrain”) để thay đổi nó thành sơ đồ địa hình Strava.

Trên đây là tất cả các hướng dẫn về cách đặt nguồn dữ liệu cho sơ đồ cơ sở xyz, tải lại và xem nó trong QGIS.

Bình luận bằng Facebook Comments