1

現在、次のような R のデータ(N of 271,848) を使用しています。

Observation   Longitude     Latitude
--------------------------------------
      1        116.38800    39.928902
      2        53.000000    32.000000
      3          NA          NA
      4          NA          NA

そして、次の投稿のリバース ジオコード関数を使用しています: R で緯度と経度の座標を国名に変換します。

行を実行するとcoords2country(points)、次のエラーが表示されます。

「.checkNumericCoerce2double(obj) のエラー: 非有限座標」

私の最善の推測は、関数が欠損値を処理する方法を知らないということです。観測のサブセット(NA/欠損値を除く)でコードを実行すると、機能します。

この問題を解決するために関数を少し変更しようとしましたが (下記の最後の行を参照)、それでも上記のエラーが発生しました。

再現可能な例:

Data <- data.frame(
  Observation = 1:5,
  Longitude = c(116.3880005, 53, -97, NA, NA), 
  Latitude = c(39.92890167, 32, 32, NA, NA))

library(sp)
library(rworldmap)
    coords2country = function(points)
       {  
       countriesSP <- getMap(resolution='low')
       #countriesSP <- getMap(resolution='high') #you could use high res map from rworldxtra if       you were concerned about detail

      # convert our list of points to a SpatialPoints object
      #pointsSP = SpatialPoints(points, proj4string=CRS("+proj=longlat +datum=wgs84"))
      #! andy modified to make the CRS the same as rworldmap
      #pointsSP = SpatialPoints(points, proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
      # new changes in worldmap means you have to use this new CRS (bogdan):
      pointsSP = SpatialPoints(points, proj4string=CRS(" +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"))

      # use 'over' to get indices of the Polygons object containing each point 
      indices = over(pointsSP, countriesSP)

      # return the ADMIN names of each country
      indices$ADMIN  
      #indices$ISO3 # returns the ISO3 code
      #The line below is what I thought could resolve the problem.
      na.action = na.omit
        }
4

1 に答える 1

0

代わりにこれを使用することをお勧めします。

coords2country_NAsafe <- function(points)
{
    bad <- with(points, is.na(lon) | is.na(lat))
    result <- character(length(bad))
    result[!bad] <- coords2country(points[!bad,])
    result
}
于 2013-08-20T00:01:17.290 に答える