25

地理座標を度から小数に変換したいのですが、データは次のとおりです。

         lat     long
105252 30°25.264 9°01.331
105253 30°39.237 8°10.811
105255 31°37.760 8°06.040
105258 31°41.190 8°06.557
105259 31°41.229 8°06.622
105260 31°38.891 8°06.281

私はこのコードを持っていますが、なぜそれが機能しないのかわかりません:

convert<-function(coord){
tmp1=strsplit(coord,"°")
tmp2=strsplit(tmp1[[1]][2],"\\.")
dec=c(as.numeric(tmp1[[1]][1]),as.numeric(tmp2[[1]]))
return(dec[1]+dec[2]/60+dec[3]/3600) 
} 
don_convert=don1
for(i in 1:nrow(don1)){don_convert[i,2]=convert(as.character(don1[i,2]));              don_convert[i,3]=convert(as.character(don1[i,3]))}

convert関数は機能しますが、ループにジョブを実行するように要求しているコードは機能しません。

どんな提案も承認されます。

4

7 に答える 7

26

すでに単位変換機能を備えたCRANのパッケージを使用しmeasurementsて、独自に作成する必要はありません。

x = read.table(text = "
   lat     long
105252 30°25.264 9°01.331
105253 30°39.237 8°10.811
105255 31°37.760 8°06.040
105258 31°41.190 8°06.557
105259 31°41.229 8°06.622
105260 31°38.891 8°06.281",
header = TRUE, stringsAsFactors = FALSE)

data.frameを設定したら、次のようにします。

# change the degree symbol to a space
x$lat = gsub('°', ' ', x$lat)
x$long = gsub('°', ' ', x$long)

# convert from decimal minutes to decimal degrees
x$lat = measurements::conv_unit(x$lat, from = 'deg_dec_min', to = 'dec_deg')
x$long = measurements::conv_unit(x$long, from = 'deg_dec_min', to = 'dec_deg')

最終製品の結果:

                    lat             long
105252 30.4210666666667 9.02218333333333
105253         30.65395 8.18018333333333
105255 31.6293333333333 8.10066666666667
105258          31.6865 8.10928333333333
105259         31.68715 8.11036666666667
105260 31.6481833333333 8.10468333333333
于 2016-05-12T18:06:44.080 に答える
9

ライブラリchar2dms内の関数を使用してみてください。sp10進変換を追加で行う他の関数があります。

library("sp")
?char2dms
于 2013-01-18T18:02:07.383 に答える
7

少しのベクトル化と行列操作により、関数がはるかに単純になります。

x <- read.table(text="
       lat     long
105252 30°25.264 9°01.331
105253 30°39.237 8°10.811
105255 31°37.760 8°06.040
105258 31°41.190 8°06.557
105259 31°41.229 8°06.622
105260 31°38.891 8°06.281",
                header=TRUE, stringsAsFactors=FALSE)

x

関数自体は以下を利用します:

  • strsplit()正規表現パターンを使用"[°\\.]"-これにより、文字列が1つのステップで分割されます
  • sapplyベクトルをループする

これを試して:

convert<-function(x){
  z <- sapply((strsplit(x, "[°\\.]")), as.numeric)
  z[1, ] + z[2, ]/60 + z[3, ]/3600
} 

それを試してみてください:

convert(x$long)
[1] 9.108611 8.391944 8.111111 8.254722 8.272778 8.178056

免責事項:私はあなたの数学をチェックしませんでした。あなた自身の裁量で使用してください。

于 2013-01-18T18:00:22.700 に答える
2

@GordStephenと@CephBirkの回答ありがとうございます。確かに私を助けてくれました。measurements::conv_unit「E/W」「N/S」のエントリを処理しないこともわかったので、正/負の度が必要です。私の座標は文字列として提供"1 1 1W"され、最初にに変換する必要があります"-1 1 1"
そのための解決策を共有したいと思いました。

df <- c("1 1 1E", "1 1 1W", "2 2 2N","2 2 2S")  
measurements::conv_unit(df, from = 'deg_min_sec', to = 'dec_deg')
[1] "1.01694444444444" NA                 NA                 NA  
Warning message:
In split(as.numeric(unlist(strsplit(x, " "))) * c(3600, 60, 1),  :
  NAs introduced by coercion

ewns <- ifelse( str_extract(df,"\\(?[EWNS,.]+\\)?") %in% c("E","N"),"+","-")
dms <- str_sub(df,1,str_length(df)-1)
df2 <- paste0(ewns,dms)

df_dec <- measurements::conv_unit(df2, 
                                  from = 'deg_min_sec', 
                                  to = 'dec_deg'))
df_dec
[1] "1.01694444444444"  "-1.01694444444444" "2.03388888888889"  "-2.03388888888889"
as.numeric(df_dec)
[1]  1.016944 -1.016944  2.033889 -2.033889
于 2018-01-03T11:50:28.147 に答える
1

degreeパッケージ内のコマンドを見てくださいOSMscale

于 2018-06-15T21:27:53.330 に答える
0

ジム・ルイスが前にコメントしたように、浮動小数点分を使用しているようです。次に、2つの要素のみを連結します

dec = c(as.numeric(tmp1 [[1]] [1])、as.numeric(tmp2 [[1]]))

as.character()「43°21'8.02\」を返す43°21'8.02の形式の度、分、秒を使用して、関数を次のように更新しました。

convert<-function(coord){
  tmp1=strsplit(coord,"°")
  tmp2=strsplit(tmp1[[1]][2],"'")
  tmp3=strsplit(tmp2[[1]][2],"\"")
  dec=c(as.numeric(tmp1[[1]][1]),as.numeric(tmp2[[1]][1]),as.numeric(tmp3[[1]]))
  c<-abs(dec[1])+dec[2]/60+dec[3]/3600
  c<-ifelse(dec[1]<0,-c,c)
  return(c)
}

負の座標の代替を追加し、私にとってはうまく機能します。ライブラリchar2dmsの関数が機能しなかった理由がまだわかりません。sp

ありがとう

于 2013-09-25T08:31:28.993 に答える
0

strsplitの代わりに部分文字列を使用するもう1つのあまりエレガントでないオプション。これは、すべてのポジションの桁数が同じである場合にのみ機能します。負の座標の場合は、正しい小数度に-1を掛けるだけです。

x$LatDD<-(as.numeric(substring(x$lat, 1,2))
+ (as.numeric(substring(x$lat, 4,9))/60))
x$LongDD<-(as.numeric(substring(x$long, 1,1))
       + (as.numeric(substring(x$long, 3,8))/60))
于 2016-01-18T06:34:53.327 に答える