map("state", ...)
的输出中创建了一个“ SpatialPolygons”对象。 Brien的答案很不错。library(maps)
library(maptools)
map_states = map("state", fill = TRUE, plot = FALSE)
IDs = sapply(strsplit(map_states$names, ":"), "[[", 1)
spydf_states = map2SpatialPolygons(map_states, IDs = IDs, proj4string = CRS("+init=epsg:4326"))
plot(spydf_states)
这个广泛应用的数据集的问题在于,自相交发生在下面给出的点。
rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
Self-intersection at or near point -122.22023214285259 38.060546477866055
很遗憾,此问题阻止了对spydf_states的任何进一步使用,例如致电
rgeos::gIntersection
时。如何在R中解决此问题?#1 楼
使用零宽度缓冲区可以清除R中的许多拓扑问题。spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)
但是,使用未投影的经纬度坐标会导致
rgeos
发出警告。 以下是一个扩展示例,该示例首先重新投影为Albers投影:
library(sp)
library(rgeos)
load("~/Dropbox/spydf_states.RData")
# many geos functions require projections and you're probably going to end
# up plotting this eventually so we convert it to albers before cleaning up
# the polygons since you should use that if you are plotting the US
spydf_states <- spTransform(spydf_states,
CRS("+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96"))
# simplify the polgons a tad (tweak 0.00001 to your liking)
spydf_states <- gSimplify(spydf_states, tol = 0.00001)
# this is a well known R / GEOS hack (usually combined with the above) to
# deal with "bad" polygons
spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)
# any bad polys?
sum(gIsValid(spydf_states, byid=TRUE)==FALSE)
## [1] 0
plot(spydf_states)
评论
关于gBuffer“ hack”为何起作用的任何额外评论/阅读?
–MichaelChirico
16年11月8日在1:10
您是否要使用gSimplify分解data.frame并将SPDF转换为空间多边形对象?
–公司
16-11-14在6:31
如果您使用的是sf,也可以使用sf :: st_buffer(x,dist = 0)
–菲尔
19年1月8日在9:27
在使用PostGIS的情况下也可以使用
– natsuapo
19年8月21日在7:42
评论
如果您放大该点:plot(spydf_states,xlim = c(-122.1,-122.3),ylim = c(38,38.1)),您会发现这里没有“貌似”的地方-存在一个自相交。