2

Rでkml座標をプロットし、その上に種の豊富さデータを重ねることで、一度クールなマップを作成しました。初めてコードを書いたとき、次を使用して座標のリストを呼び出しました。
spa<-getKMLcoordinates('Perimeter_Track.kml', ignoreAltitude=TRUE)

summary(spa)戻り値:

 Length Class  Mode   
[1,] 128 -none- numeric

[2,] 242 -none- numeric

[3,] 34 -none- numeric

[4,] 126 -none- numeric

(GPS 座標は 4 つのチャンクで測定された境界トラックであるため、各リストはそれらのチャンクの 1 つです): コードを再度実行すると、次のようにsummary(spa)返されます。

         Length Class  Mode
[1,] 2      -none- list
[2,] 2      -none- list
[3,] 2      -none- list
[4,] 2      -none- list

を使用してスパをデータフレームに変換すると、 を使用して 4 つのチャンクを 1 つの大きなトラックに連結as.data.frame()しようとすると、このエラーが発生します。rbind

Error in match.names(clabs, names(xi)) : 
  names do not match previous names

R は kml ファイルを読み取っていないか、その一部しか読み取っていないようです。

リスト(またはデータフレーム)スパは

  c..157.80736808..21.4323436..20.324951171875.
1                                    -157.80737
2                                      21.43234
3                                      20.32495
  c..157.80738216..21.43231443..19.36376953125.
1                                    -157.80738
2                                      21.43231
3                                      19.36377
  c..157.80533605..21.43536092..15.9990234375. c..157.8053208..21.43541138..15.9990234375.
1                                   -157.80534                                  -157.80532
2                                     21.43536                                    21.43541
3                                     15.99902                                    15.99902
  c..157.80998348..21.43706806..15.9990234375.
1                                   -157.80998
2                                     21.43707
3                                     15.99902
  c..157.80997007..21.43711106..17.441162109375.
1                                     -157.80997
2                                       21.43711
3                                       17.44116
  c..157.81074733..21.43717535..13.5958251953125.
1                                      -157.81075
2                                        21.43718
3                                        13.59583
  c..157.81071673..21.43718331..14.076416015625.
1                                     -157.81072
2                                       21.43718
3                                       14.07642

これは maptools または私のコードのエラーですか? 私の知る限り、これは kml 座標を R が使用できる座標に変換する最も簡単な方法です。どうぞよろしくお願いいたします。

ファイルへのリンクはこちら: https://www.dropbox.com/s/y8elanjnst6438v/Perimeter_Track.kml

4

2 に答える 2

7

この修正は、R-forge、maptools プロジェクト、リビジョン 232 にコミットされています。ヨーロッパ時間の今晩以降に試してみてください。

install.packages("maptools", repos="http://R-Forge.R-project.org")

この問題を処理します。ただし、なぜ使用しなかったのかわかりません:

library(rgdal)
ogrListLayers(dsn="Perimeter_Track.kml") # to find the layer name
spa1 <- readOGR(dsn="Perimeter_Track.kml", layer="Perimeter_Track.kml")
summary(spa1)

これは SpatialLinesData Frame であり、それ以上の努力なしにさまざまな方法で使用できます。タブにも問題なく取り組みます。アドホック maptools 関数によって返されたフォームに入力するには、次のようにします。

o0 <- coordinates(spa1)
o1 <- lapply(o0, function(x) do.call("rbind", x))
library(maptools) # SVN revision >= 232
spa <- getKMLcoordinates('Perimeter_Track.kml', ignoreAltitude=TRUE)
all.equal(o1, spa)
于 2012-05-09T08:21:32.063 に答える
0

サンプル ファイルには、関数で想定されていないタブ文字が含まれていgetKMLcoordinatesます (maptools バージョン 0.8-14)。

小さな変更を加えると、期待どおりに機能します。私が追加したところにコメントを入れました:

getKMLcoordinates_01 <- function (kmlfile, ignoreAltitude = FALSE) 
{
    if (missing(kmlfile)) 
        stop("kmlfile is missing")
    kml <- paste(readLines(kmlfile, encoding = "UTF-8"), collapse = " ")
    re <- "<coordinates> *([^<]+?) *<\\/coordinates>"

    ## ++ new code
    ## remove tabs first
    kml <- gsub("\\t", "", kml)
    ##   

    mtchs <- gregexpr(re, kml)[[1]]
    coords <- list()
    for (i in 1:(length(mtchs))) {

        kmlCoords <- unlist(strsplit(gsub(re, "\\1", substr(kml, 
            mtchs[i], (mtchs[i] + attr(mtchs, "match.length")[i])), 
            perl = TRUE), split = " "))
        m <- t(as.matrix(sapply(kmlCoords, function(x) as.numeric(unlist(strsplit(x, 
            ","))), USE.NAMES = FALSE)))
        if (!ignoreAltitude && dim(m)[2] != 3) 
            message(paste("no altitude values for KML object", 
                i))
        coords <- append(coords, ifelse(ignoreAltitude, list(m[, 
            1:2]), list(m)))
    }
    coords
}

spa <- getKMLcoordinates_01("Perimeter_Track.kml")
summary(spa)
     Length Class  Mode   
[1,] 192    -none- numeric
[2,] 363    -none- numeric
[3,]  51    -none- numeric
[4,] 189    -none- numeric
R バージョン 2.15.0 パッチ適用 (2012-05-05 r59321) プラットフォーム: x86_64-pc-mingw32/x64 (64 ビット) ロケール: [1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252 LC_MONETARY=English_Australia.1252 LC_NUMERIC=C [5] LC_TIME=英語_オーストラリア.1252 付属の基本パッケージ: [1] stats グラフィック grDevices utils データセット コンパイラ メソッド ベース その他の添付パッケージ: [1] rgdal_0.7-8 maptools_0.8-14lattice_0.20-6 sp_0.9-98foreign_0.8-49 名前空間を介してロードされます (アタッチされません): [1] grid_2.15.0 tools_2.15.0
于 2012-05-08T05:31:55.060 に答える