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

基于网页抓取从维基百科提取地理空间数据问题咨询

维基百科坐标提取与距离计算实操指南

嘿,我来帮你搞定这个从维基百科抓取坐标、计算两点距离的问题!下面一步步给你讲清楚:

一、选哪种坐标格式最适合计算?

你看到的三种坐标格式里,**纯十进制度数(比如 42.8371111; -2.6880444)**是最适合计算的!原因很简单:

  • 度分秒(DMS)格式需要手动转换成十进制,步骤繁琐容易出错;
  • 带方向的十进制格式还要把N/S、E/W转换成正负号(比如西经是负,南纬是负);
  • 纯十进制格式已经帮你处理好了符号,直接就能拿来做数值计算,效率最高。

二、如何提取纯十进制坐标?

你已经把维基百科的vcard表格转成数据框了,接下来只要定位到坐标行,再用正则表达式提取目标内容就行。给你写好现成的R代码:

首先如果没装stringr包的话先安装:

install.packages("stringr")
library(stringr)

然后提取坐标:

# 找到包含坐标的行(维基百科vcard里通常第一列会有"Coordinates"或"Coord"关键词)
coord_row <- dict[grepl("Coordinates|Coord", dict[,1], ignore.case = TRUE), ]

# 从第二列里提取纯十进制坐标(匹配数字、负号、分号的组合)
decimal_coord_str <- str_extract(coord_row[,2], "-?\\d+\\.\\d+; -?\\d+\\.\\d+")

# 分割成纬度和经度,转成数值型
lat_lon <- as.numeric(strsplit(decimal_coord_str, "; ")[[1]])
target_lat <- lat_lon[1]  # 纬度
target_lon <- lat_lon[2]  # 经度

如果遇到某些页面的关键词不一样,你可以调整grepl里的匹配文本,比如换成"Location"之类的,灵活调整就行。

三、坐标距离怎么计算?

你已经加载了geosphere包,这简直太方便了!这个包专门处理地理空间计算,完全不用自己写复杂的球面/椭球面公式,直接用现成函数就行:

常用的距离计算函数(按精度排序)

  • distHaversine():基于哈弗辛公式,计算大圆距离,单位是米,速度快,适合短到中等距离的日常计算;
  • distVincentySphere():基于文森特球面公式,精度比哈弗辛高一点;
  • distVincentyEllipsoid():基于椭球体计算,精度最高,适合长距离或对精度要求极高的场景。

实操示例(假设你有第二组坐标)

# 假设你已经抓取到第二个地点的坐标:比如lat2, lon2
# 注意!geosphere的函数要求参数是【先经度,后纬度】,别搞反了!
coords_point1 <- c(target_lon, target_lat)
coords_point2 <- c(lon2, lat2)

# 用哈弗辛公式计算距离(单位米)
distance_meters <- distHaversine(coords_point1, coords_point2)
# 转换成公里的话
distance_km <- distance_meters / 1000

# 输出结果
cat("两点之间的距离是", round(distance_km, 2), "公里\n")

小提醒

如果你好奇背后的公式,哈弗辛公式的核心是把经纬度转换成弧度,然后计算球面上两点的最短距离,但手动实现容易出错,用geosphere的函数既省心又准确。

内容的提问来源于stack exchange,提问作者Jack Armstrong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:27:13