如何在世界地图中显示连接纬度和经度点的线?

时间:2013-07-26 06:43:27

标签: python r google-maps map

我已获得经度和纬度的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)

结果是这样的: image of R

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

你知道吗?我怎么能意识到这一点?虽然我有Python和R的经验,但任何工具都可以。 谢谢!

1 个答案:

答案 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]))

enter image description here