我有一个包含WGS84坐标的大型数据集,我希望将其转换为长/纬坐标。 WGS84坐标当前被分成自己的列(即" North"" East"),另外" Zone"与相应的区域。总共有几个区域。
有关将这些列转换为Lat / Long并将这些列保存到新列的方法的建议吗?
数据集示例:
Longitude Latitude zone
233243 6571770 33
262706 6653520 33
195348 6573696 33
256880 6645020 33
260610 6654042 32
13799 6505840 33
答案 0 :(得分:1)
您可能需要阅读sp
包,坐标和spTransform
函数。除此之外。
d
作为数据框:
> d
Longitude Latitude zone
1 233243 6571770 33
2 262706 6653520 33
3 195348 6573696 33
4 256880 6645020 33
5 260610 6654042 32
6 13799 6505840 33
计划是:按zone
id拆分成一个列表,然后为每个列表元素创建一个空间点数据框,使用坐标参考系统" + init = epsg:326" +"区" (例如" + init = epsg:32633"对于区域33),然后转换为epsg:4326 lat-long,然后将批次rbind到一个空间点数据框:
需要这些:
> library(sp) ; library(raster)
按区域ID创建列表:
> byzone = split(d,d$zone)
在所有部件上,设置坐标,CRS和变换:
> zdll = lapply(byzone,
function(zd){
coordinates(zd)=~Longitude+Latitude
proj4string(zd)=paste0("+init=epsg:326",zd$zone[1])
spTransform(zd, CRS("+init=epsg:4326"))
})
现在加入他们:
> dll = do.call(rbind.SpatialPointsDataFrame, zdll)
如果您现在绘制dll
,那么您将在lat-long上看到这些点。如果您想要坐标并与原始坐标进行比较,请执行以下操作:
> cbind(d, coordinates(dll))
Longitude Latitude zone Longitude Latitude
5 233243 6571770 33 4.712098 59.95395
1 262706 6653520 33 10.327202 59.20086
2 195348 6573696 33 10.750120 59.95049
3 256880 6645020 33 9.663825 59.19259
4 260610 6654042 32 10.656096 59.87099
6 13799 6505840 33 6.663177 58.42136
他们是否在预期的位置?