在R中的两个CRS之间切换(使用rgdal)

时间:2016-01-22 09:29:09

标签: r geospatial rgdal

我(尝试)在成对的地理点上进行操作。我在WGS84中有我的点坐标,我需要在Lambert 2 Extended CRS(LIIE)中使用它们。我正在尝试使用rgdal

这就是我正在做的事情:

library("rgdal")
library("sp")

# Loading CRS
WGS84<-"+proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +no_defs"
LIIE<-"+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs"

# Loading the pairs of points
matrix<-read.table(file="file_with_coordinates.csv", header=TRUE, sep=";", stringsAsFactors = F)

matrix的列如下:origin_iddestination_idor_lonor_latde_londe_lat 。显然,只有最后4列需要从WGS84转换为LIIE。

我可以通过这样做来转换坐标:

matrix_sp<-SpatialPoints(coords = od_matrix[,c("de_lon","de_lat","or_lon","or_lat")],proj4string = CRS(WGS84))
matrix_sp_liie<-spTransform(od_matrix_sp, CRSobj = CRS(LIIE))
matrix_liie<-data.frame(matrix_sp_liie)

但是,我因此丢失了原始ID和目标ID ...(而且我没有任何可以让我将matrix_liieorigin/destination ids合并在matrix_sp中的内容})。

我尝试了这个(它基本上是相同的代码,但第一行包含destination_idoririgin_id),但我无法真正得到一些有趣的东西(我得到了{{1} }错误)。

Error in .local(obj, ...) : cannot derive coordinates from non-numeric matrix

关于如何实现这一目标的任何想法?

感谢。

CSV中的示例:

od_matrix_sp<-SpatialPoints(coords = od_matrix[,c("destination_id","oririgin_id","de_lon","de_lat","or_lon","or_lat")],proj4string = CRS(WGS84))
matrix_sp_liie<-spTransform(od_matrix_sp, CRSobj = CRS(LIIE))
matrix_liie<-data.frame(matrix_sp_liie)

1 个答案:

答案 0 :(得分:1)

嗨,sp进行了转化,您可以在不使用SpatialPoints的情况下执行此操作,只需指定matrix中哪些列是coordinates的坐标,这里是例如:

library("sp")
# Some coordinates
latlong <- data.frame(
  ID = 1:8,
  LETTERS = LETTERS[1:8],
  lon = runif(n = 8, min = 2.0798, max = 2.9931),
  lat = runif(n = 8, min = 48.6823, max = 49.0698)
)

# Loading CRS
WGS84<-"+proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +no_defs"
LIIE<-"+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs"

# Set which var are the coord
coordinates(latlong) <- c("lon", "lat")
# Set the proj
proj4string(latlong) <- CRS(WGS84)
# Convert
latlon_conv <- spTransform(x = latlong, CRSobj = CRS(LIIE))
# Back to data.frame
latlon_conv <- as.data.frame(latlon_conv)
latlon_conv # maybe change columns names...
#   ID LETTERS      lon     lat
# 1  1       A 632441.1 2440172
# 2  2       B 633736.7 2434332
# 3  3       C 586298.5 2411320
# 4  4       D 645107.6 2410351
# 5  5       E 642454.6 2443052
# 6  6       F 628371.7 2448833
# 7  7       G 625445.7 2436324
# 8  8       H 624509.7 2443864

编辑:看到@Spacedman评论后,您可以有效地使用SpatialPointsDataFrame代替SpatialPoints

latlong.sp <- SpatialPointsDataFrame(
  coords = latlong[, c("lon", "lat")],
  data = latlong[, c("ID", "LETTERS")],
  proj4string = CRS(WGS84)
)

latlon_conv <- spTransform(x = latlong.sp, CRSobj = CRS(LIIE))
latlon_conv.df <- as.data.frame(latlon_conv)
latlon_conv.df