Neighborhood Charts

This notebook is in support of an application to be able to overlay certain geospatial data in and around my neighborhood in south Denver.

Based on Leaflet

df <- data.frame(lng=c(-104.985), lat=c(39.765))

m <- leaflet(df) %>% 
    addTiles() %>%
    addMarkers(lat=39.6445, lng=-104.9065, popup="Home")

#%>%
#    addProviderTiles(providers$Esri.WorldImagery)

m

perfect, now we have a large list of providers we can choose from

names(providers)
  [1] "OpenStreetMap"                      
  [2] "OpenStreetMap.Mapnik"               
  [3] "OpenStreetMap.BlackAndWhite"        
  [4] "OpenStreetMap.DE"                   
  [5] "OpenStreetMap.CH"                   
  [6] "OpenStreetMap.France"               
  [7] "OpenStreetMap.HOT"                  
  [8] "OpenStreetMap.BZH"                  
  [9] "OpenInfraMap"                       
 [10] "OpenInfraMap.Power"                 
 [11] "OpenInfraMap.Telecom"               
 [12] "OpenInfraMap.Petroleum"             
 [13] "OpenInfraMap.Water"                 
 [14] "OpenSeaMap"                         
 [15] "OpenPtMap"                          
 [16] "OpenTopoMap"                        
 [17] "OpenRailwayMap"                     
 [18] "OpenFireMap"                        
 [19] "SafeCast"                           
 [20] "Thunderforest"                      
 [21] "Thunderforest.OpenCycleMap"         
 [22] "Thunderforest.Transport"            
 [23] "Thunderforest.TransportDark"        
 [24] "Thunderforest.SpinalMap"            
 [25] "Thunderforest.Landscape"            
 [26] "Thunderforest.Outdoors"             
 [27] "Thunderforest.Pioneer"              
 [28] "OpenMapSurfer"                      
 [29] "OpenMapSurfer.Roads"                
 [30] "OpenMapSurfer.AdminBounds"          
 [31] "OpenMapSurfer.Grayscale"            
 [32] "Hydda"                              
 [33] "Hydda.Full"                         
 [34] "Hydda.Base"                         
 [35] "Hydda.RoadsAndLabels"               
 [36] "MapBox"                             
 [37] "Stamen"                             
 [38] "Stamen.Toner"                       
 [39] "Stamen.TonerBackground"             
 [40] "Stamen.TonerHybrid"                 
 [41] "Stamen.TonerLines"                  
 [42] "Stamen.TonerLabels"                 
 [43] "Stamen.TonerLite"                   
 [44] "Stamen.Watercolor"                  
 [45] "Stamen.Terrain"                     
 [46] "Stamen.TerrainBackground"           
 [47] "Stamen.TopOSMRelief"                
 [48] "Stamen.TopOSMFeatures"              
 [49] "Esri"                               
 [50] "Esri.WorldStreetMap"                
 [51] "Esri.DeLorme"                       
 [52] "Esri.WorldTopoMap"                  
 [53] "Esri.WorldImagery"                  
 [54] "Esri.WorldTerrain"                  
 [55] "Esri.WorldShadedRelief"             
 [56] "Esri.WorldPhysical"                 
 [57] "Esri.OceanBasemap"                  
 [58] "Esri.NatGeoWorldMap"                
 [59] "Esri.WorldGrayCanvas"               
 [60] "OpenWeatherMap"                     
 [61] "OpenWeatherMap.Clouds"              
 [62] "OpenWeatherMap.CloudsClassic"       
 [63] "OpenWeatherMap.Precipitation"       
 [64] "OpenWeatherMap.PrecipitationClassic"
 [65] "OpenWeatherMap.Rain"                
 [66] "OpenWeatherMap.RainClassic"         
 [67] "OpenWeatherMap.Pressure"            
 [68] "OpenWeatherMap.PressureContour"     
 [69] "OpenWeatherMap.Wind"                
 [70] "OpenWeatherMap.Temperature"         
 [71] "OpenWeatherMap.Snow"                
 [72] "HERE"                               
 [73] "HERE.normalDay"                     
 [74] "HERE.normalDayCustom"               
 [75] "HERE.normalDayGrey"                 
 [76] "HERE.normalDayMobile"               
 [77] "HERE.normalDayGreyMobile"           
 [78] "HERE.normalDayTransit"              
 [79] "HERE.normalDayTransitMobile"        
 [80] "HERE.normalNight"                   
 [81] "HERE.normalNightMobile"             
 [82] "HERE.normalNightGrey"               
 [83] "HERE.normalNightGreyMobile"         
 [84] "HERE.basicMap"                      
 [85] "HERE.mapLabels"                     
 [86] "HERE.trafficFlow"                   
 [87] "HERE.carnavDayGrey"                 
 [88] "HERE.hybridDay"                     
 [89] "HERE.hybridDayMobile"               
 [90] "HERE.pedestrianDay"                 
 [91] "HERE.pedestrianNight"               
 [92] "HERE.satelliteDay"                  
 [93] "HERE.terrainDay"                    
 [94] "HERE.terrainDayMobile"              
 [95] "FreeMapSK"                          
 [96] "MtbMap"                             
 [97] "CartoDB"                            
 [98] "CartoDB.Positron"                   
 [99] "CartoDB.PositronNoLabels"           
