使用bivrp::is_point_inside判断点是否在正方形内返回FALSE问题排查
关于
bivrp::is_point_inside判断点在多边形内始终返回FALSE的问题及替代方案 问题详情
我尝试使用bivrp::is_point_inside函数判断点是否在正方形内,但无论如何操作,即使在最明显的场景下(如点(5,5)位于顶点为(15,15)、(15,0)、(0,0)、(0,15)的正方形内),始终返回FALSE结果。
我的代码:
polyg=data.frame(c(15, 15, 0, 0), c(15, 0, 0, 15)) point=c(5,5) bivrp::is_point_inside(point, polyg)
执行结果:
> bivrp::is_point_inside(point, polyg) [1] FALSE
请问我哪里操作出错了?注:我优先希望继续使用bivrp::is_point_inside,旧代码依赖该函数,若无法正常工作则需修改旧代码。
补充
该函数显然无法正常工作,能否推荐一个功能相同(判断点是否在多边形内)且可用的替代函数?
问题排查与修复尝试
很多多边形判断函数对输入格式有特定要求,你可以尝试以下两种修改:
- 给数据框的列命名为
x和y(多数空间函数默认识别这两个列名):
polyg <- data.frame(x = c(15, 15, 0, 0), y = c(15, 0, 0, 15)) point <- c(5,5) bivrp::is_point_inside(point, polyg)
- 让多边形顶点闭合(最后一个顶点重复第一个顶点):
polyg <- data.frame(x = c(15, 15, 0, 0, 15), y = c(15, 0, 0, 15, 15)) point <- c(5,5) bivrp::is_point_inside(point, polyg)
如果以上修改仍无法解决,说明bivrp::is_point_inside可能存在bug或维护问题,推荐以下替代函数:
替代函数推荐
1. sp::point.in.polygon(sp包)
经典空间判断函数,返回值明确:1表示点在多边形内部,0表示外部,2表示在边界上。
library(sp) # 定义闭合的多边形顶点 polyg_xy <- cbind(c(15,15,0,0,15), c(15,0,0,15,15)) point <- c(5,5) # 执行判断 result <- point.in.polygon(point[1], point[2], polyg_xy[,1], polyg_xy[,2])
2. sf::st_within(sf包)
现代空间数据处理包sf中的函数,支持复杂空间操作,返回逻辑值。
library(sf) # 创建多边形sf对象 polyg_sf <- st_polygon(list(cbind(c(15,15,0,0,15), c(15,0,0,15,15)))) # 创建点sf对象 point_sf <- st_point(c(5,5)) %>% st_sfc() # 判断点是否在多边形内 result <- st_within(point_sf, polyg_sf, sparse = FALSE)[1,1]
3. pracma::inpolygon(pracma包)
专注数值计算的包,用法简洁,返回逻辑值。
library(pracma) polyg_x <- c(15,15,0,0,15) polyg_y <- c(15,0,0,15,15) point_x <- 5 point_y <-5 # 执行判断 result <- inpolygon(point_x, point_y, polyg_x, polyg_y)
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

