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 中尝试了所有这些工作,但遇到了一些奇怪的事情。例如,如果我使用

  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)

结果是这样的: R 的图像

如果所有的线都指向美国,那么地图就很好了。但事实并非如此。

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

4

1 回答 1

2

首先,您必须breakAtDateLine=TRUE在 function中添加参数gcIntermediate()。这将确保如果线穿过 DateLine 函数将产生两条线段,并且不会用直线连接点。这个计算的所有结果我都存储在 list 中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)

要再次绘制这些数据,您可以使用 function 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]))

在此处输入图像描述

于 2013-07-26T08:28:08.307 回答