[100] "CartoDB.PositronOnlyLabels"         
[101] "CartoDB.DarkMatter"                 
[102] "CartoDB.DarkMatterNoLabels"         
[103] "CartoDB.DarkMatterOnlyLabels"       
[104] "HikeBike"                           
[105] "HikeBike.HikeBike"                  
[106] "HikeBike.HillShading"               
[107] "BasemapAT"                          
[108] "BasemapAT.basemap"                  
[109] "BasemapAT.grau"                     
[110] "BasemapAT.overlay"                  
[111] "BasemapAT.highdpi"                  
[112] "BasemapAT.orthofoto"                
[113] "nlmaps"                             
[114] "nlmaps.standaard"                   
[115] "nlmaps.pastel"                      
[116] "nlmaps.grijs"                       
[117] "nlmaps.luchtfoto"                   
[118] "NASAGIBS"                           
[119] "NASAGIBS.ModisTerraTrueColorCR"     
[120] "NASAGIBS.ModisTerraBands367CR"      
[121] "NASAGIBS.ViirsEarthAtNight2012"     
[122] "NASAGIBS.ModisTerraLSTDay"          
[123] "NASAGIBS.ModisTerraSnowCover"       
[124] "NASAGIBS.ModisTerraAOD"             
[125] "NASAGIBS.ModisTerraChlorophyll"     
[126] "NLS"                                
[127] "JusticeMap"                         
[128] "JusticeMap.income"                  
[129] "JusticeMap.americanIndian"          
[130] "JusticeMap.asian"                   
[131] "JusticeMap.black"                   
[132] "JusticeMap.hispanic"                
[133] "JusticeMap.multi"                   
[134] "JusticeMap.nonWhite"                
[135] "JusticeMap.white"                   
[136] "JusticeMap.plurality"               
[137] "Wikimedia"                          

Let’s add some nearby trail access points

trail_str = 
    "lat lng name trail
