Chapter 8 Appendix

8.1 Extract amenities from OpenStreetMap

The survey going to be conducted focuses on local formal and informal institutions. Some secondary information can be collected by government but OpenStreetMap is a great resource which also habors a lot of those data.

extract_from_osm <- function(sp_obj) {
  amenities_df <- data.frame(name= c("hospital",
                                     "doctors",
                                     "clinic",
                                     "pharmacy",
                                     "witchdoctors",
                                     "drinking_water",
                                     "water_point",
                                     "police",
                                     "marketplace",
                                     "school",
                                     "college",
                                     "university",
                                     "kindergarten",
                                     "community_centre",
                                     "social_facility",
                                     "place_of_worship"),
                             category= c(rep("health",5),
                                         rep("water",2),"police",
                                         "marketplace",
                                         rep("education",4),
                                         "community_centre",
                                         "social_facility",
                                         "place_of_worship"))
  
  
  coords <- paste0(st_bbox(sp_obj)[c(2,1,4,3)],collapse=",")
  
  overpass_query <- paste0('[out:xml][timeout:100];\n(\nnode["amenity"](',coords,');
);\nout body;\n>;\nout skel qt;')
  
  query_spatial <- overpass_query(overpass_query)
  if (is.null(query_spatial)) return(NULL)

  proj4string(query_spatial) <- CRS("+init=epsg:4326")
  
  select_type <- sp_obj$type %>% 
    unique %>% 
    data.frame(u=.) %>% 
    filter(grepl("Unit",u)) %>% 
    mutate(v=strsplit(u,"_",fixed=TRUE) %>% 
             lapply(`[[`,2)) %>% 
    filter(v==max(as.numeric(v))) %>% 
    dplyr::select(u) %>% 
    unlist
  
  
  sp_obj <- sp_obj[sp_obj$type==select_type,]
  sp_obj_buf <- buffer_shape(sp_obj,5)
  sp_obj_buf <- sp_obj_buf[[2]]
  
  
  amenities_cropped <- 
    crop(query_spatial,spTransform(sp_obj_buf,CRS(proj4string(query_spatial)))) 
  
  if (is.null(amenities_cropped)) return(NULL)
  
  amenities_cropped_restr <- 
    amenities_cropped[amenities_cropped$amenity%in%amenities_df$name,]
  
  # amenities_cropped$amenity[!is.na(amenities_cropped$religion)] %>% table
  
  
  # plot(sp_obj_buf,col="red")
  # pa(sp_obj,col="blue")
  # amenities_cropped_restr
  
  amenities_cropped_restr_sf <- amenities_cropped_restr %>% 
    st_as_sf()
  # amenities_cropped_restr_sf$amenity
  
  amenities_cropped_restr_sf <- amenities_cropped_restr_sf %>% 
    mutate(cat = sapply(amenity,function(x) 
      amenities_df$category[amenities_df$name==x]))
  
  amenities_cropped_restr_sf
}
nairobi_amenities <- extract_from_osm(nairobi_1k_sample_complete)
lusaka_amenities <- extract_from_osm(lusaka_1k_sample_complete)
lilongwe_amenities <- extract_from_osm(lilongwe_1k_sample_complete)
zambia_amenities <- extract_from_osm(zambia_5k_1k_sample_200_complete)
malawi_amenities <- extract_from_osm(malawi_5k_1k_sample_200_complete)
lays <- ogrListLayers("data/zambia/Zam_Sample_schs.kml")
zambia_wards <- readKML("data/zambia/Zam_Sample_schs.kml",
                        layer=lays[1])

zambia_schools <- readKML("data/zambia/Zam_Sample_schs.kml",
                        layer=lays[2])
osm_school <- lusaka_amenities %>% 
  filter(amenity=="school"&!is.na(name)) %>% 
  arrange(name) %>% 
  as("Spatial") 


# ring wise
kms <- seq(0,2,0.05) 
kms_df <- data.frame(f = kms[1:(length(kms)-1)],
                     s = kms[2:length(kms)])
kd <- kms_df[1,] %>% unlist
x <- 1

substract_circle <- function(point,buffer_vector) {
  b2 <- point %>% 
    buffer_shape(buffer_vector[2])
  if (buffer_vector[1]==0) return(b2[[2]])
  b1 <- point %>% 
    buffer_shape(buffer_vector[1])
  gDifference(b2[[2]],b1[[2]])
}


