Bài 9: Animate GPS Track

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 hướng dẫn về Python của QGIS này, tôi sẽ giải thích về cách tạo hiệu ứng theo dõi GPS trên bản đồ QGIS. Hoạt hình là một cách thực sự thú vị để trực quan hóa dữ liệu không gian.

Đối với hướng dẫn này, tôi sẽ sử dụng tệp GPX được gọi là ride.gpx. Tôi sẽ phân tích tệp bằng xml dom để trích xuất tọa độ của các điểm theo dõi. Sau đó làm động các điểm bằng các điểm đánh dấu với khoảng thời gian xác định. Kết quả của hoạt hình theo dõi có thể được nhìn thấy trong hình sau:

Hãy bắt đầu hướng dẫn này bằng cách nhập một số thư viện python như xml dom và time.

import time
from xml.dom import minidom

Sử dụng thư viện minidom, sau đó chúng tôi đọc tệp gpx và lấy phần tử theo dõi. Nó sẽ trả về một danh sách theo dõi cho mỗi điểm.

#READ GPX FILE
data=open('F:/ride.gpx')
xmldoc = minidom.parse(data)
track = xmldoc.getElementsByTagName('trkpt')
n_track=len(track)

Tiếp theo, danh sách được phân tích cú pháp để có được mỗi tọa độ điểm (kinh độ và vĩ độ – longitude và latitude). Dựa trên tọa độ, sau đó một điểm đánh dấu được tạo cho mỗi điểm và được lưu trong danh sách (Marker_list). Biểu tượng đánh dấu cũng được tùy chỉnh trong bước này bằng cách thiết lập màu sắc, loại biểu tượng, màu tô, kích thước và chiều rộng đường. Cuối cùng, các điểm đánh dấu được hiển thị trên khung bản đồ của QGIS với khoảng thời gian 1 giây.

#PARSING GPX ELEMENT AND CREATING MARKER
marker_list=[]
canvas=iface.mapCanvas()
for s in range(n_track):
    lon,lat=track[s].attributes['lon'].value,track[s].attributes['lat'].value
    x=float(lon)
    y=float(lat)
    m = QgsVertexMarker(canvas)
    m.setCenter(QgsPointXY(x,y))
    m.setColor(QColor(255,0,0))
    m.setFillColor(QColor(255,255,0))
    m.setIconSize(10)
    m.setIconType(QgsVertexMarker.ICON_CIRCLE)
    m.setPenWidth(3)
    marker_list.append(m)
    time.sleep(1)
    print(m)

Tiếp theo, một chức năng được gọi là hide_track được tạo để ẩn theo dõi GPS. Và cũng có chức năng play_track được tạo để phát hoạt hình theo dõi. Các hàm này sẽ lấy từng điểm đánh dấu trong danh sách đánh dấu và ẩn hoặc hiển thị nó với khoảng thời gian 1 giây. Cả hai chức năng chỉ có thể được sử dụng sau khi thực thi mã. Để ẩn bản nhạc, chỉ cần nhập vào bảng điều khiển python hide_track () và play_track () để bắt đầu lại hoạt hình theo dõi GPS.

#FUNCTION TO HIDE AND PLAY TRACK ANIMATION    
def hide_track():
    for i in range(n_track):
        marker_list[i].hide()

def play_track():
    hide_track()
    for j in range(n_track):
        marker_list[j].show()
        time.sleep(1) #Time interval. You can change it here
        print(marker_list[j])

Mã hoàn chỉnh như dưới đây. Trong hình dưới cho thấy hành động mã code trong QGIS.

import time
from xml.dom import minidom

#READ GPX FILE
data=open('F:/ride.gpx')
xmldoc = minidom.parse(data)
track = xmldoc.getElementsByTagName('trkpt')
n_track=len(track)

#PARSING GPX ELEMENT AND CREATING MARKER
marker_list=[]
canvas=iface.mapCanvas()
for s in range(n_track):
    lon,lat=track[s].attributes['lon'].value,track[s].attributes['lat'].value
    x=float(lon)
    y=float(lat)
    m = QgsVertexMarker(canvas)
    m.setCenter(QgsPointXY(x,y))
    m.setColor(QColor(255,0,0))
    m.setFillColor(QColor(255,255,0))
    m.setIconSize(10)
    m.setIconType(QgsVertexMarker.ICON_CIRCLE)
    m.setPenWidth(3)
    marker_list.append(m)
    time.sleep(1)
    print(m)
   
#FUCNTION TO HIDE AND PLAY TRACK ANIMATION    
def hide_track():
    for i in range(n_track):
        marker_list[i].hide()

def play_track():
    hide_track()
    for j in range(n_track):
        marker_list[j].show()
        time.sleep(1)
        print(marker_list[j])

Trên đây là tất cả các hướng dẫn làm thế nào để theo dõi GPS trong QGIS bằng Python.

Bình luận bằng Facebook Comments