使用包SP在R中进行数据投影

时间:2016-05-02 16:38:07

标签: r utm wgs84

我试图在R中投射我的GPS数据有点困难。

我正在浏览R包'T-LoCoH'的插图中的教程,并使用这些说明尝试将我的数据从WGS84投影到UTM37(埃塞俄比亚的区域)。

我的数据集名为“d”,坐标位于“经度”和“纬度”列中。

require(sp)

head(d)
  Latitude Longitude
1  6.36933  39.84300
2  6.37050  39.84417
3  6.41733  39.83800
4  6.41750  39.83800
5  6.41717  39.83750
6  6.41767  39.83733

d2 <- SpatialPoints(d, proj4string=CRS("+proj=longlat, ellps=WGS84"))
Error in CRS("+proj=longlat \nellps=WGS84") : unknown projection id

你能告诉我我做错了吗?

另外,如果我的数据集中有更多列,如何指定我只想在包含纬度和经度的2列中投影数据?

我非常感谢你的帮助。

谢谢, 林迪

2 个答案:

答案 0 :(得分:1)

而不是:

> d2 <- SpatialPoints(d, proj4string=CRS("+proj=longlat, ellps=WGS84"))
Error in CRS("+proj=longlat, ellps=WGS84") : unknown projection id

你需要:

> d2 <- SpatialPoints(d, proj4string=CRS("+proj=longlat +ellps=WGS84"))

但更好的方法是将epsg代码用于GPS坐标:

> d2 <- SpatialPoints(d, proj4string=CRS("+init=epsg:4326"))

这是简写:

Coordinate Reference System (CRS) arguments: +init=epsg:4326
+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 

如果您只想传递两列,您可以这样做:

> d2 <- SpatialPoints(d[,c("Longitude","Latitude")], proj4string=CRS("+init=epsg:4326"))

这让我觉得你应该在另一个顺序中有X和Y坐标。您可以使用任何其他方法来选择数据框列,因此如果您的Lat-long位于第7列和第23列,那么d[,c(23,7)]将会执行此操作。

答案 1 :(得分:0)

您可以使用PBSmapping库为您执行此操作。

require(PBSmapping)

# re-create your data
d = as.data.frame(list(Latitude = c(6.36933,6.37050,6.41733,
                                6.41750,6.41717,6.41767),
                   Longitude = c(39.84300,39.84417,39.83800,
                                 39.83800,39.83750,39.83733)))

# convUL function requires columns to be called "X" and "Y"
dataLL=as.data.frame(list(X=d$Longitude,Y=d$Latitude))

# add a projection attribute (see details in ?convUL)
attr(dataLL,"projection")="LL"

# create a new data frame called dataUTM
dataUTM=convUL(dataLL,km=F)

# output from running previous command
convUL: For the UTM conversion, automatically detected zone 37.
convUL: Converting coordinates within the northern hemisphere.

# extract UTM zone
attr(dataUTM,"zone")