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

How to get information, if plant species occur at specific coordinates by using shapefiles in R

如果植物物种出现在特定点(坐标),我想使用包含信息的 R 创建一个 tables。因此,我想使用 shapefile,其中包含几种特定植物种类的分布。我的输出必须是 table,对于每个 point/coordinate 表示每个植物物种的存在为 1,不存在为 0。

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

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) 错误:无效 class “SpatialPointsDataFrame”:data.frame 中的行数与 SpatialPoints 不匹配

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

我认为这个问题用 rgdalsf 会更容易解决(我建议学习 sf,因为它较新,但现在我更熟悉 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)

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

new_data <- birds@data
new_data
#     SpecimenID      lat         lon in_plant
#  1           1 46.06667    7.600000        0
#  2           2 46.60134    9.965973        0
#  3           3 46.02360    7.748607        0
#  4           4 46.60134    9.965973        0
#  5           5 46.91833   13.873611        0
#  ...
#  48         48 40.01861 -105.278056        1
#  49         49 40.02977 -105.581228        1
#  50         50 47.05917   13.615556        0