[R-sig-Geo] How to delete some polygons from 'SpatialPolygonsDataFrame'

Jianyun Wu jianyun.fred.wu at gmail.com
Mon Dec 1 03:00:08 CET 2014


Hi Roger,

You are right, it is polygon 1:12 making the remote islands.
Thanks for a very detailed example.
It worked after I tried your method on my shapefile.

I actually used ggplot() after fortify() the data in the first place. The
remote islands were easily deleted from the dataframe. However, as you
illustrated, if I want to plot the neighbour structure, it is such a mess,
and interaction with ggplot is yet unknown to me.

Thanks and Regards

Fred ​

On Fri, Nov 28, 2014 at 9:38 PM, Roger Bivand <Roger.Bivand at nhh.no> wrote:

> On Fri, 28 Nov 2014, Frede Aakmann Tøgersen wrote:
>
>  Hi
>>
>> If nsw_lga[153, ] is the island that you do not want to plot then you can
>> do
>>
>
> I think that the problem is that only Polygon objects 1:12 in Polygons
> object 153 are the islands, while 13:14 are larger and do not have label
> point longitude > 159. One possibility then is to take out the Polygons
> object (using Scotland in rgdal as an example and recalling Barry
> Rowlingson's insight that someone added slivers of islands to their desired
> proximate neighbours - so part of 48 Shetland is on Orkney):
>
> library(rgdal)
> dsn <- system.file("vectors", package = "rgdal")[1]
> scot_BNG <- readOGR(dsn=dsn, layer="scot_BNG")
> plot(scot_BNG)
> plot(scot_BNG[48,], col="red", add=TRUE)
> library(spdep)
> nb <- poly2nb(scot_BNG)
> plot(nb, coordinates(scot_BNG), add=TRUE)
>
> If we drop Shetland and Fair Isle (using a latitude cutoff):
>
> scot_BNG1 <- scot_BNG
> pols48 <- slot(scot_BNG1, "polygons")[[48]]
> pol48 <- slot(pols48, "Polygons")
> length(pol48)
> sapply(pol48, function(x) {slot(x, "labpt")[2]})
>
> res <- pol48[sapply(pol48, function(x) {slot(x, "labpt")[2]}) < 1050000]
>
> slot(pols48, "Polygons") <- res
> slot(scot_BNG1, "polygons")[[48]] <- pols48
>
> plot(scot_BNG1, lwd=3, add=TRUE)
> bbox(scot_BNG)
> bbox(scot_BNG1)
>
> we appear to get what we want (but the plot order and bounding box of the
> SpatialPolygons object are not updated to match the exclusion).
> Alternatively, and reconstructing the object, use rgeos:
>
> library(rgeos)
> bb <- bbox(scot_BNG)
> plot(scot_BNG)
> plot(scot_BNG[48,], col="red", add=TRUE)
>
> crds <- cbind(x=c(bb[1, 1]-1, bb[1, 1]-1, bb[1, 2]+1, bb[1, 2]+1,
>  bb[1, 1]-1),  y=c(bb[2, 1]-1, 1050000, 1050000, bb[2, 1]-1, bb[2, 1]-1))
> c1 <- SpatialPolygons(list(Polygons(list(Polygon(crds)), "1")),
>  proj4string=CRS(proj4string(scot_BNG)))
> plot(c1, add=TRUE, lty=2)
>
> scot_BNG2a <- gIntersection(scot_BNG, c1, byid=c(TRUE, FALSE))
> scot_BNG2b <- SpatialPolygonsDataFrame(scot_BNG2a, data=slot(scot_BNG,
>  "data"))
>
> plot(scot_BNG2b, lwd=3, add=TRUE)
> bbox(scot_BNG)
> bbox(scot_BNG2b)
>
> Hope this clarifies,
>
> Roger
>
>
>
>> plot(nsw_lga[ -153,  ])
>>
>> or you can set an xlim in plot()
>>
>> plot(nsw_lga, xlim = c(140, 153))
>>
>> you may perhaps need play with the settings of xlim to find the right
>> ones.
>>
>> If you want to have an object without the island then do
>>
>> nsw_lga_wo_island <- nsw_lga[ -153,  ]
>>
>> Something like
>>
>> nsw_lga[ -153,  ] <- NULL doesn't seem to work. Don't know if something
>> similar will work.
>>
>>
>> Yours sincerely / Med venlig hilsen
>>
>>
>> Frede Aakmann Tøgersen
>> Specialist, M.Sc., Ph.D.
>> Plant Performance & Modeling
>>
>> Technology & Service Solutions
>> T +45 9730 5135
>> M +45 2547 6050
>> frtog at vestas.com
>> http://www.vestas.com
>>
>> Company reg. name: Vestas Wind Systems A/S
>> This e-mail is subject to our e-mail disclaimer statement.
>> Please refer to www.vestas.com/legal/notice
>> If you have received this e-mail in error please contact the sender.
>>
>>  -----Original Message-----
>>> From: R-sig-Geo [mailto:r-sig-geo-bounces at r-project.org] On Behalf Of
>>> Jianyun Wu
>>> Sent: 28. november 2014 06:33
>>> To: R-sig-Geo at r-project.org
>>> Subject: [R-sig-Geo] How to delete some polygons from
>>> 'SpatialPolygonsDataFrame'
>>>
>>> Dear list,
>>>
>>> I usually use 'readOGR()' from rgdal package in R to input the ESRI
>>> shapefile.
>>> So the inputted data are SpatialPolygonsDataFrame.
>>>
>>> I am processing the New South Wales, Australia map for a spatial
>>> analysis.
>>> There is an island far away from the mainland, which I want to delete it
>>> from the map when I plot NSW.  Because it makes the whole plot small due
>>> to
>>> its long distant.
>>>
>>> Below is the area contains the polygons of this island and surrounding
>>> islands. There are 14 "@Polygons" contributing to the entire area. From
>>> some experiments, I know that it is Polygon 3-14 making the distant
>>> islands.
>>>
>>> Is there a simple way that I can delete those small polygons from this
>>> area
>>> polygon and their attributes from the data
>>>
>>> Thank you
>>>
>>> Fred
>>>
>>> str(nsw_lga[153, ])
>>> Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
>>>   ..@ data       :'data.frame':    1 obs. of  3 variables:
>>>   .. ..$ STATE_CODE: Factor w/ 9 levels "1","2","3","4",..: 1
>>>   .. ..$ LGA_CODE11: Factor w/ 565 levels "10050","10110",..: 153
>>>   .. ..$ LGA_NAME11: Factor w/ 564 levels "Adelaide (C)",..: 483
>>>   ..@ polygons   :List of 1
>>>   .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
>>>   .. .. .. ..@ Polygons :List of 14
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 3.83e-07
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:38, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 4.69e-07
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:13, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 7.82e-07
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:31, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 1.02e-06
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:47, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 1.14e-06
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:22, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.6
>>>   .. .. .. .. .. .. ..@ area   : num 1.38e-06
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:24, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 1.52e-06
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:26, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 2.05e-06
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:32, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 2.61e-06
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:36, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 4.27e-06
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:109, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.5
>>>   .. .. .. .. .. .. ..@ area   : num 1.42e-05
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:85, 1:2] 159 159 159 159 159 ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 159.1 -31.6
>>>   .. .. .. .. .. .. ..@ area   : num 0.00152
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:2929, 1:2] 159 159 159 159 159
>>> ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 142.2 -30.7
>>>   .. .. .. .. .. .. ..@ area   : num 8.79
>>>   .. .. .. .. .. .. ..@ hole   : logi FALSE
>>>   .. .. .. .. .. .. ..@ ringDir: int 1
>>>   .. .. .. .. .. .. ..@ coords : num [1:5178, 1:2] 144 144 144 144 144
>>> ...
>>>   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
>>>   .. .. .. .. .. .. ..@ labpt  : num [1:2] 141.5 -31.9
>>>   .. .. .. .. .. .. ..@ area   : num 0.0162
>>>   .. .. .. .. .. .. ..@ hole   : logi TRUE
>>>   .. .. .. .. .. .. ..@ ringDir: int -1
>>>   .. .. .. .. .. .. ..@ coords : num [1:131, 1:2] 141 141 141 141 141 ...
>>>   .. .. .. ..@ plotOrder: int [1:14] 13 14 12 11 10 9 8 7 6 5 ...
>>>   .. .. .. ..@ labpt    : num [1:2] 142.2 -30.7
>>>   .. .. .. ..@ ID       : chr "152"
>>>   .. .. .. ..@ area     : num 8.79
>>>   ..@ plotOrder  : int 1
>>>   ..@ bbox       : num [1:2, 1:2] 141 -33.4 159.1 -29
>>>   .. ..- attr(*, "dimnames")=List of 2
>>>   .. .. ..$ : chr [1:2] "x" "y"
>>>   .. .. ..$ : chr [1:2] "min" "max"
>>>   ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
>>>   .. .. ..@ projargs: chr "+proj=longlat +ellps=GRS80 +no_defs"
>>>
>>>         [[alternative HTML version deleted]]
>>>
>>> _______________________________________________
>>> R-sig-Geo mailing list
>>> R-sig-Geo at r-project.org
>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>>
>>
>> _______________________________________________
>> R-sig-Geo mailing list
>> R-sig-Geo at r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>
>>
> --
> Roger Bivand
> Department of Economics, Norwegian School of Economics,
> Helleveien 30, N-5045 Bergen, Norway.
> voice: +47 55 95 93 55; fax +47 55 95 91 00
> e-mail: Roger.Bivand at nhh.no

	[[alternative HTML version deleted]]



More information about the R-sig-Geo mailing list