如果植物物种出现在特定坐标处,如何通过使用 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 信息!
我认为这个问题用 rgdal
或 sf
会更容易解决(我建议学习 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
如果植物物种出现在特定点(坐标),我想使用包含信息的 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 信息!
我认为这个问题用 rgdal
或 sf
会更容易解决(我建议学习 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