39.6568 -104.9034 'goldsmith' green
39.6426 -104.9408 'CO Highline' red
39.6529 -104.9466 'Hampden Highline' red
39.6596 -104.9403 'Eisenhower Pool' red
39.6594 -104.9317 'Dahlia Highline' red
39.6675 -104.9211 'Yale-1 Highline' red
39.6675 -104.9115 'Yale-2 Highline' red
39.6675 -104.9049 'Yale-3 Highline' red
39.6683 -104.8921 'Yale-4 Highline' red
39.6744 -104.9034 'Quebec Highline' red
39.6641 -104.8845 'Yosemite Highline' red
39.6386  -104.9361  'Highline Qunicy/Cherry Hills' red
    39.6350  -104.9322  'Highline Dahlia/Cherry Hills' red
     39.6599  -104.9035 'Highline/Goldsmith' green
     39.6347  -104.8930 'I225/Goldsmith' green
     39.6316  -104.8910 'Wallace Park' green
     39.6426  -104.8956 'Rosamund' green
     39.6239  -104.8890 'Belleview' green
     39.6440  -104.8803 'Village Green Trail' blue
      39.6615 -104.8778 'Hampden Heights' blue
      39.6277 -104.8758 'Campus' blue
      39.6601 -104.8649 'Cherry Creek-1' blue
      39.6322 -104.8755 'Cherry Creek-2' blue"



trails <- read.table(text=trail_str,
                     header=TRUE,
                     stringsAsFactors = FALSE) 
trails
       lat       lng                         name trail
1  39.6568 -104.9034                    goldsmith green
2  39.6426 -104.9408                  CO Highline   red
3  39.6529 -104.9466             Hampden Highline   red
4  39.6596 -104.9403              Eisenhower Pool   red
5  39.6594 -104.9317              Dahlia Highline   red
6  39.6675 -104.9211              Yale-1 Highline   red
7  39.6675 -104.9115              Yale-2 Highline   red
8  39.6675 -104.9049              Yale-3 Highline   red
9  39.6683 -104.8921              Yale-4 Highline   red
10 39.6744 -104.9034              Quebec Highline   red
11 39.6641 -104.8845            Yosemite Highline   red
12 39.6386 -104.9361 Highline Qunicy/Cherry Hills   red
13 39.6350 -104.9322 Highline Dahlia/Cherry Hills   red
14 39.6599 -104.9035           Highline/Goldsmith green
15 39.6347 -104.8930               I225/Goldsmith green
16 39.6316 -104.8910                 Wallace Park green
17 39.6426 -104.8956                     Rosamund green
18 39.6239 -104.8890                    Belleview green
19 39.6440 -104.8803          Village Green Trail  blue
20 39.6615 -104.8778              Hampden Heights  blue
21 39.6277 -104.8758                       Campus  blue
22 39.6601 -104.8649               Cherry Creek-1  blue
23 39.6322 -104.8755               Cherry Creek-2  blue
m2 <- leaflet(trails) %>% 
    addTiles() %>%
    addAwesomeMarkers(~lng, ~lat, label=~name, popup=~name,  icon=awesomeIcons(icon="bicycle", library="fa", markerColor=~trail)) %>%
    addProviderTiles(providers$Esri.WorldImagery)

m2
t_str = 
    "lat lng name
     39.6445  -104.9065  'Home'"



homes <- read.table(text=t_str,
                     header=TRUE,
                     stringsAsFactors = FALSE)

m3 <- m2 %>% 
    addMarkers(lng = homes$lng, lat = homes$lat)

m3

Ok that is looking good

Load Denver data

3 data sets

Street Lights

datafile <- "streetlight.csv"
fileURL <- "https://www.denvergov.org/media/gis/DataCatalog/street_light_poles/csv/street_light_poles.csv"
if(!file.exists(datafile)) {
    download.file(fileURL, destfile=datafile)
}
streetlights <- read.csv(datafile)
names(streetlights)
 [1] "COUN_DIST"              "GRID_ID"               
 [3] "OWNER"                  "ROAD_TYPE"             
 [5] "LOCATION"               "POLE_TAG_NO"           
 [7] "INSTALL_YEAR"           "POLE_TYPE"             
 [9] "POLE_MAT"               "POLE_COLOR"            
