Poly2nb - How to get rid of empty geometries in r

743 Views Asked by At

I have r code that I am using to compute Getis-ord Gstatistics. I typically create my shapefile in GIS, then import into r to use with the code. I recently needed to make an edit to my shapefile, which I did in GIS and imported into sas as usual:

tract<-st_read("CBSA2022.shp")

My issue is with the loop portion of my code and the poly2nb feature. Currently it is written as:

for (CBSA in CBSAs) {
  temp <- tract[ tract$CBSAFP == CBSA, c("JOIN_ID", variable_of_int)]
  names(temp)[2] <- 'black_pop'
  #We create the weight matrices within each CBSA now
  #We check that there are more than one tract in the CBSA
  if ((nrow(temp) > 1)) {
    q1<-poly2nb(temp, queen = queen)
if (self_include){ q1 <- include.self(q1) }

Before editing my shapefile in GIS, this worked perfectly with no errors. Now, I receive this error message:

Error in poly2nb(temp, queen = queen) : Empty geometries found

What do you think could be different about my shapefile that I now get this error? And/or how can I fix this? The only difference between this shapefile and the original, is I had to define my spatial join differently when joining my data to spatial polygons in GIS.

I haven't tried anything significant since I am not well versed in r. I did not create this code, but worked with a student (that is no longer available) to create it to be very user friendly for me to use. I've used it numerous times with different shapefiles before my recent edit, and it always worked, just not sure why I now have empty geometries or how to fix it.

1

There are 1 best solutions below

1
On

Looking on the source code for poly2nb (https://github.com/r-spatial/spdep/blob/main/R/poly2nb.R):

poly2nb <- function(pl, row.names=NULL, snap=sqrt(.Machine$double.eps),
    queen=TRUE, useC=TRUE, foundInBox=NULL) {
[...]
            if (inherits(pl, "sfc")) {
[...]
                if (attr(pl, "n_empty") > 0L) 
                    stop("Empty geometries found")
                sf <- TRUE
            }

seems, that your temp object is class sfc however, the n_empty attribute isn't updated. Googling around we can find an example: https://github.com/r-spatial/sf/issues/1115. You can check n_empty for your geometries and replace (with 0) those which have value > 0.