2013-07-26 47 views
0

我已经得到经度的CSV文件和纬度类似下面的(总长度是CSV 86分):如何在世界地图上显示连接纬度和经度点的线?

Index  lon   lat 
    1   2.352222 48.85661 
    2   -72.922343 41.31632 
    3   108.926694 34.25005 
    4   -79.944163 40.44306 
    5  -117.328119 33.97329 
    6  -79.953423 40.4442 
    7   -84.396285 33.77562 
    8  -95.712891 37.09024 

现在我想从点画出一条线(32.06025,118.7969)到所有这些点(lon,lat),这些点与许多箭头线一样。

我尝试R全这项工作,我有东西相遇例如strange.For,如果我用

map('world2Hires') 
    for (j in 1:length(location$lon)) { 
    inter <- gcIntermediate(c(lon_nj, lat_nj), c(location$lon[j], location$lat[j]), n=100,   addStartEnd=TRUE) 
    lines(inter, col="black", lwd=0.8) 
    } 
    View(location) 

的结果是这样的: image of R

如果所有的线条指向美国进一步穿越太平洋,地图非常好。但事实并非如此。

你有什么想法吗?我怎么能意识到这一点?尽管我有Python和R的经验,但任何工具都可以。 谢谢!

回答

2

首先,您必须在函数gcIntermediate()内部添加参数breakAtDateLine=TRUE。这将确保如果交叉线的DateLine函数将产生两个线段,并且不会用直线连接点。这个计算的所有结果我存储在列表gg中。该列表包含每行的数据帧或行的数据帧列表,由两个段组成。

library(mapdata) 
library(geosphere) 
lon_nj<-118.7969 
lat_nj<-32.06025 
location<-structure(list(Index = 1:8, lon = c(2.352222, -72.922343, 108.926694, 
-79.944163, -117.328119, -79.953423, -84.396285, -95.712891), 
    lat = c(48.85661, 41.31632, 34.25005, 40.44306, 33.97329, 
    40.4442, 33.77562, 37.09024)), .Names = c("Index", "lon", 
"lat"), class = "data.frame", row.names = c(NA, -8L)) 

gg<-lapply(1:length(location$lon),function(j) { 
    gcIntermediate(c(lon_nj, lat_nj), c(location$lon[j], 
             location$lat[j]), n=100, 
       breakAtDateLine=TRUE, 
       addStartEnd=TRUE) 
}) 

这将更改您的列表,使每个段位于单独的数据框中,而不是列表中的列表。

gg2<-unlist(lapply(gg, function(x) 
    if (class(x) == "list") x else list(x)), recursive=FALSE) 

要再次绘制这些数据,您可以使用功能lapply()

如果使用map("world)然后做只是

map("world") 
lapply(gg2,lines) 

如果使用map('world2Hires')那么这个图是基于0-360纬度。因此,您必须将360添加到那些为负值的x坐标值。

map('world2Hires') 
lapply(gg2,function(x) lines(ifelse(x[,1]>0,x[,1],x[,1]+360),x[,2])) 

enter image description here

+0

非常感谢!这真是太好了! – sikisis

相关问题