在R中计算的松鼠家域MCP过小,是否为坐标系问题?
松鼠家域计算(MCP)尺寸异常偏小的问题排查
我在R语言中用MCP(最小凸多边形)和核密度函数计算松鼠家域,数据采用NAD 83基准的UTM坐标系,但计算得到的家域尺寸异常偏小,请问问题出在哪里?
数据样本截图:
我的代码如下:
library("readxl") library(adehabitatHR) # Load library library(sp) # 读取数据 telemetry<-read_excel("telemetrysp.xlsx",sheet = "Sheet1",na=c("NA"))# 指定NA识别规则 # 移除含缺失值的行(SpatialPointsDataFrame不支持缺失值) telemetry <- telemetry[!is.na(telemetry$LongitudeX) & !is.na(telemetry$LatitudeY),] # 保留计算MCP所需的三列:个体ID、X/Y坐标 telemetry.mcp <- telemetry[, c("Squirrel ID", "LongitudeX", "LatitudeY")] # 创建SpatialPointsDataFrame对象 coordinates(telemetry.mcp) <- c("LongitudeX", "LatitudeY") # 设置坐标参考系统(CRS) proj4string(telemetry.mcp) <- CRS( "+init=epsg:4269") # 计算95%置信度的MCP家域 redsq.mcp <- mcp(telemetry.mcp, percent = 95) # 查看计算结果 redsq.mcp
问题根源
核心错误是坐标系设置与数据类型不匹配:
- 你的数据是UTM投影坐标系(单位为米),但代码中给
proj4string指定了epsg:4269——这是NAD83的地理坐标系(经纬度,单位为度)。 - 当程序用地理坐标系计算家域面积时,会错误地把经纬度的差值当成“米”来计算,导致结果被极度缩小(1度经度≈111公里,直接用度的数值算面积会差百万倍量级)。
解决方案
- 确认数据对应的UTM分带:
UTM分带由经度决定,西经范围的带号计算公式为(180 - 经度)/6 + 1,比如西经90°对应16带;也可以从数据的X坐标判断(通常坐标前两位为带号,如16XXXXXX)。 - 修正CRS设置:
把proj4string的EPSG代码替换为对应UTM带的投影坐标系代码,例如NAD83 UTM 16N对应的代码是26916:proj4string(telemetry.mcp) <- CRS("+init=epsg:26916") - 验证坐标单位:
UTM坐标的X值通常在100000-899999之间,北半球Y值在0-9999999之间,确认你的数据符合这个范围,确保是米为单位的投影坐标。
修改后重新计算MCP,得到的面积单位会是平方米,数值就会符合松鼠家域的实际大小。
内容的提问来源于stack exchange,提问作者Marina Morandini
相关产品推荐
相关产品推荐

