Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将一组点坐标从凹面外壳转换为R中的多边形?_R_Maps_Coordinates_Polygon - Fatal编程技术网

如何将一组点坐标从凹面外壳转换为R中的多边形?

如何将一组点坐标从凹面外壳转换为R中的多边形?,r,maps,coordinates,polygon,R,Maps,Coordinates,Polygon,我有一个alphahull::ashape()结果,需要使用spatstat::owin()进行转换,以进行后续的空间分析。是否有一个优雅的解决方案,如何从凹面外壳对点进行排序,并将形状转换为owin对象或任何空间*对象?假设矩阵coords中的有序点定义为: geo.owin=try(owin(poly=list(x=coords[,1],y=coords[,2])),silent=T) if(class(geo.owin)=="try-error") geo.owin=owin(poly=l

我有一个
alphahull::ashape()
结果,需要使用
spatstat::owin()
进行转换,以进行后续的空间分析。是否有一个优雅的解决方案,如何从凹面外壳对点进行排序,并将形状转换为
owin
对象或任何
空间*
对象?假设矩阵
coords
中的有序点定义为:

geo.owin=try(owin(poly=list(x=coords[,1],y=coords[,2])),silent=T)
if(class(geo.owin)=="try-error") geo.owin=owin(poly=list(x=rev(coords[,1]),y=rev(coords[,2])))
这是不可能的。
ashape()$edges
矩阵包含可绘制为多边形的点的坐标,此处提供了矩阵。但是,点的顺序与不同的打印颜色和箭头方向不同

# data
okraj = matrix(c(23.8808, 18.0106, 23.8808, 1.8265, 1.8266, 1.8265, 18.0106, 39.5352, 39.5352, 39.5352, 13.5519, 27.9675, 3.8102, 4.8269, 8.8236, 52.7248, 45.3385, 52.7248, 50.9600, 50.9600, 50.9600, 45.3385, 39.9042, 39.9042, 39.9042, 49.1204, 41.8421, 47.1450, 44.9423, 46.0246, 13.5519, 27.9675, 32.1116, 1.8266, 4.5644, 3.8102, 17.5557, 39.5840, 32.1116, 29.2158, 4.5644, 29.2158, 4.8269, 8.8236, 17.5557, 49.1204, 41.8421, 41.3710, 50.9600, 49.8638, 47.1450, 45.5063, 39.8987, 41.3710, 40.0750, 49.8638), ncol=4, dimnames=list(NULL,c("x1","y1","x2","y2")))

# draw polygon from arrows
farby=colorRampPalette(c("lightblue","black"))(nrow(okraj))
plot(0,type="n",xlim=range(okraj[,c(1,3)]),ylim=range(okraj[,c(2,4)]),xlab="",ylab="")
for(i in 1:nrow(okraj)){
    arrows(okraj[i,"x1"],okraj[i,"y1"],okraj[i,"x2"],okraj[i,"y2"],col=farby[i],length=.1,lwd=2)
}

通过其他问题的搜索返回的解决方案、解决方案和语言。我当前的代码搜索整个矩阵中的连接点,并对我在解释alpha形状边坐标时遇到的每个问题使用
if()
条件(请原谅天真的编码)

它适用于某些数据集。这里,示例数据集包含一个端点
okraj[8,3:4]
,该端点不连接到矩阵中的任何其他内容,代码崩溃。我的解决方案是跳过这一行,然后用上一点再试一次

if(is.na(riadok)){
    bod2=NA
    temp=temp[-riadok,]
    bod=coords[nrow(coords),]
    next
}
但是,解决方案需要删除一行数据,这是错误的。非常感谢您提供将alpha形状转换为贴图对象的系统解决方案

编辑: 有关的问题使用
rgeos
例程从@Spacedman收到了答案。它如何帮助解决我的问题,从这里的例子无序点

if(is.na(riadok)){
    bod2=NA
    temp=temp[-riadok,]
    bod=coords[nrow(coords),]
    next
}