You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R包将数据框中DMS格式坐标转为经纬度?

在R中将DMS格式坐标转换为十进制经纬度的简便方法

你的数据里的坐标是法语区常用的DMS格式(带逗号小数、O代表西经),需要先做简单格式适配,再用R包快速转换,下面是两种实用方法:

第一步:导入并预处理数据

首先把示例数据读入R,然后修正坐标格式——把逗号小数替换成点,把法语的"O"(西经)换成通用的"W":

# 导入示例数据
df <- structure(list(Nom = c("Pont de Normandie", "Pont de Tancarville", 
"Pont de Saint-Nazaire", "Pont de l’Iroise", "Pont d'Aquitaine", 
"Viaduc de Millau", "Pont de Brotonne", "Viaduc du Chavanon", 
"Pont de Térénez", "Pont du Bras de la Plaine"), Portée = c("856", 
"608", "404", "400", "394", "342 (×6)", "320", "300", "285", 
"281"), Long. = c(2141, 1420, 3356, 800, 1767, 2460, 1278, 360, 
515, 305), Type = c("Haubané\nacier, béton précontraint", 
"Suspendu\nacier, béton précontraint, béton armé", "Haubané\nacier, béton précontraint", 
"Haubané\nacier, béton précontraint", "Suspendu\nacier, béton précontraint, pylônes en béton armé", 
"Haubané\nMultihaubané, 7 piles béton, tablier et pylônes caissons acier, suspension axiale", 
"Haubané\nTablier caisson béton, pylônes béton, suspension axiale", 
"Suspendu\nTablier caisson mixte acier/béton, pylônes béton, suspension axiale", 
"Haubané\nTablier courbe dalle béton, pylônes béton", "Treillis mixte acier/béton, précontrainte extérieure"
), `Voie portée\nVoie franchie` = c("Autoroute A29\nRoute européenne 44\nSeine", 
"Autoroute A131\nRoute européenne 5\nN182\nSeine", "RD 213\nLoire", 
"RN 165\nRoute européenne 60\nÉlorn", "Autoroute A630\nRoute européenne 5\nRocade de Bordeaux\nGaronne", 
"Autoroute A75\nRoute européenne 11\nGorges du Tarn", "RD 490\nSeine", 
"Autoroute A89\nRoute européenne 70\nChavanon", "RD 791\nAulne", 
"RD 26\nBras de la Plaine"), Date = c("1995", "1959", "1975", 
"1994", "1967", "2004", "1977", "2000", "2011", "2001"), Localisation = c("Le Havre - Honfleur\n", 
"Tancarville - Marais-Vernier\n", "Saint-Nazaire - Saint-Brevin-les-Pins\n", 
"Plougastel-Daoulas - Le Relecq-Kerhuon\n", "Bordeaux\n", "Millau - Creissels\n", 
"Caudebec-en-Caux\n", "Merlines - Messeix\n", "Landévennec - Rosnoën\n", 
"Saint-Pierre - Entre-Deux\n"), A = c("49° 25′ 56,1″ N", 
"49° 28′ 21,6″ N", "47° 17′ 06,3″ N", "48° 23′ 18,1″ N", 
"44° 52′ 47,2″ N", "44° 04′ 48″ N", "49° 31′ 13,9″ N", 
"45° 37′ 26,5″ N", "48° 16′ 07,9″ N", "21° 16′ 35,5″ S"
), B = c("0° 16′ 26,3″ E", "0° 27′ 52,8″ E", 
"2° 10′ 13,8″ O", "4° 23′ 55,6″ O", "0° 32′ 09,7″ O", 
"3° 01′ 20,6″ E", "0° 44′ 49,8″ E", "2° 28′ 47,5″ E", 
"4° 15′ 48,2″ O", "55° 27′ 56,7″ E"), Département = c("Seine-Maritime\nCalvados", 
"Seine-Maritime\nEure", "Loire-Atlantique", "Finistère", "Gironde", 
"Aveyron", "Seine-Maritime", "Corrèze\nPuy-de-Dôme", "Finistère", 
"La Réunion")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

# 预处理坐标:替换逗号为点,O为W
df$A <- gsub(",", ".", df$A)
df$B <- gsub(",", ".", df$B)
df$B <- gsub("O", "W", df$B)

方法1:用measurements包快速转换

这个包专门做单位转换,语法简单,适合只需要得到十进制坐标的场景:

# 安装并加载包
install.packages("measurements")
library(measurements)

# 转换纬度(A列)和经度(B列)
df$latitude <- conv_unit(df$A, from = "deg_min_sec", to = "dec_deg")
df$longitude <- conv_unit(df$B, from = "deg_min_sec", to = "dec_deg")

# 查看转换结果
df[, c("Nom", "latitude", "longitude")]

方法2:用sf包转换(适配地理空间分析)

如果之后需要做地图可视化、空间查询等操作,用sf包更合适,它能把坐标转为空间对象:

# 安装并加载包
install.packages("sf")
library(sf)

# 把DMS坐标转为WKT格式,再转为空间对象
df$wkt <- paste0("POINT(", df$B, " ", df$A, ")")
sf_df <- st_as_sfc(df$wkt, crs = 4326)

# 提取十进制经纬度
coords <- st_coordinates(sf_df)
df$longitude <- coords[, "X"]
df$latitude <- coords[, "Y"]

# 查看结果
df[, c("Nom", "latitude", "longitude")]

两种方法最终得到的结果一致,按需选择即可。

内容的提问来源于stack exchange,提问作者Pol Cosentino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:20:27