如果通过在R中使用shapefile在特定坐标处出现植物物种,如何获取信息

时间:2017-07-05 09:16:53

标签: r coordinates geospatial shapefile

如果植物物种出现在特定点(坐标),我想使用包含信息的R创建表格。因此,我想使用shapefile,包含几种特定植物物种的分布。我的输出必须是一个表,每个点/坐标表示每个植物物种的存在为1,缺失为0。

首先,我读了我的第一个shapefile和CVS表,其中包含我需要的坐标:

plant <- shapefile ('plant.shp')
birds<-read.csv2("bird_Coordinates.csv") 

接下来,我提取坐标,将它们保存在数据框中并将点投影到分布shapefile上:

lats <- birds$lat
lons <- birds$lon
pts <- data.frame(x=lons,y=lats)
coordinates(pts) <- ~x+y
proj4string(pts) <- proj4string(plant)

当我现在绘制shapefile和坐标时,我会看到植物分布的形状和两个红点,这表明我的大约60个点中有两个在这个分布中:

plot(plant)
points(pts, pch=20, col='red')

接下来,我尝试使用over将点与分布相关联。在这里,我使用了两种不同的方式:

1

over(pts, plant)$admin
cbind.data.frame(pts, plant=over(pts, plant)$admin)

导致警告消息:data.frame(...,check.names = FALSE)中的错误:参数意味着行数不同:64,0

2

plantsp <- !is.na(over(pts, as(plant, "SpatialPolygons")))
pts$plant <- over(pts, plant)$Unit_Name

产生警告消息:validObject(.Object)中的错误:无效的类“SpatialPointsDataFrame”:data.frame和SpatialPoints中的行数不匹配

所以,两种可能性都失败了,我不知道我做错了什么。我知道,对于这个分布范围,只有两个点在范围内,是麻烦的根源吗?我该如何解决这个问题呢?我会非常感激,如果有人能告诉我,如何获得这个cvs表,包含每个点的分布范围的存在/缺席信息!

1 个答案:

答案 0 :(得分:1)

我认为使用rgdalsf更容易解决此问题(我建议学习sf,因为它更新,但是现在我对{{1}更熟悉这就是我在这里使用它的原因。)

加载rgdal(也会加载我们需要的rgdal):

sp

如果您只想提取数据,可以将其分配给另一个对象:

library("rgdal")

# Open the shapefile and copy the projection,
# which we'll need for the bird data

plant <- readOGR(".", "N_columbiana")
wgs84 <- proj4string(plant)

# open the bird data and make a copy for when we change to
# spatialPointsDataFrame

birds <- read.csv2("bird_Coordinates.csv") 
birds_data <- birds

# Correct the order of long/lat so the coordinates are correct
birds <- birds[, c("lon", "lat")]
birds <- sp::SpatialPointsDataFrame(birds, birds_data,
                                    proj4string = CRS(wgs84))

# plot to make sure it's worked
plot(plant)
plot(birds, add = TRUE)

# the @data slot is now a data frame for the shapefile
# make all in_plant 0 by default before we subset
birds@data$in_plant <- 0

# Get the specimenID of those birds within the plant boundary
# the birds[plant, ] does the subsetting
# the @data$SpecimenID returns just the specimenID
in_plant <- birds[plant, ]@data$SpecimenID
birds@data$in_plant[in_plant] <- 1

# check it's all worked
plot(plant)
plot(birds[birds@data$in_plant == 1, ], add = TRUE)