[11] "POLE_HT"                "POLE_FOUND"            
[13] "POLE_COND"              "POLE_ARM_CNT"          
[15] "POWER_SRC"              "SPLICE_BOX"            
[17] "BANNER_TYPE"            "BANNER_CAP"            
[19] "BANN_ATT_TYPE"          "CAMERA"                
[21] "WIFI"                   "ANTENNA"               
[23] "MOT_SENSOR"             "DIMMER"                
[25] "TRAF_CONTROL"           "SMALL_CELL"            
[27] "PLANTER_POT"            "OTHER_ATT"             
[29] "COMMENT_"               "ATTACHMENTID"          
[31] "QAQC"                   "QAQC_COMM"             
[33] "CREATED_BY"             "CREATED_DATE"          
[35] "EDITED_BY"              "EDIT_DATE"             
[37] "ESRIGNSS_RECEIVER"      "ESRIGNSS_H_RMS"        
[39] "ESRIGNSS_V_RMS"         "ESRIGNSS_LATITUDE"     
[41] "ESRIGNSS_LONGITUDE"     "ESRIGNSS_ALTITUDE"     
[43] "ESRIGNSS_PDOP"          "ESRIGNSS_HDOP"         
[45] "ESRIGNSS_VDOP"          "ESRIGNSS_FIXTYPE"      
[47] "ESRIGNSS_CORRECTIONAGE" "ESRIGNSS_STATIONID"    
[49] "ESRIGNSS_NUMSATS"       "ESRIGNSS_FIXDATETIME"  
[51] "TRAFFIC_SIG"            "LUMIN_WATT"            
[53] "COUNT_"                 "SOLAR_PAN"             
[55] "PARK_CODE"              "PARK_NAME"             
[57] "INSTALL_DATE"          
#filter(lat < 39.763 & lat > 39.755) %>%
#    filter(lng > -104.989 & lng < -104.981) %>%


sldf <- subset(streetlights, 
               select=c(ESRIGNSS_LATITUDE, ESRIGNSS_LONGITUDE, ROAD_TYPE, POLE_TYPE, POLE_HT, POWER_SRC, DIMMER, ESRIGNSS_ALTITUDE, OWNER, LOCATION, INSTALL_YEAR, POLE_COND, LUMIN_WATT)) %>%
    rename(lat=ESRIGNSS_LATITUDE, lng=ESRIGNSS_LONGITUDE) %>%
    filter(lat > 39.75 & lat < 39.77) %>%
    filter(lng > -105.00 & lng < -104.96) %>%
    extract(col="POLE_HT", into="ht", "([0-9]+)" ) %>%
    extract(col="LUMIN_WATT", into="watts", "([0-9]+)" ) %>%
    mutate(ht = as.numeric(ht)) %>%
    mutate(watts = as.numeric(watts)) %>%
    mutate(ps = ifelse(POWER_SRC == "Underground", "Underground", "Above Ground"))


summary(sldf$ps)
   Length     Class      Mode 
     3818 character character 

The color represents if the powersource is underground or not, the size is propotional to the Lumin Wattage of the light.

pal <- colorFactor("Accent", domain=sldf$ps)

label0 <- paste("Pole Type:", sldf$POLE_TYPE)
label1 <- paste("Wattage:", sldf$watts)
labels <- paste(label0,paste("\n", label1))

leaflet(sldf) %>%
    addTiles() %>%
    addCircleMarkers(~lng, ~lat,
               weight = 1,
               radius= sldf$watts /20, 
               fillOpacity=0.3, 
               label = ~htmlEscape(labels),
               color = ~pal(ps),
               clusterOptions = markerClusterOptions()
               ) %>%
    addLegend("bottomright", pal = pal, values=sldf$ps, title="Power Supply") %>%
    setView(lat=39.765, lng=-104.985, zoom = 15) %>%
    addProviderTiles(providers$Esri.WorldImagery)

Load the 311 data

datafile <- "311service.csv"
fileURL <- "https://www.denvergov.org/media/gis/DataCatalog/311_service_requests_2007_to_current/csv/311_service_requests_2007_to_current.csv"

# 2016 only
fileURL2 <- "https://www.denvergov.org/media/gis/DataCatalog/311_service_data/csv/311_service_data_2016.csv"


