我试图在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列中投影数据?
我非常感谢你的帮助。
谢谢, 林迪
答案 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")