使用R的adehabitatHR包计算MCP家域结果数值过小的求助
问题原因
你得到极小面积的核心原因是坐标系统设置错误:
- 你当前的
x_、y_列大概率是WGS84地理坐标系的经纬度(单位为十进制度),但你直接给它指定了UTM投影的坐标系(单位为米)。用十进制度的坐标数值直接计算面积,得到的是平方度的结果,数值自然远低于平方米单位下的合理值。 - 另外你代码里存在列名匹配错误:构造
tab2时选入的列是id,但后续拼接Mix字段时调用的是AnimalID,如果原始表的个体编号列名是AnimalID,会导致分组字段Mix生成错误,也会影响结果。
修复步骤
1. 先确认原始坐标类型
先打印几个坐标值验证:
head(tab8$x_) head(tab8$y_)
如果x_数值范围在-180180之间、`y_`在-9090之间,就可以确定是经纬度坐标。
2. 修正坐标系转换逻辑
不要直接给经纬度指定UTM投影,先声明原始地理坐标系,再投影到UTM 33N,转换后坐标单位才会是米:
# 创建SpatialPointsDataFrame后先指定原始的WGS84地理坐标系 coordinates(tab8) <- c("x_", "y_") proj4string(tab8) <- CRS("+proj=longlat +datum=WGS84 +no_defs") # 投影到UTM 33N,得到米单位的坐标 tab8_utm <- spTransform(tab8, CRS("+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs"))
3. 修正列名错误(如果存在)
如果原始csv的个体编号列名为AnimalID,构造tab2时需要把对应列选入:
# 把原来的id换成AnimalID tab2 <- tab1 [, c("AnimalID", "x_", "y_", "day", "month", "year")]
4. 重新计算MCP
用投影后的空间数据计算家域:
animals.mcp <- mcp(tab8_utm[, "Mix"], percent = 100, unin = "m", unout = "m2") as.data.frame(animals.mcp)
验证
转换后查看tab8_utm的坐标值,UTM投影下东向坐标为6位数字、北向坐标为7位数字,此时计算得到的面积单位就是正确的平方米。
内容的提问来源于stack exchange,提问作者Justine Güldenpfennig
相关产品推荐
相关产品推荐