if(!file.exists(datafile)) {
    download.file(fileURL, destfile=datafile)
}
raw_infocalls <- read.csv(datafile)
names(raw_infocalls)
 [1] "Case.Summary"            "Case.Status"            
 [3] "Case.Source"             "Case.Created.Date"      
 [5] "Case.Created.dttm"       "Case.Closed.Date"       
 [7] "Case.Closed.dttm"        "First.Call.Resolution"  
 [9] "Customer.Zip.Code"       "Incident.Address.1"     
[11] "Incident.Address.2"      "Incident.Intersection.1"
[13] "Incident.Intersection.2" "Incident.Zip.Code"      
[15] "Longitude"               "Latitude"               
[17] "Agency"                  "Division"               
[19] "Major.Area"              "Type"                   
[21] "Topic"                   "Council.District"       
[23] "Police.District"         "Neighborhood"           
dim(raw_infocalls)
[1] 480714     24
infocalls <- raw_infocalls %>%
   rename(lat=Latitude, lng=Longitude) %>%
    filter(lat > 39.75 & lat < 39.77) %>%
    filter(lng > -105.00 & lng < -104.96)

ok… now in business

leaflet(infocalls) %>%
    addTiles() %>%
    addCircleMarkers(~lng, ~lat,
               weight = 1,
               fillOpacity=0.3, 
               clusterOptions = markerClusterOptions()
               ) %>%
    setView(lat=39.7, lng=-104.9, zoom = 10) %>%
    addProviderTiles(providers$Esri.WorldImagery)

grocery data

datafile <- "food.csv"
fileURL <- "https://www.denvergov.org/media/gis/DataCatalog/food_stores/csv/food_stores.csv"


if(!file.exists(datafile)) {
    download.file(fileURL, destfile=datafile)
}
raw_food <- read.csv(datafile)
names(raw_food)
 [1] "STORE_TYPE"       "STORE_NAME"       "ADDRESS_ID"      
 [4] "ADDRESS_LINE1"    "ADDRESS_LINE2"    "CITY"            
 [7] "STATE"            "ZIP"              "PHONE"           
