基于网页抓取从维基百科提取地理空间数据问题咨询
维基百科坐标提取与距离计算实操指南
嘿,我来帮你搞定这个从维基百科抓取坐标、计算两点距离的问题!下面一步步给你讲清楚:
一、选哪种坐标格式最适合计算?
你看到的三种坐标格式里,**纯十进制度数(比如 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
相关产品推荐
相关产品推荐

