绘制由多个多边形定义的空间区域 [英] Plot spatial area defined by multiple polygons
问题描述
我有一个带有11589个多边形"类空间对象的SpatialPolygonsDataFrame.这些对象中的10699个正好由1个多边形组成.但是,这些空间对象的其余部分由多个多边形(2到22)组成.
I have a SpatialPolygonsDataFrame with 11589 spatial objects of class "polygons". 10699 of those objects consists of exactly 1 polygon. However, the rest of those spatial objects consist of multiple polygons (2 to 22).
如果一个对象包含多个多边形,则可能出现三种情况:
If an object of consists of multiple polygons, three scenarios are possible:
1)附加多边形可以在第一个多边形所描述的空间区域中描述一个孔". 2)其他多边形也可以描述其他地理区域,即该区域的形状非常复杂,可以通过将多个部分放在一起来描述. 3)通常是1)和2)的混合.
1) The additional polygons could describe a "hole" in the spatial area described by the first polygon . 2) The additional polygons could also describe additional geographic areas, i.e. the shape of the region is quite complex and described by putting together multiple parts. 3) Often it is a mix of both, 1) and 2).
我的问题是:如何绘制基于多个多边形的空间对象?
我已经能够提取和绘制第一个多边形的信息,但是我还没有弄清楚如何一次绘制这样一个复杂空间对象的所有多边形.
I have been able to extract and plot the information of the first polygon, but I have not figured out how plot all polygons of such a complex spatial object at once.
在下面找到我的代码.问题是最后15行.
Below you find my code. The problem is the 15th last line.
# Load packages
# ---------------------------------------------------------------------------
library(maptools)
library(rgdal)
library(ggmap)
library(rgeos)
# Get data
# ---------------------------------------------------------------------------
# Download shape information from the internet
URL <- "http://www.geodatenzentrum.de/auftrag1/archiv/vektor/vg250_ebenen/2012/vg250_2012-01-01.utm32s.shape.ebenen.zip"
td <- tempdir()
setwd(td)
temp <- tempfile(fileext = ".zip")
download.file(URL, temp)
unzip(temp)
# Get shape file
shp <- file.path(tempdir(),"vg250_0101.utm32s.shape.ebenen/vg250_ebenen/vg250_gem.shp")
# Read in shape file
x <- readShapeSpatial(shp, proj4string = CRS("+init=epsg:25832"))
# Transform the geocoding from UTM to Longitude/Latitude
x <- spTransform(x, CRS("+proj=longlat +datum=WGS84"))
# Extract relevant information
att <- attributes(x)
Poly <- att$polygons
# Pick an geographic area which consists of multiple polygons
# ---------------------------------------------------------------------------
# Output a frequency table of areas with N polygons
order.of.polygons.in.shp <- sapply(x@polygons, function(x) x@plotOrder)
length.vector <- unlist(lapply(order.of.polygons.in.shp, length))
table(length.vector)
# Get geographic area with the most polygons
polygon.with.max.polygons <- which(length.vector==max(length.vector))
# Check polygon
# x@polygons[polygon.with.max.polygons]
# Get shape for the geographic area with the most polygons
### HERE IS THE PROBLEM ###
### ONLY information for the first polygon is extracted ###
Poly.coords <- data.frame(slot(Poly[[polygon.with.max.polygons ]]@Polygons[[1]], "coords"))
# Plot
# ---------------------------------------------------------------------------
## Calculate centroid for the first polygon of the specified area
coordinates(Poly.coords) <- ~X1+X2
proj4string(Poly.coords) <- CRS("+proj=longlat +datum=WGS84")
center <- gCentroid(Poly.coords)
# Download a map which is centered around this centroid
al1 = get_map(location = c(lon=center@coords[1], lat=center@coords[2]), zoom = 10, maptype = 'roadmap')
# Plot map
ggmap(al1) +
geom_path(data=as.data.frame(Poly.coords), aes(x=X1, y=X2))
推荐答案
我可能会误解您的问题,但有可能使您的工作变得更加困难.
I may be misinterpreting your question, but it's possible that you are making this much harder than necessary.
(注意:我在处理R中的.zip文件时遇到了麻烦,因此我只是在操作系统中下载并解压缩了该文件).
(Note: I had trouble dealing with the .zip file in R, so I just downloaded and unzipped it in the OS).
library(rgdal)
library(ggplot2)
setwd("< directory with shapefiles >")
map <- readOGR(dsn=".", layer="vg250_gem", p4s="+init=epsg:25832")
map <- spTransform(map, CRS("+proj=longlat +datum=WGS84"))
nPolys <- sapply(map@polygons, function(x)length(x@Polygons))
region <- map[which(nPolys==max(nPolys)),]
plot(region, col="lightgreen")
# using ggplot...
region.df <- fortify(region)
ggplot(region.df, aes(x=long,y=lat,group=group))+
geom_polygon(fill="lightgreen")+
geom_path(colour="grey50")+
coord_fixed()
请注意,ggplot无法正确处理孔:geom_path(...)
可以正常工作,但是geom_polygon(...)
可以填充孔.我之前遇到过此问题(请参阅此问题),并且由于缺乏响应,可能是ggplot中的错误.由于您未使用geom_polygon(...)
,因此这不会影响您...
Note that ggplot does not deal with the holes properly: geom_path(...)
works fine, but geom_polygon(...)
fills the holes. I've had this problem before (see this question), and based on the lack of response it may be a bug in ggplot. Since you are not using geom_polygon(...)
, this does not affect you...
在上面的代码中,您将替换以下行:
In your code above, you would replace the line:
ggmap(al1) + geom_path(data=as.data.frame(Poly.coords), aes(x=X1, y=X2))
具有:
ggmap(al1) + geom_path(data=region.df, aes(x=long,y=lat,group=group))
这篇关于绘制由多个多边形定义的空间区域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!