Việc hiển thị các tọa độ địa lý trên bản đồ tương tác là một kỹ thuật quen thuộc đối với các nhà phân tích dữ liệu không gian. Bằng cách sử dụng công cụ dòng lệnh exiftool, chúng ta có thể dễ dàng trích xuất toàn bộ thông tin định vị toàn cầu từ một thư mục chứa ảnh định dạng JPG và xuất ra tệp CSV để xử lý.
Tuy nhiên, bên cạnh vĩ độ và kinh độ, các thiết bị di động hiện đại còn ghi lại một thông số cực kỳ thú vị là hướng của ống kính camera tại thời điểm bấm máy, được lưu trữ trong thẻ siêu dữ liệu GPSImgDirection. Việc thể hiện được hướng nhìn này trên bản đồ bằng các biểu tượng có khả năng xoay tự động sẽ giúp trực quan hóa hành trình một cách sinh động và chính xác hơn nhiều. Bài viết này sẽ hướng dẫn cách hiện thực hóa ý tưởng đó bằng thư viện leaflet trong môi trường R.
Chuẩn bị dữ liệu từ siêu dữ liệu ảnh chụp
Bước đầu tiên là trích xuất các thông tin định vị từ ảnh chụp. Công cụ exiftool tỏ ra cực kỳ hiệu quả cho tác vụ này. Bạn có thể mở cửa sổ dòng lệnh và chạy cú pháp sau để quét toàn bộ thư mục ảnh và lưu kết quả vào tệp CSV.
bash
exiftool '-*GPS*' -ext jpg -csv . > outfile.csv
end
Tệp kết quả thu được sẽ chứa các cột thông tin quan trọng như vĩ độ, kinh độ, thời gian chụp, sai số định vị và đặc biệt là góc hướng của camera so với hướng bắc thực tế.
Xử lý và làm sạch dữ liệu tọa độ trong R
Dữ liệu thô từ điện thoại di động thường có định dạng chuỗi chứa ký tự đơn vị độ phút giây hoặc ký hiệu đặc thù. Do đó, chúng ta cần tiến hành làm sạch và chuyển đổi chúng về định dạng số thực để các thư viện bản đồ có thể nhận diện được.
Đoạn mã dưới đây sử dụng các công cụ xử lý chuỗi và chuyển đổi tọa độ để chuẩn hóa dữ liệu đầu vào.
1library(readr)
2library(dplyr)
3library(stringr)
4library(sf)
5library(sp)
6library(leaflet)
7# Đọc dữ liệu từ tệp kết quả của exiftool
8outfile <- read_csv("outfile.csv")
9# Tiền xử lý và chuẩn hóa dữ liệu tọa độ
10dataset <- outfile %>%
11 mutate(GPSLatitude = str_replace(GPSLatitude, " deg", "d"),
12 GPSLatitude = GPSLatitude %>%
13 char2dms() %>%
14 as.numeric(),
15 GPSLongitude = str_replace(GPSLongitude, " deg", "d"),
16 GPSLongitude = GPSLongitude %>%
17 char2dms() %>%
18 as.numeric(),
19 GPSHPositioningError = str_replace(GPSHPositioningError, " m", ""),
20 GPSHPositioningError = GPSHPositioningError %>%
21 as.numeric()) %>%
22 select(latitude = GPSLatitude,
23 longitude = GPSLongitude,
24 GPSTimeStamp,
25 GPSImgDirection,
26 GPSHPositioningError)Tạo bản đồ và xoay biểu tượng theo hướng chụp
Điểm mấu chốt để hiển thị hướng chụp là việc sử dụng các biểu tượng có khả năng xoay góc. Thư viện leaflet hỗ trợ việc này thông qua hàm awesomeIcons bằng cách gán giá trị góc xoay của biểu tượng tương ứng với giá trị lưu trong cột GPSImgDirection.
Chúng ta sẽ chọn một biểu tượng mũi tên chỉ thẳng lên trên, đại diện cho góc không độ tức là hướng bắc. Khi áp dụng thuộc tính xoay góc, biểu tượng sẽ tự động quay theo đúng hướng camera thực tế.
1# Khởi tạo danh sách các biểu tượng có góc xoay tương ứng với hướng ảnh
2icons <- awesomeIcons(iconRotate = dataset$GPSImgDirection,
3 icon = "long-arrow-up",
4 library = "fa",
5 markerColor = "white",
6 squareMarker = TRUE)
7# Khởi tạo bản đồ tương tác và thêm các điểm mốc định hướng
8map <- leaflet(data = dataset) %>%
9 addProviderTiles(provider = providers$CartoDB.Positron) %>%
10 addAwesomeMarkers(icon = icons, label = ~GPSTimeStamp)
11# Hiển thị bản đồ
12mapSau khi thực thi đoạn mã trên, một bản đồ tương tác sẽ được tạo ra với các điểm mốc hình mũi tên tự động xoay theo hướng chụp thực tế của từng bức ảnh, mang lại cái nhìn trực quan và chân thực về góc quan sát của người chụp tại thực địa.

✨ Khả năng kết hợp siêu dữ liệu hướng chụp của ảnh với bản đồ tương tác mở ra những phương pháp phân tích không gian vô cùng độc đáo. Thay vì chỉ biết bức ảnh được chụp ở tọa độ nào, giờ đây bạn có thể tái dựng lại chính xác góc nhìn và hành trình di chuyển thực tế của người chụp, tạo ra các báo cáo trực quan sinh động cho các chuyến khảo sát thực địa hoặc phân tích dữ liệu hành trình du lịch.
Câu hỏi tư duy dành cho bạn
1. Trong trường hợp dữ liệu có những điểm chụp bị sai số định vị quá lớn do mất tín hiệu định vị toàn cầu, bạn sẽ viết thêm điều kiện lọc dữ liệu trong R như thế nào dựa trên trường thông tin sai số vị trí trước khi đưa lên bản đồ?
2. Hãy thử đề xuất giải pháp thay đổi màu sắc của các mũi tên trên bản đồ dựa trên các khoảng thời gian khác nhau trong ngày để thể hiện tiến trình thời gian của hành trình.


