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
3 data sets
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)
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)
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 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")