R - 使用plot() - 基于槽值着色shapefile多边形

时间:2013-02-07 07:26:19

标签: r geospatial shapefile

我有一个显示澳大利亚偏远地区的形状文件,来自澳大利亚统计局:

http://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/1270.0.55.005July%202011?OpenDocument

在同一个URL上是PDF“ASGS Remoteness Structure Edition 2011 PDF Maps” - 我试图从这份PDF文档中重现第一张地图。

我已阅读shapefile并将颜色信息添加到data广告位:

ra <- readShapeSpatial("RA_2011_AUST", delete_null_obj = TRUE)
ra@data$COLOUR <- "#FFFFFF"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 0] <- "#006837"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 1] <- "#31A354"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 2] <- "#78C679"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 3] <- "#C2E699"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 4] <- "#FFFFCC"

我唯一要做的就是绘制地图!这是我被困的地方......

ra@polygons是一个包含35个多边形的列表,每个多边形都有一个插槽ID,它是数据框ra@data的索引。所以我要做的就是告诉plot()找到ra@data$COLOUR[ID]中的颜色。嗯,不太好。 35个多边形(“多边形”类)中的每一个都有自己的多边形列表(“Polygon”类);总共有6902个多边形!!!

我对plot()的理解是,我必须以与绘制多边形相同的顺序传递颜色矢量。因此,我相信我必须创建一个长度为6902的向量,每个元素保存相关多边形的颜色值。到目前为止我该怎么做?

如果按顺序绘制多边形,那就很容易了,但事实并非如此。 35个多边形中的每一个都有一个槽plotOrder,它是一个整数向量,因此颜色向量可能必须按照这些向量中的每个值排序。

此时这一切似乎有点过于复杂。我完全偏离了这里吗?

感谢您的建议!

1 个答案:

答案 0 :(得分:11)

你已经完成了所有的工作!

plot(ra, col=ra@data$COLOUR)

甚至,正如@Spacedman建议的那样:

plot(ra, col=ra$COLOUR)

那就是它!

enter image description here

如果你想摆脱多边形边界:

plot(ra, col=ra$COLOUR, border=NA)

enter image description here

修改:尝试解释此行为:

根据?SpatialPointsDataFrame

  

具有默认ID匹配的SpatialPolygonsDataFrame根据多边形ID插槽检查数据框行名称。然后它们必须彼此一致,并且是唯一的(没有多边形对象可以共享ID);如果需要匹配多边形ID,数据框行将被重新排序。

意味着多边形根据其ID排序,因此按照插槽@data中数据帧的行的顺序排列。

现在,如果您查看函数plot.SpatialPolygons(使用getAnywhere(plot.SpatialPolygons)),那么在某些时候会有这些行:

...
    polys <- slot(x, "polygons")
    pO <- slot(x, "plotOrder")
    if (!is.null(density)) {
        if (missing(col)) 
            col <- par("fg")
        if (length(col) != n) 
            col <- rep(col, n, n)
        if (length(density) != n) 
            density <- rep(density, n, n)
        if (length(angle) != n) 
            angle <- rep(angle, n, n)
        for (j in pO) .polygonRingHoles(polys[[j]], border = border[j], 
            xpd = xpd, density = density[j], angle = angle[j], 
            col = col[j], pbg = pbg, lty = lty, ...)
    }
...

输入到col的向量具有与polygons时隙相同的顺序,因此具有ID。 plotOrder用于以相同的方式为所有这些索引编制索引。