messenger_logo
Liên hệ qua Messenger
SciEco

Bản đồ hóa hướng chụp ảnh với dấu mốc định hướng trên r và leaflet

I
IEFPA
Ngày viết: 19/06/2026

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 đồ
12map

Sau 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.


Bài viết khác
Trong các bài viết trước, chúng ta đã sử dụng phương thức `read_stata()` để đọc toàn bộ các tập dữ liệu của Stata vào các data frame của pandas. Điều này hoạt động hiệu quả khi bạn muốn đọc toàn bộ một tập dữ liệu của Stata vào Python. Tuy nhiên, đôi khi chúng ta muốn đọc một tập con của các biến số hoặc các quan sát, hoặc cả hai, từ một tập dữ liệu của Stata vào Python. Bài viết này sẽ giới thiệu mô-đun Giao diện Chức năng của Stata (SFI) và chỉ cho bạn cách sử dụng nó để đọc các tập dữ liệu một phần vào một data frame của pandas. Nếu bạn chưa quen với Python, việc tham khảo bốn bài viết đầu tiên trong chuỗi tích hợp Stata/Python có thể hữu ích trước khi tiếp tục. Sử Dụng Mô-đun SFI Để Chuyển Dữ Liệu Từ Stata Sang Python SFI là một mô-đun Python cho phép bạn truyền thông tin qua lại giữa Stata và Python. Bạn có thể sao chép toàn bộ hoặc một phần các tập dữ liệu, data frame, macro cục bộ và toàn cục, scalar và ma trận, thậm chí cả ma trận Mata toàn cục. Có quá nhiều tính năng để trình bày trong một bài blog. Vì vậy, hôm nay chúng ta sẽ tìm hiểu một tính năng mà bạn có thể sẽ sử dụng: đọc các tập dữ liệu Stata một phần vào Python. Chúng ta sẽ khám phá thêm các tính năng khác của SFI trong các bài viết sau.
Trong bài viết trước, chúng ta đã tìm hiểu cách cài đặt các thư viện Python bằng pip. Hôm nay, chúng ta sẽ đi sâu vào những thao tác cơ bản nhất để nạp và sử dụng các thư viện này ngay trong môi trường Stata. Thông qua các ví dụ thực hành với thư viện pandas, bài viết sẽ giúp bạn nắm vững những khái niệm quan trọng cùng cú pháp cốt lõi có thể áp dụng cho hầu hết thư viện Python hiện nay. Kiểm tra và nạp thư viện Python Thư viện pandas là một công cụ rất phổ biến dùng để xử lý, nhập và xuất dữ liệu trong Python. Thư viện này chứa nhiều module khác nhau phục vụ công việc tương tác với các cấu trúc dữ liệu như series hay data frame. Trước tiên, bạn có thể kiểm tra xem pandas đã được cài đặt trên hệ thống hay chưa bằng câu lệnh sau trong Stata:
SciEco
Science for Economics
Định hướng đào tạo phân tích dữ liệu, xây dựng chính sách, tối ưu hoá danh mục tài chính cá nhân và dự báo thị trường.
Liên hệ
Địa chỉ: Số 60, ngõ 41, Phố Thái Hà, Trung Liệt, Đống Đa, Hà Nội (Google Map)
Email: science.for.economics@gmail.com
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội