library(sf)
library(dplyr)
library(readr)
library(leaflet)
library(htmlwidgets)
library(tigris)
library(scales)

options(tigris_use_cache = TRUE)
setwd("C:/Users/mvx13/OneDrive - Texas State University/Projects/2026/RTI_2026/0_7263_mb_TXST/TX_Pedestrian_DataConflation/shapefiles")


##library(foreign)
##datsp= read.dbf("txdot_roadway_data_fc_gt_2.dbf")
##dim(datsp)
##names(datsp)

library(sf)
library(dplyr)
library(readr)

road_sf <- st_read("txdot_roadway_data_fc_gt_2.shp")
## Reading layer `txdot_roadway_data_fc_gt_2' from data source 
##   `C:\Users\mvx13\OneDrive - Texas State University\Projects\2026\RTI_2026\0_7263_mb_TXST\TX_Pedestrian_DataConflation\shapefiles\txdot_roadway_data_fc_gt_2.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 965972 features and 134 fields
## Geometry type: MULTILINESTRING
## Dimension:     XY
## Bounding box:  xmin: 339025 ymin: 8461859 xmax: 4428810 ymax: 12341480
## Projected CRS: NAD83 / Texas Central (ftUS)
setwd("C:/Users/mvx13/OneDrive - Texas State University/Projects/2026/RTI_2026/0_7263_mb_TXST/TX_Pedestrian_DataConflation/excel analysis")
top_csv= read.csv("only_lines_with_crashes_by_year_KABCO.csv")



# 4. Select LINE_ID and last three columns from CSV
last3_cols <- names(top_csv)[(ncol(top_csv) - 2):ncol(top_csv)]

top50_line <- top_csv %>%
  select(LINE_ID, all_of(last3_cols)) %>%
  slice_head(n = 50)


# 5. Make sure LINE_ID type matches in both files
road_sf <- road_sf %>%
  mutate(LINE_ID = as.character(LINE_ID))

top50_line <- top50_line %>%
  mutate(LINE_ID = as.character(LINE_ID))

# 6. Subset shapefile using top 50 LINE_ID and attach last three CSV columns
road_top50_sf <- road_sf %>%
  inner_join(top50_line, by = "LINE_ID")

library(sf)
library(dplyr)
library(readr)
library(leaflet)
library(htmlwidgets)
library(tigris)
library(scales)

# Texas boundary
tx_boundary <- states(cb = TRUE, year = 2023) %>%
  filter(STUSPS == "TX") %>%
  st_transform(st_crs(road_top50_sf))

# Transform for leaflet
road_top50_leaflet <- st_transform(road_top50_sf, 4326)
tx_boundary_leaflet <- st_transform(tx_boundary, 4326)

# Create top 10, top 20, top 50 layers
road_top10 <- road_top50_leaflet %>% filter(Rank <= 10)
road_top20 <- road_top50_leaflet %>% filter(Rank <= 20)
road_top50 <- road_top50_leaflet


# Better color palette based on All_KABCO
pal <- colorNumeric(
  palette = "inferno",
  domain = road_top50$All_KABCO,
  na.color = "gray70"
)

# Popup function
make_popup <- function(df) {
  paste0(
    "<div style='font-size:13px; line-height:1.35;'>",
    "<b>Rank:</b> ", df$Rank, "<br>",
    "<b>LINE_ID:</b> ", df$LINE_ID, "<br>",
    "<b>GID:</b> ", df$GID, "<br>",
    "<b>All_KABCO:</b> ", df$All_KABCO, "<br>",
    "<b>C_SEC:</b> ", df$C_SEC, "<br>",
    "<b>FRM_DFO:</b> ", df$FRM_DFO, "<br>",
    "<b>TO_DFO:</b> ", df$TO_DFO, "<br>",
    "<b>DI:</b> ", df$DI, "<br>",
    "<b>CO:</b> ", df$CO, "<br>",
    "<b>CITY:</b> ", df$CITY, "<br>",
    "<b>ADT_CUR:</b> ", df$ADT_CUR, "<br>",
    "<b>SPD_MAX:</b> ", df$SPD_MAX,
    "</div>"
  )
}

road_top10$popup_text <- make_popup(road_top10)
road_top20$popup_text <- make_popup(road_top20)
road_top50$popup_text <- make_popup(road_top50)

road_top10$label_text <- paste0(
  "Rank ", road_top10$Rank,
  " | LINE_ID: ", road_top10$LINE_ID,
  " | All_KABCO: ", road_top10$All_KABCO
)

road_top20$label_text <- paste0(
  "Rank ", road_top20$Rank,
  " | LINE_ID: ", road_top20$LINE_ID,
  " | All_KABCO: ", road_top20$All_KABCO
)

road_top50$label_text <- paste0(
  "Rank ", road_top50$Rank,
  " | LINE_ID: ", road_top50$LINE_ID,
  " | All_KABCO: ", road_top50$All_KABCO
)


