我有以下数据集。总结一下具有Id,经度和纬度的城市列表。它们也分为项目,也可以是中心节点(1)或径向节点(0)。这是它的结构:
> str(cities_sudoe)
'data.frame': 512 obs. of 6 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10 ...
$ city : Factor w/ 146 levels " Le Passage",..: 90 59 75 44 31 87 108 146 79 79 ...
$ project: int 1 1 1 1 1 1 1 1 2 2 ...
$ node : int 1 0 0 0 0 0 0 0 1 0 ...
$ lon : num -1.131 0.564 -9.139 0.627 2.173 ...
$ lat : num 38 44.2 38.7 44.5 41.4 ...
这是第一行:
> cities_sudoe
id city project node lon lat
1 1 Murcia 1 1 -1.1306544 37.99224
2 2 Estillac 1 0 0.5641070 44.15717
3 3 Lisboa 1 0 -9.1393366 38.72225
4 4 Cancon 1 0 0.6267610 44.53631
5 5 Barcelona 1 0 2.1734035 41.38506
6 6 Montpellier 1 0 3.8767160 43.61077
7 7 Quinta Da Saude 1 0 -8.4359658 37.11729
8 8 Zaragoza 1 0 -0.8890853 41.64882
9 9 Madrid 2 1 -3.7037902 40.41678
10 10 Madrid 2 0 -3.7037902 40.41678
11 11 Zaragoza 2 0 -0.8890853 41.64882
12 12 Lisboa 2 0 -9.1393366 38.72225
13 13 Auch 2 0 0.5867090 43.64638
14 14 Cuarte 3 1 -0.9331147 41.59621
15 15 Madrid 3 0 -3.7037902 40.41678
16 16 Sevilla 3 0 -5.9844589 37.38909
17 17 Toledo 3 0 -83.5552120 41.66394
18 18 Madrid 3 0 -3.7037902 40.41678
19 19 Albi 3 0 2.1486413 43.92509
20 20 Albi 3 0 2.1486413 43.92509
21 21 Lisboa 3 0 -9.1393366 38.72225
22 22 Lisboa 3 0 -9.1393366 38.72225
正如您所看到的,每个项目的第一个城市是一个中心节点。 所以我需要的是使用每个项目的GREAT CIRCLES将第一个中心节点与其他城市连接起来。我在以下代码行中完成了第一个项目。 但我需要的是一种为每个项目重新启动此过程的LOOP :
# Plotting a simple map
library(maps)
library(sp)
library(geosphere)
xlim <- c(-13.08, 8.68)
ylim <- c(34.87, 49.50)
map("world", col="#191919", fill=TRUE, bg="#000000", lwd=0.05, xlim=xlim, ylim=ylim)
symbols(cities_sudoe$lon, cities_sudoe$lat, bg="#e2373f", fg="#ffffff", lwd=0.5, circles=rep(1, length(cities_sudoe$lon)), inches=0.05, add=TRUE)
# Connecting with great circles 1st project
# lon & lat of central node
lon1 <- cities_sudoe$lon[1]
lat1 <- cities_sudoe$lat[1]
# lon & lat of radial nodes
lon2 <- cities_sudoe$lon[2]
lat2 <- cities_sudoe$lat[2]
lon3 <- cities_sudoe$lon[3]
lat3 <- cities_sudoe$lat[3]
lon4 <- cities_sudoe$lon[4]
lat4 <- cities_sudoe$lat[4]
lon5 <- cities_sudoe$lon[5]
lat5 <- cities_sudoe$lat[5]
lon6 <- cities_sudoe$lon[6]
lat6 <- cities_sudoe$lat[6]
lon7 <- cities_sudoe$lon[7]
lat7 <- cities_sudoe$lat[7]
lon8 <- cities_sudoe$lon[8]
lat8 <- cities_sudoe$lat[8]
inter12 <- gcIntermediate(c(lon1,lat1), c(lon2,lat2), n=6, addStartEnd=TRUE)
inter13 <- gcIntermediate(c(lon1,lat1), c(lon3,lat3), n=6, addStartEnd=TRUE)
inter14 <- gcIntermediate(c(lon1,lat1), c(lon4,lat4), n=6, addStartEnd=TRUE)
inter15 <- gcIntermediate(c(lon1,lat1), c(lon5,lat5), n=6, addStartEnd=TRUE)
inter16 <- gcIntermediate(c(lon1,lat1), c(lon6,lat6), n=6, addStartEnd=TRUE)
inter17 <- gcIntermediate(c(lon1,lat1), c(lon7,lat7), n=6, addStartEnd=TRUE)
inter18 <- gcIntermediate(c(lon1,lat1), c(lon8,lat8), n=6, addStartEnd=TRUE)
lines(inter12, col="#e2373f", lwd=2)
lines(inter13, col="#e2373f", lwd=2)
lines(inter14, col="#e2373f", lwd=2)
lines(inter15, col="#e2373f", lwd=2)
lines(inter16, col="#e2373f", lwd=2)
lines(inter17, col="#e2373f", lwd=2)
lines(inter18, col="#e2373f", lwd=2)
提前致谢并抱歉这篇长篇文章。 拉米罗
答案 0 :(得分:0)
我认为这有效:
lapply(split(cities_sudoe, cities_sudoe$project), function(x) {
node <- x[x$node == 1, c("lon", "lat")]
for (i in 2:nrow(x)) lines(gcIntermediate(node, x[i, c("lon", "lat")]))
})
不同部分的细分,供将来参考......
split(cities_sudoe, cities_sudoe$project)
返回一个数据框列表,其中每个数据框都是一个单独的项目
lapply(..., function(x) {...})
将函数应用于每个数据框
node <- x[x$node == 1, c("lon", "lat")]
获取项目节点的经度和纬度
for (i in 2:nrow(x)) lines(gcIntermediate(node, x[i, c("lon", "lat")]))
循环遍历非节点,并从节点到自身绘制一个大圆。这假设节点总是项目的第一行。