重新投影SpatialPointsDataFrame不会更改范围

时间:2017-10-12 19:11:36

标签: r r-raster sp rgdal

我正在尝试将与bat位置(SpatialPointsDataFrame)相关的数据叠加到Colorado状态(SpatialPolygonsDataFrame)上。两个对象的CRS是不同的:

crs(colorado)
#CRS arguments:
# +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
crs(BatRange_data)
#CRS arguments:
# +proj=utm +zone=13 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0 

当我重新投影蝙蝠数据时,CRS确实发生了变化,但范围不受影响。

之前:

BatRange_data
#class       : SpatialPointsDataFrame 
#features    : 2456 
#extent      : 139996.3, 748812, 4094998, 4535103  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=utm +zone=13 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0 
#variables   : 17

后:

geo_proj = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
crs(BatRange_data) = geo_proj

BatRange_trnsfrmd = spTransform(BatRange_data,geo_proj)
BatRange_trnsfrmd
#class       : SpatialPointsDataFrame 
#features    : 2456 
#extent      : 139996.3, 748812, 4094998, 4535103  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
#variables   : 17

我无法绘制多边形上的点,因为我的多边形对象的范围与我的点对象的范围不同:

colorado
#class       : SpatialPolygonsDataFrame 
#features    : 1 
#extent      : -109.0608, -102.042, 36.99223, 41.00561  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
#variables   : 13

为什么在重新投影和转换时SpatialPointsDataFrame的范围不会改变?

可重复的示例(我自己对此进行了测试,并将其发送给了朋友;它可以与所提供的内容重现):

#Libraries
x = c('raster','sp','rgdal')

# If you don't know if you've installed the packages for some of these 
# libraries, run this:
# install.packages(x)

lapply(x, library, character.only=TRUE)
rm(x)

# Read in and format data -------------------------------------------------
BatRange_data = new("SpatialPoints", coords = structure(c(179935.719907205, 179935.938979813, 179935.938979813, 176598.335967664, 176598.335967664, 4499963.43180688, 4499963.30060606, 4499963.30060606, 4489332.4211975, 4489332.4211975), .Dim = c(5L, 2L), .Dimnames = list(NULL, c("coords.x1", "coords.x2"))), bbox = structure(c(176598.335967664, 4489332.4211975, 179935.938979813, 4499963.43180688), .Dim = c(2L, 2L), .Dimnames = list(c("coords.x1", "coords.x2"), c("min", "max"))) , proj4string = new("CRS"    , projargs = NA_character_))

#Use state bounds from gadm website:
us = getData("GADM", country="USA", level=1)

#Extract states (need to uppercase everything)
co = "Colorado" 

colorado = us[match(toupper(co),toupper(us$NAME_1)),]

#Re-project bat data to 'longlat'
geo_proj = 
  "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
crs(BatRange_data) = geo_proj

BatRange_trnsfrmd =
  spTransform(BatRange_data,geo_proj)

plot(BatRange_trnsfrmd)
plot(colorado,add=TRUE)

1 个答案:

答案 0 :(得分:3)

在您的代码中:

geo_proj = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
crs(BatRange_data) = geo_proj

BatRange_trnsfrmd = spTransform(BatRange_data,geo_proj)
BatRange_trnsfrmd

在尝试重新投影之前,您正在覆盖BatRange_data到lat / long 的原始投影。因此,spTransform无所事事,因为它试图从epsg:4326重新投影到epsg:4326。这就是为什么你的范围没有改变。

因此,你应该删除这一行:

crs(BatRange_data) = geo_proj

所有人都应该工作。

HTH。