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) からこれらすべての点 (経度、緯度) への線をプロットしたいと考えています。

私は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=TRUEfunction 内に引数を追加する必要がありますgcIntermediate()。これにより、線が交差する場合、DateLine 関数は 2 つのセグメントを生成し、点を直線で結ばないようにします。この計算のすべての結果を list に保存しましたgg。このリストには、各行のデータ フレーム、または 2 つのセグメントで構成される行のデータ フレームのリストが含まれます。

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 の緯度に基づいています。xしたがって、負の座標値に 360 を追加する必要があります。

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

ここに画像の説明を入力

于 2013-07-26T08:28:08.307 に答える