我已获得经度和纬度的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中尝试了所有这些工作,我遇到了一些奇怪的事情。例如,如果我使用
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)
结果是这样的:
如果指向美国的所有线路进一步穿过太平洋,地图非常好。但事实并非如此。
你知道吗?我怎么能意识到这一点?虽然我有Python和R的经验,但任何工具都可以。 谢谢!答案 0 :(得分:2)
首先,您必须在函数breakAtDateLine=TRUE
中添加参数gcIntermediate()
。这将确保如果跨越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]))