Thank you Dexter, for your quick response. But what I would like to have are the interior boundaries, not the exterior one. ________________________________ From: Dexter Locke <[email protected]> Sent: Thursday, August 7, 2025 01:27 To: Xiang Ye <[email protected]> Cc: [email protected] <[email protected]> Subject: Re: [R-sig-Geo] How to retrieve the interior boundary (points) of a polygon sf object
library(tidyverse) library(sf) library(spData) polygon=st_geometry(us_states) plot(polygon) polygon |> st_as_sf() |> summarise() |> plot() On Wed, Aug 6, 2025 at 1:25 PM Xiang Ye <[email protected]<mailto:[email protected]>> wrote: Dear community, I am trapped by a seemingly easy task. I would like to write a short R script to retrieve the interior boundary (points) of a polygon sf object, like the state boundary of the Contiguous United States, but without the outline. I tried several methods, with none fulfilling my objective. Below is the code, with my observations in the comments: # Objective: Retrieve the internal boundary of a polygon data set library(tidyverse) library(sf) library(spData) polygon=st_geometry(us_states) plot(polygon) # Method 1: Use st_difference() st_union(polygon) -> border plot(border) st_difference(polygon, border) -> interior plot(interior) # You can tell that the result is weird. # Method 2: Retrieve vertices as points, then use st_difference() st_cast(polygon, 'POINT') -> points_polygon points_polygon # 3585 features st_cast(border, 'POINT') -> points_border points_border # 1275 features st_difference(points_polygon, points_border) -> points_interior # About 2 minutes to execute points_interior # 4.57 million features, about 2 GB. why? # Methods 3: Use st_disjoint instead of st_difference() polygon[border, op=st_disjoint] # Empty set points_polygon[border, op=st_disjoint] -> points_interior2 points_interior2 # 132 features; plot() it and doesn't look right points_polygon[points_border, op=st_disjoint] -> points_interior3 points_interior3 # 3585 features, meaning no points have been taken out # Methods 4: Retrieve vertices as coordinates, converting them into tibbles, then anti-join the border coordinates st_coordinates(polygon) %>% as_tibble -> coords_polygon coords_polygon# A tibble: 3,585 × 5 st_coordinates(border) %>% as_tibble -> coords_border coords_border # A tibble: 1,275 × 5 anti_join(coords_polygon, coords_border) -> coords_interior coords_interior # A tibble: 3,585 × 5, meaning no points have been taken out, and implying no coordinates in coords_border coincides with the coordinates in coords_polygon. This is just not reasonable. Any comments on why I fail and/or how to do it correctly will be helpful. Thank you in advance! 叶翔 YE, Xiang THINKING SPATIALLY<http://www.linkedin.com/in/spatialyexiang>. Ph.D. in Spatial Statistics [[alternative HTML version deleted]] _______________________________________________ R-sig-Geo mailing list [email protected]<mailto:[email protected]> https://stat.ethz.ch/mailman/listinfo/r-sig-geo [[alternative HTML version deleted]] _______________________________________________ R-sig-Geo mailing list [email protected] https://stat.ethz.ch/mailman/listinfo/r-sig-geo
