Check if point is in spatial object which consists of multiple polygons/holes

后端 未结 2 766
太阳男子
太阳男子 2020-11-27 18:45

I have a SpatialPolygonsDataFrame with 11589 objects of class \"polygons\". 10699 of those objects consists of exactly 1 polygon, however the rest of those objects consists

2条回答
  •  感情败类
    2020-11-27 19:06

    You can do this simply with gContains(...) in the rgeos package.

    gContains(sp1,sp2)
    

    returns a logical depending on whether sp2 is contained within sp1. The only nuance is that sp2 has to be a SpatialPoints object, and it has to have the same projection as sp1. To do that, you would do something like this:

    point <- data.frame(lon=10.2, lat=51.7)
    sp2   <- SpatialPoints(point,proj4string=CRS(proj4string(sp1)))
    gContains(sp1,sp2)
    

    Here is a working example based on the answer to your previous question.

    library(rgdal)   # for readOGR(...)
    library(rgeos)   # for gContains(...)
    library(ggplot2)
    
    setwd("< directory with all your files >")
    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)),]
    
    region.df <- fortify(region)
    points <- data.frame(long=c(10.5,10.51,10.15,10.4), 
                         lat =c(51.85,51.72,51.81,51.7),
                         id  =c("A","B","C","D"), stringsAsFactors=F)
    
    ggplot(region.df, aes(x=long,y=lat,group=group))+
      geom_polygon(fill="lightgreen")+
      geom_path(colour="grey50")+
      geom_point(data=points,aes(x=long,y=lat,group=NULL, color=id), size=4)+
      coord_fixed()
    

    Here, point A is in the main polygon, point B is in a lake (hole), point C is on an island, and point D is completely outside the region. So this code checks all of the points using gContains(...)

    sapply(1:4,function(i)
      list(id=points[i,]$id,
           gContains(region,SpatialPoints(points[i,1:2],proj4string=CRS(proj4string(region))))))
    #    [,1] [,2]  [,3] [,4] 
    # id "A"  "B"   "C"  "D"  
    #    TRUE FALSE TRUE FALSE
    

提交回复
热议问题