Saturday, 29 June 2019

r - Creating an sf object from the maps package


I am trying to use data from the maps package in an sf workflow. I'm not sure if I have the operation correct (see below). It seems to work until state 20 (massachusetts). What am I doing wrong? Maybe there is a better way to do this?


state_data <- ggplot2::map_data("state")
state_data_sf <- lapply(unique(state_data$region),
function(x)
list(matrix(unlist(
state_data[state_data$region == x,][,c("long", "lat")]),

ncol = 2)))

sf::st_polygon(state_data_sf[[19]])


POLYGON((-87.4620056152344 30.3896808624268, -87.4849319458008 39.6200332641602, -78.1113357543945 39.6658706665039, -78.1342544555664 39.67732...



sf::st_polygon(state_data_sf[[20]])



Error in MtrxSet(x, dim, type = "POLYGON", needClosed = TRUE) : polygons not (all) closed





Answer



I figured it out. The polygons need to be manually closed by rbinding the first row:


state_data <- ggplot2::map_data("state")
state_data_sf <- lapply(unique(state_data$region),
function(x)
list(matrix(unlist(
rbind(
state_data[state_data$region == x,][,c("long", "lat")],
state_data[state_data$region == x,][1, c("long", "lat")])),

ncol = 2)))
res <- lapply(state_data_sf, sf::st_polygon)

EDIT


This is a much better solution. It is cleaner and does not suffer from closed polygon issues.


states <- sf::st_as_sf(maps::map("state", plot = FALSE, fill = TRUE))

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...