Scrape Michigan Lakes

Joseph Stachelek

2018-06-07

library(wikilake)
## Loading required package: maps

Generate list of Michigan Lakes

Get Wikipedia URL of Category

res <- WikipediR::page_info("en", "wikipedia",
        page = "Category:Lakes of Michigan")

Scrape lake names

res <- xml2::read_html(res$query$pages[[1]]$canonicalurl)
res <- rvest::html_nodes(res, "#mw-pages .mw-category")
res <- rvest::html_nodes(res, "li")
res <- rvest::html_nodes(res, "a")
res <- rvest::html_attr(res, "title")

Remove junk names

res <- res[!(seq_len(length(res)) %in% grep("List", res))]
res <- res[!(seq_len(length(res)) %in% grep("Watershed", res))]
res <- res[!(seq_len(length(res)) %in% grep("lakes", res))]
res <- res[!(seq_len(length(res)) %in% grep("Mud Lake", res))]

Scape tables

res <- lapply(res, lake_wiki)

# remove lakes with missing metadata
res <- res[unlist(lapply(res, function(x) !is.null(x)))]

# remove missing coordinates
res <- res[unlist(lapply(res, function(x) !is.na(x[,"Lat"])))]

Collapse list to data.frame

res_df_names <- unique(unlist(lapply(res, names)))
res_df <- data.frame(matrix(NA, nrow = length(res),
                                ncol = length(res_df_names)))
names(res_df) <- res_df_names
for(i in seq_len(length(res))){
  dt_pad <- data.frame(matrix(NA, nrow = 1,
              ncol = length(res_df_names) - ncol(res[[i]])))
  names(dt_pad) <- res_df_names[!(res_df_names %in% names(res[[i]]))]
  dt <- cbind(res[[i]], dt_pad)
  dt <- dt[,res_df_names]
  res_df[i,] <- dt
}

Map lakes

library(sp)

coordinates(res_df) <- ~Lon + Lat
map("state", region = "michigan", mar = c(0,0,0,0))
points(res_df, col = "red", pch = 19)