如何在R中直接将IGC文件加载为Simple Features?
直接在R中加载IGC滑翔伞轨迹为Simple Features的解决方案
方法1:用专门轨迹包读取后转sf
trackeR包原生支持IGC格式解析,无需手动处理规范细节:
- 安装并加载包:
install.packages("trackeR") library(trackeR) library(sf) - 读取IGC文件:
igc_track <- read_track("your_file.igc", format = "igc") - 转换为sf对象:
# 先转成数据框提取坐标 track_df <- as.data.frame(igc_track) sf_track <- st_as_sf(track_df, coords = c("longitude", "latitude"), crs = 4326)
方法2:完善自定义解析函数
如果依赖自定义函数,需覆盖IGC核心规范避免出错:
- 核心处理逻辑(包含B记录解析、坐标转换、无效定位过滤):
parse_igc_to_sf <- function(file_path) { lines <- readLines(file_path) # 筛选有效B记录(定位有效标记为"A") valid_b_lines <- lines[grepl("^B.*A", lines)] parsed_data <- lapply(valid_b_lines, function(line) { # 提取时间 time <- substr(line, 2, 7) # 解析纬度(十进制转换) lat_deg <- as.numeric(substr(line, 8, 9)) lat_min <- as.numeric(substr(line, 10, 14)) / 60 lat_dir <- substr(line, 15, 15) lat <- ifelse(lat_dir == "S", -(lat_deg + lat_min), lat_deg + lat_min) # 解析经度(十进制转换) lon_deg <- as.numeric(substr(line, 16, 18)) lon_min <- as.numeric(substr(line, 19, 23)) / 60 lon_dir <- substr(line, 24, 24) lon <- ifelse(lon_dir == "W", -(lon_deg + lon_min), lon_deg + lon_min) # 提取高度数据 press_alt <- as.numeric(substr(line, 26, 30)) gnss_alt <- as.numeric(substr(line, 31, 35)) data.frame(time = time, press_alt = press_alt, gnss_alt = gnss_alt, lat = lat, lon = lon) }) track_df <- do.call(rbind, parsed_data) # 转换为sf对象,WGS84坐标系 st_as_sf(track_df, coords = c("lon", "lat"), crs = 4326) } - 使用方式:
sf_track <- parse_igc_to_sf("your_file.igc")
方法3:检查GDAL驱动支持
sf依赖GDAL,部分新版本GDAL自带IGC驱动:
- 先查看已安装的驱动:
library(sf) st_drivers() - 如果列表中有
IGC驱动,直接读取:sf_track <- st_read("your_file.igc", driver = "IGC") - 若无该驱动,需更新GDAL到3.0及以上版本,重启R后重试。
内容的提问来源于stack exchange,提问作者NeilC
相关产品推荐
相关产品推荐

