1

空間データに問題があります。NetCDF ファイルから温度データを抽出する必要があります。次に、特定の緯度と経度でのこの温度を、別のデータフレームに含まれる別の緯度と経度のセットに関連付ける必要があります。これは、変数を抽出するために使用したコードです。

myfile <- nc_open(paste(wd, 'myfile.nc', sep=''))
timearr = ncvar_get(myfile, "time")  
temp <- ncvar_get(myfile, 'temp_srf')
lat <- ncvar_get(myfile, 'lat_rho')
lon <- ncvar_get(myfile, 'lon_rho')
dim(temp)

[1] 27 75 52         # which means: 27 longitude * 75 latitudes * 52 time steps

今のところ、温度の最初の時間ステップで作業することにしました。そう:

> t1 <- as.vector(temp[,,1])

次に、最初の時間ステップで緯度、経度、気温を含む data.frame を作成しました。

lat1 <- as.vector(lat)
lon1 <- as.vector(lon)
df1 <- as.data.frame(cbind(lon1, lat1, t1))
head(df1)

    lon1    lat1     t1
1 18.15338  40.48656 13.96225
2 18.24083  40.55126 14.36726
3 18.32845  40.61589 14.53822
4 18.41627  40.68045 14.78643
5 18.50427  40.74495 14.88624
6 18.59246  40.80938 14.95925

別のデータ フレーム (df2) には、前の data.frame の最も近い緯度と経度に関連付ける必要がある緯度と経度のランダム ポイントがいくつかあります。

> df2 <- read.csv(paste(id, "myfile.csv", sep=""), header=TRUE, sep=",")
> head(df2)

    LONs     LATs
1 14.13189 43.41072
2 14.13342 43.34871
3 14.09980 43.40822
4 14.05338 43.72771
5 13.91311 43.88051
6 13.98500 43.91164

各ポイント間の距離を取得して、最も低いポイントを取得しようと考えていましたが、方法がわかりません。他の解決策があるかどうかはわかりません。

4

2 に答える 2

2

あなたのデータは投影座標であり、大円距離を計算する必要があると仮定しています。自分で数式を使用することも (ここで私の回答rdist.earthを参照)、パッケージから使用することもできますfields。の各エントリについてdf2、 のすべてのエントリからの距離を計算し、df1そのベクトルの最小距離のインデックスを見つけ、そのインデックスを使用してdf1temp を割り当てる適切な行を選択しますdf2。必要なのは 1 行だけです (ただし、手順をいくつかのコマンドに分けた方がわかりやすい場合があります)。

require( fields )
df2["Temp"] <- df1[ sapply( seq_len( nrow(df2) ) , function(x){ which.min( rdist.earth( df2[x,] , as.matrix( df1[ c("lon1" , "lat1") ] ) , miles = FALSE, R = 6371 ) ) } ) , "t1" ]

And the results using your data:
df1
#         lon1     lat1       t1
#   1 18.15338 40.48656 13.96225
#   2 18.24083 40.55126 14.36726
#   3 18.32845 40.61589 14.53822
#   4 18.41627 40.68045 14.78643
#   5 18.50427 40.74495 14.88624
#   6 18.59246 40.80938 14.95925

df2
#         LONs     LATs     Temp
#   1 14.13189 43.41072 13.96225
#   2 14.13342 43.34871 13.96225
#   3 14.09980 43.40822 13.96225
#   4 14.05338 43.72771 14.53822
#   5 13.91311 43.88051 14.53822
#   6 13.98500 43.91164 14.78643

あなたの距離は少なくとも 1 Km (このデータでは >300 km) 離れているように見えるので、大円の式で十分な精度が得られるはずです。それらが 1km より小さい場合は、Haversine 式を使用することをお勧めします。

于 2013-03-28T15:57:57.353 に答える
0

2 つの緯度/経度座標間の距離を取得するために私が気に入っている 2 つの数式は、Haversine の数式Vincenty の数式です。ハバーサインの公式は、地球が完全な球体であると仮定した単純な公式です。おそらく数フィートの精度が得られるでしょう。より高い精度が必要な場合は、Vincenty の公式を試してください。これは、地球の不完全な球形を説明しようとする回転楕円体ベースです。リンクのサンプルは R ではありませんが、R で書き直すことは難しくありません。

于 2013-03-28T16:03:02.793 に答える