如何确保spatstat :: owin(poly = <polygon>)中的多边形没有“负区域”</polygon>

时间:2013-09-19 03:35:15

标签: r spatstat

我是R spatstat包的新用户,并且在使用owin()创建多边形观察窗口时遇到问题。代码如下:

library("maps")
library ("sp")` 
library("spatstat")
mass.map <- map("state", "massachusetts:main", fill=T) # This returns a data frame includding x and y components that form a polygon of massachusetts mainland`

mass.win <- owin(poly=data.frame(x=mass.map$x, y=mass.map$y)
  

if(w.area&lt; 0)停止时出错(粘贴(“多边形区域为负 - ”,“可能在&gt;错误方向上遍历?”)):    缺少需要TRUE / FALSE的值

我尝试了倒转多边形的顺序并得到同样的错误。

 mass.win <- owin(poly=data.frame(x=rev(mass.map$x), y=rev(mass.map$y)))

多边形包含重复的顶点

  
    

多边形是自相交的     owin中的错误(poly = data.frame(x = rev(mass.map $ x),y = rev(mass.map $ y))):      多边形数据包含重复的顶点和自相交

  

然后我想通过map()返回的多边形可能不是要输入到owin()。所以我尝试加载一个马萨诸塞州的形状文件(我现在完全在猜测)。:

x <- readShapePoly("../Geog/OUTLINE25K_POLY") ## The shape file for MASS, loaded from MassGIS website
mass.poly <- x <- readShapePoly("../Geog/OUTLINE25K_POLY", force_ring=T, delete_null_obj=T) ## I got following error whether or not I used force_ring
  

mass.owin&lt; - as(mass.poly,“owin”)   检查1006个多边形... 1,多边形1包含重复的顶点   [检查91844边缘的多边形...]   2,3,... [etd 1:21:52] .... 10 [etd 36:12] ..... [etd 23:10] .... 20 [etd 16:59] ... ...... [等13:22] ...... 30 [etd 11:01] ..... [etd 9:21] ...... 40 [etd 8:06] ..... [etd 7: 09] .... 50    [等6:23] ..... [等5:46] ...... 60 [等5:15] ...... [用2449边缘检查多边形...]   .. [等4:49] ...... 70 [等4:27] ..... [等4:07] ...... 80 [等3:50] ..... [等等3: 36] ...... 90 [等3:22] ..... [等3:11] ...... 100    [   等

我收到有关交叉顶点等的消息,但无法构建多边形。

关于问题的一些背景:我试图在spatstat中使用函数进行空间相对风险计算,即案例与控件的空间比率。为此,我需要在该窗口内的观察窗口和点图。我可以作弊并使观察窗在马萨诸塞州周围成为一个矩形,但这可能会扭曲海岸附近的价值观。在任何情况下,我都想学习如何正确使用此软件包进行的任何工作。感谢您的任何帮助,您可以提供。

3 个答案:

答案 0 :(得分:2)

稍晚的回答,但spatstat包需要owin指定的对象坐标逆时针。引用版本1.36-0的文档:

  

单个多边形:如果poly是具有两列的矩阵或数据框,或者   然后,具有相等长度的两个分量矢量x和y的结构   这些值被解释为笛卡尔坐标   围绕窗口的多边形顶点。顶点必须是   逆时针上市。不应重复任何顶点(即不重复   第一个顶点)。

您可以使用rev函数解决此问题,该函数会反转xy的向量:

library("maps")
library ("sp")
library("spatstat")
mass.map <- map("state", "massachusetts:main", fill=T)

enter image description here

mass.win <- owin(poly=data.frame(x=rev(mass.map$x), y=rev(mass.map$y)))
plot(mass.win)

enter image description here

答案 1 :(得分:0)

我对你遇到的问题非常熟悉。 如果我理解正确,你希望得到一个类型的多边形对象。以下代码将帮助您获得所需内容。

#Loading the required packages
library (sp)
library(maps)

# Reading the dataset
mass.map <- map("state", "massachusetts:main", fill=T)

IDs <- sapply(strsplit(mass.map$names, ":"), function(x) x[1])
# converting can be done by loading the powerful package "maptools"
library(maptools)
# Converting into SpatialPolygons-object
mass.poly <- map2SpatialPolygons(mass.map, IDs = IDs)

# Converting by coercing into owin-object
mass.owin <- as.owin.SpatialPolygons(mass.poly)

答案 2 :(得分:0)

最初的问题是在 7 年前(2014 年)发布的。从那时起,spatstat 软件包发生了巨大变化。

关于重复顶点和自相交多边形的错误消息不再出现,因为代码现在会自动更正多边形数据中的这些缺陷。

错误消息 Area of polygon is negative - maybe traversed in wrong direction? 仍然出现。这是因为 owin 要求多边形顶点以逆时针顺序围绕外边界(以及围绕孔边界的顺时针顺序)列出。如果您的窗口是单个多边形而不是多边形的集合,则解决方法是简单地使用 rev 反转坐标向量的顺序:

library(maps)
library(sp)
library(spatstat)
mass.map <- map("state", "massachusetts:main", fill=TRUE)
mass.win <- owin(poly=lapply(mass.map, rev))

我们不能让这自动发生,因为它并不总是用户想要的。

有关详细信息,请参阅 the spatstat book 的第 3 章,您可以从 here 免费下载。