如果植物物种出现在特定点(坐标),我想使用包含信息的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表,包含每个点的分布范围的存在/缺席信息!
答案 0 :(得分:1)
我认为使用rgdal
或sf
更容易解决此问题(我建议学习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)