如何使用大圆和R与R循环连接节点子集

时间:2014-11-10 10:45:29

标签: r map subset great-circle

我有以下数据集。总结一下具有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)

提前致谢并抱歉这篇长篇文章。 拉米罗

1 个答案:

答案 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")]))循环遍历非节点,并从节点到自身绘制一个大圆。这假设节点总是项目的第一行。