pairs <- lapply(1:nrow(kms_df)
                ,function(kdx) {
  message(kdx)
  kd <- kms_df[kdx,]
  osm_school_buf <- lapply(1:length(osm_school),function(x) {
    substract_circle(osm_school[x,],kd)
  }) %>% 
    do.call(bind,.)

  # fison_school_buf <- lapply(1:length(zambia_schools),function(x) {
  #   substract_circle(zambia_schools[x,],kd)
  # }) %>% 
  #   do.call(bind,.)
  
  
  over_df <- over(zambia_schools,osm_school_buf) %>% 
    data.frame(osm = .,fison = names(.) %>% 
                 strsplit(".",fixed=TRUE) %>% 
                 sapply(`[[`,1)) %>% 
    filter(!is.na(fison)&!is.na(osm))
  
   
  
   # over_df <- over(osm_school_buf,fison_school_buf,returnList = FALSE) %>% 
   #  data.frame(fison=.,osm=names(.) %>% 
   #               strsplit(".",fixed=TRUE) %>% 
   #               sapply(`[[`,1)) %>% 
   #  filter(!is.na(fison)&!is.na(osm))
  
   if (nrow(over_df)==0) return(NULL)
  
   data.frame(over_df %>% 
    apply(2,as.numeric),
    max_radius=kd[2],
    rn= apply(over_df,1,paste0,collapse=""),
    row.names = 4)
}) %>% 
  do.call(rbind,.)
 
pairs2 <- pairs %>% 
  group_by(osm,fison) %>% 
  summarise(distance=min(s))

school_names_with_dist <- 
  lapply(kms_df$s,
         function(x1) {
           apply(pairs2 %>% 
                   filter(distance==x1),1,
                 function(x) { 
                   if (is.na(zambia_schools$Name[x[2]])|
                       is.na(osm_school$name[x[1]])) return(NULL)
                   data.frame(fison=zambia_schools$Name[x[2]],
                              osm=osm_school$name[x[1]])
                 }) %>% 
             do.call(rbind,.) %>% 
             cbind(radius=x1)
           }) %>% 
  do.call(rbind,.)

write.csv(school_names_with_dist,"output/zambia_school_merge.csv",
          row.names = FALSE)
school_names_with_dist[1:10,]


apply(pairs2,1,function(x) {
  if (is.na(zambia_schools$Name[x[1]])|
      is.na(osm_school$name[x[2]])) return(NULL)
  message("t")
  data.frame(fison=zambia_schools$Name[x[1]],
  osm=osm_school$name[x[2]])
}) %>% 
  do.call(rbind,.)


lusaka_close_schools <- lapply(c(5,1,0.05),function(y) {
  osm_school_buf <- lapply(1:length(osm_school),function(x) {
    b1 <- osm_school[x,] %>% 
      buffer_shape(y)
    b1[[2]]
  }) %>% 
    do.call(bind,.)
  
  fison_school_buf <- lapply(1:length(zambia_schools),function(x) {
    b2 <- zambia_schools[x,] %>% 
      buffer_shape(y)
    b2[[2]]
  }) %>% 
    do.call(bind,.)
  
  
  
  
  
  over_df <- over(osm_school_buf,fison_school_buf,returnList = FALSE) %>% 
    data.frame(fison=.,osm=names(.) %>% 
                 strsplit(".",fixed=TRUE) %>% 
                 sapply(`[[`,1)) %>% 
    filter(!is.na(fison)&!is.na(osm))
  over_df %>% 
    apply(2,as.numeric)
})

lusaka_close_schools[[3]]

osm_school@data %$% table(name) %>% length
osm_school %>% length
osm_school$name

plot(fison_school_buf[over_df[,1] %>% unique,])
pa(osm_school_buf[over_df[,2] %>% unique,],col="red")
x<-over_df[2,] %>% unlist

apply(lusaka_close_schools[[2]],1,function(x) {
  
  if (is.na(zambia_schools$Name[x[1]])|
      is.na(osm_school$name[x[2]])) return(NULL)
  message("t")
  data.frame(fison=zambia_schools$Name[x[1]],
  osm=osm_school$name[x[2]])
}) %>% 
  do.call(rbind,.)
nairobi_amenities$cat %>%
  unique
x1 <- "health"
split_amenity <- function(amenity,x1,where) {
  
  x1_sf <- amenity %>% 
    filter(cat==x1) 
  
  x1_keep <- x1_sf %>% 
    apply(2,function(y) !all(is.na(y))) %>% 
    which
  
  x1_sf %>% 
    dplyr::select(x1_keep) %>% 
    as.data.frame() %>% 
    dplyr::select(-geometry) %>% 
    write.csv(paste0("output/amenities/",where,"/osm_amenity_",x1,".csv"),
              row.names = FALSE)
}

sapply(nairobi_amenities$x<cat %>%
         unique,
       FUN = split_amenity,
       amenity = nairobi_amenities,
       where = "nairobi")

sapply(lusaka_amenities$cat %>%
         unique,
       FUN = split_amenity,
       amenity = lusaka_amenities,
       where = "lusaka")

sapply(lilongwe_amenities$cat %>%
         unique,
       FUN = split_amenity,
       amenity = lilongwe_amenities,
       where = "lilongwe")

sapply(zambia_amenities$cat %>%
         unique,
       FUN = split_amenity,
       amenity = zambia_amenities,
       where = "zambia")

sapply(malawi_amenities$cat %>%
         unique,
       FUN = split_amenity,
       amenity = malawi_amenities,
       where = "malawi")