[10] "HOURS"            "SNAP"             "SIC"             
[13] "NAICS_EXT"        "SALES_VOL"        "HDBRCH"          
[16] "NUMBER_EMP"       "EMPSIZ"           "FRNCOD"          
[19] "SQFT"             "SOURCE"           "POINT_X"         
[22] "POINT_Y"          "HCSI"             "NBHD_NAME"       
[25] "COUNCIL_DISTRICT" "GLOBALID"        
summary(raw_food)
                      STORE_TYPE          STORE_NAME  ADDRESS_ID    
 Convenience Store         :139   7-Eleven     : 76   Mode:logical  
 Convenience Store With Gas:134   King Soopers : 29   NA's:588      
 Specialty Food Store      : 79   Family Dollar: 17                 
 Small Grocery Store       : 69   Safeway      : 17                 
 Supermarket               : 63   Walgreen     : 16                 
 Dollar Store              : 31   Conoco       : 13                 
 (Other)                   : 73   (Other)      :420                 
              ADDRESS_LINE1 ADDRESS_LINE2         CITY     STATE   
 1320 S Federal Blvd :  2   Mode:logical   Denver   :530     :  3  
 2200 S MONACO PKWY  :  2   NA's:588       Aurora   : 13   CO:585  
 3350 N BRIGHTON BLVD:  2                  Littleton: 12           
 8900 E HAMPDEN AVE  :  2                  Lakewood :  9           
 909 S ONEIDA ST     :  2                  Englewood:  6           
 10 E Ellsworth Ave  :  1                           :  3           
 (Other)             :577                  (Other)  : 15           
      ZIP                   PHONE      HOURS         SNAP   
 Min.   :80002                 :331   Mode:logical    :587  
 1st Qu.:80205   (303) 537-9808:  2   NA's:588       X:  1  
 Median :80216   (303) 200-1830:  1                         
 Mean   :80195   (303) 205-0754:  1                         
 3rd Qu.:80222   (303) 209-0182:  1                         
 Max.   :80249   (303) 209-7749:  1                         
 NA's   :317     (Other)       :251                         
      SIC           NAICS_EXT        SALES_VOL          HDBRCH       
 Min.   :531102   Min.   :445110   Min.   :   114000   Mode:logical  
 1st Qu.:539901   1st Qu.:445110   1st Qu.:   618000   NA's:588      
 Median :541105   Median :445110   Median :  1185000                 
 Mean   :539297   Mean   :447063   Mean   : 13520660                 
 3rd Qu.:541105   3rd Qu.:452111   3rd Qu.: 25802000                 
 Max.   :549913   Max.   :452990   Max.   :125495000                 
 NA's   :339      NA's   :339      NA's   :341                       
   NUMBER_EMP            EMPSIZ     FRNCOD                   SQFT    
 Min.   :  1.00             :341   Mode:logical                :340  
 1st Qu.:  3.00   1 to 4    :101   NA's:588       0 - 2,499    :114  
 Median :  6.00   100 to 249: 55                  2,500 - 9,999: 61  
 Mean   : 56.09   5 to 9    : 36                  40,000+      : 73  
 3rd Qu.:100.00   50 to 99  : 23                                     
 Max.   :570.00   10 to 19  : 19                                     
 NA's   :341      (Other)   : 13                                     
           SOURCE       POINT_X          POINT_Y     
              :  8   Min.   :-105.1   Min.   :39.59  
 DEH2014      :314   1st Qu.:-105.0   1st Qu.:39.69  
 DEH2015      :  8   Median :-105.0   Median :39.73  
 DEH2016      :  2   Mean   :-105.0   Mean   :39.72  
 InfoGroup2014:249   3rd Qu.:-104.9   3rd Qu.:39.76  
 OED          :  7   Max.   :-104.7   Max.   :39.85  
                                                     
                              HCSI                        NBHD_NAME  
                                :572   Outside Denver          : 63  
 Healthy Corner Store Initiative: 16   CBD                     : 20  
                                       Westwood                : 20  
                                       Athmar Park             : 17  
                                       Baker                   : 15  
                                       Washington Virginia Vale: 15  
                                       (Other)                 :438  
            COUNCIL_DISTRICT                                   GLOBALID  
 Council District 9 : 96     {00000000-0000-0000-0000-000000000000}:588  
 Council District 7 : 72                                                 
 Council District 3 : 64                                                 
 Outside Denver     : 63                                                 
 Council District 1 : 58                                                 
 Council District 10: 43                                                 
 (Other)            :192                                                 
food <- raw_food %>%
   rename(lat=POINT_Y, lng=POINT_X, label=STORE_NAME)
table(food$STORE_TYPE)

   Closed Convenience Store  Closed Small Grocery Store 
                          5                           4 
Closed Specialty Food Store          Closed Supermarket 
                          1                           5 
          Convenience Store  Convenience Store With Gas 
                        139                         134 
Discount Merchandise Market                Dollar Store 
                          3                          31 
                   Pharmacy         Small Grocery Store 
                         22                          69 
       Specialty Food Store                 Supercenter 
                         79                          17 
                  Superette                 Supermarket 
                          8                          63 
       Warehouse Club Store 
                          8 

Basic Food plot

pal <- colorFactor("Accent", domain=food$STORE_TYPE)


leaflet(food) %>%
    addTiles() %>%
    addCircleMarkers(~lng, ~lat, 
               weight = 1,
               fillOpacity = 0.3, 
               color = ~pal(STORE_TYPE)
               ) %>%
        setView(lat=39.7, lng=-104.9, zoom = 10) %>%
addProviderTiles(providers$Esri.WorldImagery)

Write Output

Write out the datasets for usage in the shiny app

lights <- sldf
save(trails, file="trails.RData")
save(lights, file="lights.RData")
save(infocalls, file="infocalls.RData")
save(food, file="food.RData")