# Function to add midpoint coordinates and Google Street View link
add_streetview <- function(x) {
  
  # Convert to WGS84
  x_wgs <- st_transform(x, 4326)
  
  # Project first so point creation is stable
  x_proj <- st_transform(x_wgs, 5070)
  
  # Create one representative point per roadway feature
  pts_proj <- st_point_on_surface(st_geometry(x_proj))
  
  # Convert point back to lat/lon
  pts_wgs <- st_transform(st_as_sf(data.frame(id = seq_along(pts_proj)),
                                   geometry = pts_proj,
                                   crs = 5070), 4326)
  
  coords <- st_coordinates(pts_wgs)
  
  x_wgs$sv_lon <- coords[, 1]
  x_wgs$sv_lat <- coords[, 2]
  
  x_wgs$streetview_link <- paste0(
    "https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=",
    x_wgs$sv_lat, ",", x_wgs$sv_lon
  )
  
  x_wgs
}

road_top10 <- road_top10 %>% add_streetview()
road_top20 <- road_top20 %>% add_streetview()
road_top50 <- road_top50 %>% add_streetview()



make_popup <- function(df) {
  paste0(
    "<div style='font-size:13px; line-height:1.35; width:360px;'>",
    
    "<b>Rank:</b> ", df$Rank, "<br>",
    "<b>LINE_ID:</b> ", df$LINE_ID, "<br>",
    "<b>GID:</b> ", df$GID, "<br>",
    "<b>All_KABCO:</b> ", df$All_KABCO, "<br>",
    "<b>C_SEC:</b> ", df$C_SEC, "<br>",
    "<b>FRM_DFO:</b> ", df$FRM_DFO, "<br>",
    "<b>TO_DFO:</b> ", df$TO_DFO, "<br>",
    "<b>DI:</b> ", df$DI, "<br>",
    "<b>CO:</b> ", df$CO, "<br>",
    "<b>CITY:</b> ", df$CITY, "<br>",
    "<b>ADT_CUR:</b> ", df$ADT_CUR, "<br>",
    "<b>SPD_MAX:</b> ", df$SPD_MAX, "<br><br>",
    
    "<b>Google Street View:</b><br>",
    "<iframe ",
    "width='340' ",
    "height='230' ",
    "style='border:0; margin-top:6px;' ",
    "loading='lazy' ",
    "allowfullscreen ",
    "src='https://www.google.com/maps?layer=c&cbll=",
    df$sv_lat, ",", df$sv_lon,
    "&cbp=11,0,0,0,0&output=svembed'>",
    "</iframe>",
    
    "</div>"
  )
}


road_top10$popup_text <- make_popup(road_top10)
road_top20$popup_text <- make_popup(road_top20)
road_top50$popup_text <- make_popup(road_top50)





m <- leaflet() %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  
  # Texas boundary
  addPolygons(
    data = tx_boundary_leaflet,
    fill = FALSE,
    color = "black",
    weight = 3,
    opacity = 1,
    group = "Texas Boundary"
  ) %>%
  
  # Top 50
  addPolylines(
    data = road_top50,
    color = ~pal(All_KABCO),
    weight = ~rescale(All_KABCO, to = c(3, 8)),
    opacity = 0.85,
    popup = ~popup_text,
    popupOptions = popupOptions(maxWidth = 430),
    label = ~label_text,
    highlightOptions = highlightOptions(
      weight = 11,
      color = "cyan",
      opacity = 1,
      bringToFront = TRUE
    ),
    group = "Top 50"
  ) %>%
  
  # Top 20
  addPolylines(
    data = road_top20,
    color = ~pal(All_KABCO),
    weight = ~rescale(All_KABCO, to = c(5, 11)),
    opacity = 0.95,
    popup = ~popup_text,
    popupOptions = popupOptions(maxWidth = 430),
    label = ~label_text,
    highlightOptions = highlightOptions(
      weight = 13,
      color = "cyan",
      opacity = 1,
      bringToFront = TRUE
    ),
    group = "Top 20"
  ) %>%
  
  # Top 10
  addPolylines(
    data = road_top10,
    color = ~pal(All_KABCO),
    weight = ~rescale(All_KABCO, to = c(7, 14)),
    opacity = 1,
    popup = ~popup_text,
    popupOptions = popupOptions(maxWidth = 430),
    label = ~label_text,
    highlightOptions = highlightOptions(
      weight = 16,
      color = "cyan",
      opacity = 1,
      bringToFront = TRUE
    ),
    group = "Top 10"
  ) %>%
  
  addLegend(
    position = "bottomright",
    pal = pal,
    values = road_top50$All_KABCO,
    title = "All_KABCO",
    opacity = 1
  ) %>%
  
  addLayersControl(
    overlayGroups = c(
      "Texas Boundary",
      "Top 10",
      "Top 20",
      "Top 50"
    ),
    options = layersControlOptions(collapsed = FALSE)
  ) %>%
  
  hideGroup("Top 20") %>%
  hideGroup("Top 50")

m