{"version":3,"sources":["mapbox-token.js","res/img/pin.png","res/img/Labels.svg","res/img/Legend Coverup.png","data.js","Map.js","sections_311.js","utils.js","sections_scoring.js","MapLegend.js","App.js","serviceWorker.js","index.js"],"names":["module","exports","__webpack_require__","p","issue_density_map","issue_density_map_module","category_counts","category_counts_module","type_counts","type_counts_module","time_data","_","binned_issues_on_time","d","geocode","unclosed_data","unclosed_issues","lngLat","feature","d3","geometry","coordinates","slice","h3Geocode","level","_lngLat","_lngLat2","Object","slicedToArray","lng","lat","h3","CODE_TO_FEATURE","CATEGORY_NAMES","id","hexes","forEach","featureIndex","obj","properties","fromPairs","entries","flatMap","kv","_kv","k","v","Array","isArray","map","_ref","_ref2","sub_k","sub_v","code","alpha","b311_issue_count","total_population","census_b01003001","census_area","hex_area","_area","proportion_of_census_geometry_in_hex","Math","min","hex_population","issues_normalized_by_population","c","ratio","on_time_pc_smoothed","pc_unclosed_smoothed","b311_unclosed_issue_count","count","fp","sidewalk_score","sidewalks_area_score","sidewalks_area","walkability_score","_count","social_need_score","census_b17020002","census_b17020001","census_b01001020","census_b01001021","census_b01001022","census_b01001023","census_b01001024","census_b01001025","census_b01001044","census_b01001045","census_b01001046","census_b01001047","census_b01001048","census_b01001049","census_b01001001","census_b11004004","census_b11004011","census_b11004017","census_b11004001","max_sidewalk_score","max_walkability_score","max_social_need_score","Number","isNaN","filter","mean_sidewalk_score","mean_walkability_score","mean_social_need_score","mapboxgl","accessToken","mapboxToken","markerInstance","params","URL","document","baseURI","searchParams","labelsAreHere","reverse","youAreHere","has","get","bostonCenter","Map","showNeighborhoods","property","color","opacity","fadeOpacity","stroke","showYouAreHere","onHover","onUnhover","composition","sectionIndex","clickZoomable","container","useRef","_useState","useState","_useState2","setMap","_useState3","_useState4","mapReady","setMapReady","features","youAreHereMarker","Marker","src","img","createElement","style","width","transform","markerImg","pin","offset","x","y","setLngLat","labelMarker","className","concat","labelImg","labels","useEffect","current","center","zoom","interactive","on","moveLayer","addSource","type","data","City_of_Boston_Boundary","maxzoom","ceil","buffer","hexBefore","addLayer","source","paint","line-color","line-width","line-opacity","fill-color","fill-opacity","transition","duration","delay","circle-radius","circle-radius-transition","circle-opacity-transition","circle-color","addTo","hoveredHexCodes","e","length","setFeatureState","hover","isStyleLoaded","remove","animating","flip","fn","flyTo","bearing","speed","target","targetZoom","display","console","log","setPaintProperty","extent","domain","scale","range","scores","sort","q","_composition","pc_1","pc_2","pc_3","toConsumableArray","pc","s","mapboxFillComposition","stops","default","mapboxFill","max","setLayoutProperty","blipStartTime","performance","now","requestAnimationFrame","frame","timestamp","PI","radius","sin","cos","off","react_default","a","ref","sectionOrder","divergingLogScale","base","clamp","groupedByCategory","categories","category","categoryTypeSubtitle","t","join","sections","mapOfBoston","buttonTitle","body","defaultState","format","assign","legendFormat","introHex","issueDensityMap","hoverInfo","hoverFeatures","sectionState","mean","sum","undefined","showingIssues","setSectionState","linkClick","key","onClick","mostCommonIssues","_ref3","percent","abs","toLowerCase","_ref4","str","split","i","charAt","toUpperCase","titleCase","timeliness","_ref5","conclusions","appIntro","Fragment","propHoverInfo","meanScore","value","thing","caption","pcLabel","firstThing","secondThing","thirdThing","allThreeThings","round","sections_scoring_TriangleSlider","onChange","leading","triArea","b","_a","xa","ya","_b","xb","yb","_c","xc","yc","TriangleSlider","_ref6","areaGen","R","sqrt","pow","twopi","o","pathData","event","total","areas","arr","makeComposition","area","triRef","useCallback","node","dragged","parentElement","circleRefCurrent","attr","call","circleRef","version","xmlns","height","viewBox","x1","y1","x2","y2","gradientTransform","stopColor","pointerEvents","fill","cx","cy","r","strokeWidth","_ref7","_ref8","MapLegend","observedVsExpected","legendLabels","tradeoff_score","category_ratio_LIVING CONDITIONS","category_ratio_PARKING","category_ratio_TRASH, RECYCLING, AND WASTE","category_ratio_STREETS, SIDEWALKS, AND PARKS","category_ratio_BUILDING AND CONSTRUCTION","category_ratio_SNOW","category_ratio_ANIMALS","category_ratio_TRANSPORTATION, VEHICLES, AND BICYCLES","title","overflow","clipPath","fontSize","MapOverlay","children","Sidebar","SectionNavigator","setSectionIndex","numSections","lastSection","App_NextButton","n","NextButton","App","hoveredBefore","setHoveredBefore","_setSectionIndex","_useState5","_useState6","moduleName","setModuleName","311","sections311","scoring","sectionsScoring","sectionOrder311","sectionOrderScoring","section","_useState7","_useState8","_useState9","_useState10","setHoverFeatures","appIntro311","appIntroScoring","App_Sidebar","App_SectionNavigator","App_MapOverlay","src_MapLegend","navigator","platform","match","Map_Map","Boolean","window","location","hostname","ReactDOM","render","src_App_0","getElementById","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.51b4196c.chunk.js","sourcesContent":["module.exports = \"pk.eyJ1Ijoiam9obm55Y3JpY2giLCJhIjoiY2pzbHh2NnRzMW9iYzQ5cW9weHVjMW9nNCJ9.2Hss5rN0Nyq2fdWEDX7QjQ\"","module.exports = __webpack_public_path__ + \"static/media/pin.d92651c5.png\";","module.exports = __webpack_public_path__ + \"static/media/Labels.f380b7c9.svg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbIAAABKCAYAAADexdHcAAAACXBIWXMAABYlAAAWJQFJUiTwAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA1LTIwVDEwOjU2OjU0LTA0OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNS0yMVQxMDoyNjo0NC0wNDowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNS0yMVQxMDoyNjo0NC0wNDowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1MmI1YzhlZi02MmZlLTQzMGUtYTRmNy1jNzZkN2U0MmM1N2YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTJiNWM4ZWYtNjJmZS00MzBlLWE0ZjctYzc2ZDdlNDJjNTdmIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NTJiNWM4ZWYtNjJmZS00MzBlLWE0ZjctYzc2ZDdlNDJjNTdmIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MmI1YzhlZi02MmZlLTQzMGUtYTRmNy1jNzZkN2U0MmM1N2YiIHN0RXZ0OndoZW49IjIwMTktMDUtMjBUMTA6NTY6NTQtMDQ6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7oZB8aAAADUklEQVR42u3by1FrUQwEQOVDEqRB/oGILUVR5mf7Hml6MQH0GdlTD3j1+vLWIiIiU1MeQUREDJmIiIghExERmTlkxjQnuhaRVUNWn5L0Zc7NzM3MPHzI6kZSSufWNTezz/XAIatfJOXQubO+2HTNzD10yOofSRqxZDM3MzP3kUNWd0xK6elmXXMz+1wfMWT1wKSUPunwda1rXTNf5q5hD3DqARR3jFvXutb1YeYaWPpJB1DcUR92XWe4fa6HmWtw6VcfQKJb17pmdt/HuWs4/oojSHTrmpuZ+Vh3LcE/4wgSza1rbmbm09218AHufQSJZl3rWte6HuOupfh7HEBxczOvc7vvheZaXvpfDyDRrWtdb3aXrveaK6T0nx5AolvX3Mw+16PNFYS/9RjczNzMzEPdHiHLzM2c4nbfhkzx3NzMhkzXhkzx3NzMhkzXhszPlR08N7Mh07UhM2S+3HRtyHRtyAyZg+dmNmS6NmSGzMFzMxsyXRsyQ+bguZkNma4NmfJ1zWzIdG3IlM/MzWzIdH2925D5cuNmNmS6NmTKZ+ZmNmS6NmTKZ+ZmNmS6NmTKZ+bWtfs2ZMpn5mbmZjZkymfm9n8ldc1syJTPzG3IdM1syJTPrGs3zmzIlM/Mbch0zWzIlM/Mbch0zWzIlM/Mzc3MbMgcvK65mZkNmfKZubmZmQ2Z8pm5uZmZDZnymbm5mQ2ZIfOXbLrmZmY2ZMo3ZLrmZmY2ZMo3ZLrmZmY2ZMo3ZLp248yGTPnczNzMzIZM+dzM3MzMhkz53MzczMy/G7IOLN7vyLiZfanrerD5qyFLeAxmbl3rWtdL3N89RAeVnm7WNTezz/VId4U8RP8x3MzczMyHu7cve98piW5dc7tx5hHmWvoY/aAkuoubebHbfS8w18LH6Acn0czN7HOt62Pdm/652k9OopnbjTO77+PcteAx+uIUNzM38wLzWPfknzn3YeFm5t7nZh5gnviHEX14Et3F7cZ1zXyVedovUXtQmLmZd7nd96HuGvIYPTjM3JvdzO77cvfpfxXUS1LcMWY3zuy+n+yuQx+jl6a4mbmZfa73DFkHFc6d69a1rpmXD9nHx2iJOXzvIOJzvW7IREREDJmIiBgyERERQyYiIvKsvAMKnucUEZwe0gAAAABJRU5ErkJggg==\"","// note: minSize = h3 size minus 2.\nimport * as hexes from \"./res/data/result_8_min.json\" // note: big file\nimport * as issue_density_map_module from \"./res/data/issue_density_map_10.json\"\nimport * as category_counts_module from \"./res/data/category_counts_10.json\"\nimport * as type_counts_module from \"./res/data/type_counts.json\"\nimport categories from \"./res/data/categories_out.json\"\nimport * as binned_issues_on_time from \"./res/data/binned_issues_on_time_10.json\"\nimport * as unclosed_issues from \"./res/data/unclosed_issues_10.json\"\nimport * as h3 from \"h3-js\"\nimport * as d3 from \"d3\"\nimport * as _ from \"lodash\"\nimport {fromPairs} from \"lodash\"\nexport const H3_LEVEL = 10 // 10 // 9 // the level of the geojson hexbins\nexport const MISSING = null\n\nconst issue_density_map = issue_density_map_module.data\nconst category_counts = category_counts_module.data\nconst type_counts = type_counts_module.data\nconst time_data = _.mapValues(\n _.groupBy(binned_issues_on_time.default, d => d.geocode),\n _.first\n)\nconst unclosed_data = _.mapValues(\n _.groupBy(unclosed_issues.default, d => d.geocode),\n _.first\n)\n\nexport {hexes, categories, type_counts}\n\nconst flattenNestedObjects = obj =>\n // Flatten nested objects by one level.\n fromPairs(\n Object.entries(obj).flatMap(kv => {\n let [k, v] = kv\n if (typeof v === \"object\" && !Array.isArray(v) && !!v) {\n return Object.entries(v).map(([sub_k, sub_v]) => [\n k + \"_\" + sub_k,\n sub_v\n ])\n } else {\n return [kv]\n }\n })\n )\n\nexport const lngLat = feature => {\n // Extract the center from a hexagon\n let lng = d3.mean(feature.geometry.coordinates[0].slice(1), d => d[1])\n let lat = d3.mean(feature.geometry.coordinates[0].slice(1), d => d[0])\n return [lng, lat]\n}\n\nexport const h3Geocode = (feature, level) => {\n // note: sampling two opposite coordinates would suffice\n let [lng, lat] = lngLat(feature)\n return h3.geoToH3(lng, lat, level)\n}\n\nconst smooth = (a, b, d, alpha) => (a + d * alpha) / (b + alpha)\n\nexport const CODE_TO_FEATURE = {}\n\nexport const CATEGORY_NAMES = [\n \"LIVING CONDITIONS\",\n \"PARKING\",\n \"TRASH, RECYCLING, AND WASTE\",\n \"STREETS, SIDEWALKS, AND PARKS\"\n]\n\n// Every separate dataset is processed in a separate enclosing scope\nlet id = 0 // used as a unique identifier for every feature\nhexes.features.forEach((feature, featureIndex) => {\n // Mapbox doesn't like nested objects; flatten them to e.g. census_b07001057\n // Note that this doesn't iterate to a fixed-point; it de-nests objects one level.\n // featureIndex == 0 && console.log(\"props\", feature.properties)\n\n feature.properties = flattenNestedObjects(feature.properties)\n feature.id = ++id // label every feature with a positive (truthy) integer for tracking hovers by id\n feature.code = h3Geocode(feature, H3_LEVEL)\n\n // Issue Density Map\n {\n let b311_issue_count = issue_density_map[feature.code] || MISSING\n\n // Total population in this census geometry\n // https://www.socialexplorer.com/data/ACS2007/metadata/?ds=ACS07&var=B01003001\n let total_population = feature.properties.census_b01003001\n let census_area = feature.properties.census_area\n let hex_area = feature.properties._area\n // note: this can be >1 if the census geometry is smaller than the hexagon.\n // we clip it to 1 as discussed March 20 2019.\n let proportion_of_census_geometry_in_hex = Math.min(\n 1,\n hex_area / census_area\n )\n // Population count estimate for the hex bin\n let hex_population =\n total_population * proportion_of_census_geometry_in_hex\n\n // Compute a smoothed issues-per-population\n // if total_population === 0 we can gray these out, or define them as zero\n feature.properties.issues_normalized_by_population =\n hex_population === 0 || b311_issue_count === MISSING\n ? MISSING\n : smooth(b311_issue_count, hex_population, 0, 50)\n\n feature.properties.b311_issue_count = b311_issue_count\n feature.properties.total_population = total_population\n feature.properties.census_area = census_area\n feature.properties.hex_area = hex_area\n feature.properties.proportion_of_census_geometry_in_hex = proportion_of_census_geometry_in_hex\n feature.properties.hex_population = hex_population\n }\n\n // Most Common Issues\n {\n CATEGORY_NAMES.forEach(c => {\n feature.properties[\"category_ratio_\" + c] = category_counts[c][\n feature.code\n ]\n ? category_counts[c][feature.code].ratio\n : MISSING // 1.0 // Treat missing as 1.\n })\n }\n\n // Timeliness\n {\n feature.properties.on_time_pc_smoothed =\n feature.code in time_data\n ? time_data[feature.code].on_time_pc_smoothed\n : MISSING\n feature.properties.pc_unclosed_smoothed =\n feature.code in unclosed_data\n ? unclosed_data[feature.code].pc_unclosed_smoothed\n : MISSING\n feature.properties.b311_unclosed_issue_count =\n feature.code in unclosed_data\n ? unclosed_data[feature.code].count\n : MISSING\n }\n\n // Scoring\n {\n const fp = feature.properties\n\n // https://drive.google.com/file/d/0B5xorwVOSRdXbGxHMHlabHlVM3c/view\n // average score of sidewalk quality; we invert (1-) so that this denotes the % of sidewalk that needs maintenance.\n fp.sidewalk_score = 1 - fp.sidewalks_area_score / fp.sidewalks_area / 100\n // number of overlapping walksheds; higher = more walkable\n fp.walkability_score = fp._count\n // social need score; higher = more social need\n fp.social_need_score =\n // 0.70 * % of population below poverty level\n 0.70 * (fp.census_b17020002 / fp.census_b17020001) +\n // 0.15 * % of 65-year old+ population\n 0.15 *\n ((fp.census_b01001020 +\n fp.census_b01001021 +\n fp.census_b01001022 +\n fp.census_b01001023 +\n fp.census_b01001024 +\n fp.census_b01001025 +\n fp.census_b01001044 +\n fp.census_b01001045 +\n fp.census_b01001046 +\n fp.census_b01001047 +\n fp.census_b01001048 +\n fp.census_b01001049) /\n fp.census_b01001001) +\n // 0.15 * % of households with children below age 6\n 0.15 *\n ((fp.census_b11004004 +\n fp.census_b11004011 +\n fp.census_b11004017) /\n fp.census_b11004001)\n }\n\n CODE_TO_FEATURE[feature.code] = feature\n})\n\n// Normalize all scores to [0, 1]\nlet max_sidewalk_score = d3.max(hexes.features, d => d.properties.sidewalk_score)\nlet max_walkability_score = d3.max(\n hexes.features,\n d => d.properties.walkability_score\n)\nlet max_social_need_score = d3.max(\n hexes.features,\n d => d.properties.social_need_score\n)\nhexes.features.forEach(feature => {\n let fp = feature.properties\n // Normalize scores to [0, 1]\n fp.sidewalk_score /= max_sidewalk_score\n fp.walkability_score /= max_walkability_score\n fp.social_need_score /= max_social_need_score\n\n // If any score is missing, make all scores missing\n if (\n Number.isNaN(fp.sidewalk_score) ||\n Number.isNaN(fp.walkability_score) ||\n Number.isNaN(fp.social_need_score)\n ) {\n fp.sidewalk_score = MISSING\n fp.walkability_score = MISSING\n fp.social_need_score = MISSING\n }\n})\n\nhexes.features = hexes.features.filter(\n d => !(\n d.properties.sidewalk_score === MISSING &&\n d.properties.walkability_score === MISSING &&\n d.properties.social_need_score === MISSING &&\n d.properties.b311_issue_count === MISSING &&\n d.properties.on_time_pc_smoothed === MISSING\n )\n)\n\nexport const mean_sidewalk_score = d3.mean(hexes.features, d => d.properties.sidewalk_score)\nexport const mean_walkability_score = d3.mean(hexes.features, d => d.properties.walkability_score)\nexport const mean_social_need_score = d3.mean(hexes.features, d => d.properties.social_need_score)\n\n","import mapboxgl from \"mapbox-gl\"\nimport mapboxToken from \"./mapbox-token.js\"\nimport React, {useState, useEffect, useRef} from \"react\"\nimport * as d3 from \"d3\"\nimport * as h3 from \"h3-js\"\nimport pin from \"./res/img/pin.png\"\nimport labels from \"./res/img/Labels.svg\"\nimport * as City_of_Boston_Boundary from \"./res/data/City_of_Boston_Boundary.json\"\nimport {h3Geocode, lngLat, H3_LEVEL, CODE_TO_FEATURE} from \"./data.js\"\n\nmapboxgl.accessToken = mapboxToken\n\nconst DEFAULT_COLOR = \"rgba(255,255,255,0.15)\"\nconst params = new URL(document.baseURI).searchParams\n\nconst labelsAreHere = [42.330158, -71.083664].reverse() // center of the figma layers image, Elizabeth's version, default fonts\n\nconst youAreHere =\n params.has(\"lng\") && params.has(\"lat\")\n ? [+params.get(\"lng\"), +params.get(\"lat\")]\n : [42.330158, -71.083664].reverse() \n\nconst youAreHereZoom = 15\n\nconst bostonCenter = [-71.083664, 42.330158]\nconst bostonZoom = 11.2\nconst mapClickZoom = 13\n\nconst markerImg = src => {\n let img = document.createElement(\"img\")\n img.src = src\n img.style.width = \"64px\"\n img.style.transform = \"translate(-50%, -100%)\"\n return img\n}\n\nconst labelImg = src => {\n let img = document.createElement(\"img\")\n img.className = \"label-img-marker\"\n img.src = src\n img.style.width = `${1156 / 2}px`\n img.style.transform = \"translate(-50%, -100%)\"\n return img\n}\n\n// Used to fill hexagons on the tradeoff screen\nconst mapboxFillComposition = (features, properties, composition, color) => {\n let nstops = 10\n let extent = d3.extent(color.domain())\n let scale = d3\n .scaleLinear()\n .domain([0, 1])\n .range(extent)\n\n let scores = features\n .map(\n d =>\n d.properties[properties[0]] * composition[0] +\n d.properties[properties[1]] * composition[1] +\n d.properties[properties[2]] * composition[2]\n )\n .filter(d => !Number.isNaN(d))\n .sort()\n\n let q = d3.quantile(scores, 0.97) // highlight the top percentile\n\n let [pc_1, pc_2, pc_3] = composition\n let expr = [\n \"case\",\n [\"==\", null, [\"get\", properties[0]]],\n DEFAULT_COLOR,\n\n [\n \"interpolate\",\n [\"linear\"],\n [\n \"+\",\n [\"*\", pc_1, [\"get\", properties[0]]],\n [\"*\", pc_2, [\"get\", properties[1]]],\n [\"*\", pc_3, [\"get\", properties[2]]]\n ],\n ...d3.range(nstops).flatMap(d => {\n let pc = d / (nstops - 1)\n let s = scale(pc)\n return s < q ? [s, color(scale(pc))] : []\n }),\n\n // highlight the top cells to show the distribution of where needs would be addressed\n q - 0.01,\n color(scale(q - 0.01)),\n q,\n \"#FCFF61\"\n ]\n ]\n return expr\n}\n\n// Regular data-based hexagon fill\nconst mapboxFill = (features, property, color) => {\n // Given a list of features, a property, and a color scale,\n // return a mapbox-compatible fill specification.\n let nstops = 10\n let extent = d3.extent(color.domain()) // d3.extent(features, d => d.properties[property])\n let scale = d3\n .scaleLinear()\n .domain([0, 1])\n .range(extent)\n\n return {\n property,\n stops: d3.range(nstops).map(d => {\n let pc = d / (nstops - 1)\n return [scale(pc), color(scale(pc))]\n }),\n default: DEFAULT_COLOR\n }\n}\n\nlet markerInstance;\nexport const Map = ({\n showNeighborhoods,\n hexes,\n property,\n color,\n opacity,\n fadeOpacity,\n stroke,\n showYouAreHere,\n onHover,\n onUnhover,\n composition,\n sectionIndex,\n clickZoomable\n}) => {\n let container = useRef(null)\n let [map, setMap] = useState(null)\n let [mapReady, setMapReady] = useState(false)\n\n let features = hexes.features\n\n const youAreHereMarker = new mapboxgl.Marker(markerImg(pin), {\n offset: {\n x: 0,\n y: -10\n }\n }).setLngLat(youAreHere)\n\n const labelMarker = new mapboxgl.Marker(labelImg(labels), {\n offset: {\n x: 0,\n y: -10\n }\n }).setLngLat(labelsAreHere)\n\n let topLayer = \"water-point-label\"\n\n // Set map state when the map is loaded\n useEffect(() => {\n let map = new mapboxgl.Map({\n container: container.current,\n style: \"mapbox://styles/johnnycrich/cjvwv51ii27h21cmue64bauc7\",\n center: bostonCenter,\n zoom: bostonZoom,\n interactive: false\n })\n\n map.on(\"load\", () => {\n // Move the fade layer up to the top. There doesn't\n // appear to be a way to do this from within Mapbox Studio\n map.moveLayer(\"fade\", topLayer)\n\n // Mapbox is bad at updating the local when the style has changed...\n // Move the neighborhood layer into oblivion.\n // map.setLayoutProperty(\"settlement-subdivision-label\", \"visibility\", \"none\")\n\n map.addSource(\"boston-boundary\", {\n type: \"geojson\",\n data: City_of_Boston_Boundary.default,\n maxzoom: Math.ceil(youAreHereZoom),\n buffer: 64 // default: 128\n })\n\n // Add an initial static hexbin GeoJSON for testing\n map.addSource(\"hexes\", {\n type: \"geojson\",\n data: hexes,\n maxzoom: Math.ceil(youAreHereZoom),\n buffer: 64 // default: 128\n })\n\n map.addSource(\"youAreHere\", {\n type: \"geojson\",\n data: {\n type: \"Point\",\n coordinates: youAreHere\n }\n })\n\n let hexBefore = topLayer\n\n map.addLayer(\n {\n id: \"boston-boundary-stroke\",\n type: \"line\",\n source: \"boston-boundary\",\n paint: {\n \"line-color\": \"#A6B3BC\",\n \"line-width\": 0.75,\n \"line-opacity\": 0.75\n }\n },\n hexBefore\n )\n\n map.addLayer(\n {\n id: \"boston-boundary-fill\",\n type: \"fill\",\n source: \"boston-boundary\",\n paint: {\n \"fill-color\": \"#A6B3BC\",\n \"fill-opacity\": 0.15\n }\n },\n hexBefore\n )\n\n map.addLayer(\n {\n id: \"hex-fills\",\n type: \"fill\",\n source: \"hexes\",\n transition: {\n duration: 500, // match css fade transitions\n delay: 0\n },\n paint: {\n \"fill-opacity\": 0\n }\n },\n hexBefore\n )\n\n map.addLayer(\n {\n id: \"hex-strokes\",\n type: \"line\",\n source: \"hexes\",\n transition: {\n duration: 500, // match css fade transitions\n delay: 0\n },\n paint: {\n \"line-color\": \"#A6B3BC\",\n // some hex outlines don't overlap, leading to visible artifacts.\n // set the color to off-white rather than using white + opacity.\n \"line-opacity\": 0,\n \"line-width\": 0.75\n // \"line-width\": 1.5,\n }\n },\n hexBefore\n )\n\n map.addLayer(\n {\n id: \"blip\",\n source: \"youAreHere\",\n type: \"circle\",\n paint: {\n \"circle-radius\": 0,\n \"circle-radius-transition\": {\n duration: 0\n },\n \"circle-opacity-transition\": {\n duration: 0\n },\n \"circle-color\": \"#4C85AA\"\n }\n },\n hexBefore\n )\n\n map.addLayer(\n {\n id: \"hex-hovers\",\n type: \"fill\",\n source: \"hexes\",\n transition: {\n duration: 500, // match css fade transitions\n delay: 0\n },\n\n paint: {\n \"fill-color\": \"#000\",\n \"fill-opacity\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"hover\"], false],\n 0.35,\n 0\n ]\n }\n },\n hexBefore\n )\n\n if(showYouAreHere) \n markerInstance = youAreHereMarker.addTo(map)\n\n labelMarker.addTo(map)\n })\n\n let hoveredHexCodes = []\n\n // When the user moves their mouse over the hex-hovers layer, we'll update the\n // feature state for the feature under the mouse.\n map.on(\"mousemove\", \"hex-hovers\", e => {\n if (e.features.length > 0) {\n // Trigger outside events based on mouse interactions.\n // Note: This may trigger unhover-hover in sequence for some hexagons\n\n onUnhover(hoveredHexCodes.map(code => CODE_TO_FEATURE[code]))\n\n hoveredHexCodes.forEach(code =>\n map.setFeatureState(\n {source: \"hexes\", id: CODE_TO_FEATURE[code].id},\n {hover: false}\n )\n )\n\n let code = h3Geocode(e.features[0], H3_LEVEL)\n hoveredHexCodes = h3\n .kRing(code, H3_LEVEL > 9 ? 2 : 1)\n .filter(code => code in CODE_TO_FEATURE)\n\n hoveredHexCodes.forEach(code => {\n map.setFeatureState(\n {source: \"hexes\", id: CODE_TO_FEATURE[code].id},\n {hover: true}\n )\n })\n\n onHover(hoveredHexCodes.map(code => CODE_TO_FEATURE[code]))\n }\n })\n\n // When the mouse leaves the hex-fill layer, update the feature state of the\n // previously hovered feature.\n map.on(\"mouseleave\", \"hex-hovers\", () => {\n onUnhover(hoveredHexCodes.map(code => CODE_TO_FEATURE[code]))\n\n hoveredHexCodes.forEach(code =>\n map.setFeatureState(\n {source: \"hexes\", id: CODE_TO_FEATURE[code].id},\n {hover: false}\n )\n )\n hoveredHexCodes.length = 0\n })\n\n setMapReady(false)\n setMap(map)\n\n // this is questionable but the best way I've discovered thus far\n // to reliably check for the style being loaded and the map ready for use.\n map.on(\"idle\", e => {\n setMapReady(map.isStyleLoaded())\n })\n\n return () => {\n map.remove()\n }\n }, [container])\n\n useEffect(() => {\n let animating = true\n\n let flip = true\n let fn = e => {\n clickZoomable &&\n map.flyTo({\n center: flip ? lngLat(e.features[0]).reverse() : bostonCenter,\n zoom: flip ? mapClickZoom : bostonZoom,\n bearing: 0,\n speed: 0.75\n })\n flip = !flip\n }\n\n if (mapReady) {\n let target, targetZoom\n\n // Make this the default with || true; that way you can skip around sections with no problem.\n if (\n sectionIndex === null ||\n sectionIndex === 2 ||\n sectionIndex === 5 ||\n true\n ) {\n target = bostonCenter\n targetZoom = bostonZoom\n }\n\n if (sectionIndex === 0 || sectionIndex === 1) {\n target = youAreHere\n targetZoom = youAreHereZoom\n }\n \n // this is not caching as a Marker instance for some reason, so use dom accessor which works fine\n // remove pin after first step\n // if (sectionIndex > 0)\n markerInstance['_element'].style.display = (sectionIndex > 0 && !showYouAreHere) ? 'none' : 'block'\n // else if(showYouAreHere === true)\n // markerInstance['_element'].style.display = 'block' \n\n console.log(showYouAreHere)\n \n if (target && targetZoom) {\n map.flyTo({\n // These options control the ending camera position: centered at\n // the target, at zoom level 9, and north up.\n center: target,\n zoom: targetZoom,\n bearing: 0,\n offset: [300, -100],\n // These options control the flight curve, making it move\n // slowly and zoom out almost completely before starting\n // to pan.\n speed: 0.75 // 0.4 // make the flying slow\n // curve: 1, // change the speed at which it zooms out\n })\n }\n\n if (composition) {\n let properties = [\n \"sidewalk_score\",\n \"walkability_score\",\n \"social_need_score\"\n ]\n map.setPaintProperty(\n \"hex-fills\",\n \"fill-color\",\n mapboxFillComposition(features, properties, composition, color)\n )\n } else {\n map.setPaintProperty(\n \"hex-fills\",\n \"fill-color\",\n mapboxFill(features, property, color)\n )\n }\n\n map.setPaintProperty(\"fade\", \"background-opacity\", fadeOpacity)\n map.setPaintProperty(\n \"hex-fills\",\n \"fill-opacity\",\n Math.max(0.01, opacity)\n )\n map.setPaintProperty(\"hex-strokes\", \"line-opacity\", stroke ? 1 : 0)\n map.setLayoutProperty(\n \"hex-hovers\",\n \"visibility\",\n opacity > 0 ? \"visible\" : \"none\"\n )\n\n map.on(\"click\", \"hex-fills\", fn)\n\n let blipStartTime = performance.now()\n let frame = timestamp => {\n let s = 2 * ((timestamp - blipStartTime) / 1000) + Math.PI / 2\n // console.log(t - blipTime)\n let radius = 10 + 5 * Math.sin(s)\n let opacity = Math.max(0, Math.cos(s))\n // console.log('radius', radius, 'opacity', opacity)\n map.setPaintProperty(\"blip\", \"circle-radius\", radius)\n map.setPaintProperty(\"blip\", \"circle-opacity\", opacity)\n animating && requestAnimationFrame(frame)\n }\n\n requestAnimationFrame(frame)\n }\n\n return () => {\n animating = false\n map && map.off(\"click\", \"hex-fills\", fn)\n }\n }, [\n showNeighborhoods,\n features,\n property,\n color,\n fadeOpacity,\n opacity,\n stroke,\n showYouAreHere,\n mapReady,\n composition,\n sectionIndex,\n clickZoomable\n ])\n\n return (\n
\n
\n
\n )\n}\n","import React from \"react\"\nimport * as d3 from \"d3\"\nimport * as _ from \"lodash\"\nimport {categories, type_counts, CATEGORY_NAMES, H3_LEVEL} from \"./data.js\"\nimport {titleCase} from \"./utils.js\"\n\nexport const moduleName = \"311\"\n\nexport const sectionOrder = [\n \"mapOfBoston\",\n \"introHex\",\n \"issueDensityMap\",\n \"mostCommonIssues\",\n \"timeliness\",\n \"conclusions\"\n]\n\nlet divergingLogScale = d3\n .scaleDivergingLog(\n // Modulate the fixed scale for the given hex size to a range that display reasonable variation\n [0.75, 1, 1.5],\n d3.interpolateRdPu\n )\n .base(2)\n .clamp(true)\n\nconst groupedByCategory = _.groupBy(categories, d => d.category)\nconst categoryTypeSubtitle = _.fromPairs(\n CATEGORY_NAMES.map(d => [\n d,\n _.sortBy(groupedByCategory[d].map(d => d.type), t => -type_counts[t])\n .slice(0, 7)\n .join(\" • \")\n ])\n)\n\nexport const sections = {\n mapOfBoston: {\n buttonTitle: \"A Map of Boston\",\n body: () => (\n
\n

A Map of Boston

\n
Our city and its places
\n \n

\n First, let’s orient ourselves by looking at this map of Boston.\n

\n
\n ),\n defaultState: features => {\n let property = \"issues_normalized_by_population\"\n let format = d3.format(\"d\")\n return {\n property,\n color: Object.assign(\n d => \"transparent\",\n d3.scaleSequential(\n d3.extent(features, d => d.properties[property]),\n d3.interpolatePlasma\n )\n ),\n opacity: 0,\n legendFormat: d => format(100 * d)\n }\n }\n },\n\n introHex: {\n buttonTitle: \"Into The Hex Grid\",\n body: () => (\n
\n

311 Data

\n
From points to hexagons
\n \n\n

\n Boston’s 311 data includes over 200,000 reports in just the last two years. \n

\n

\n To make patterns in that data easier to see, we have grouped those reports into the hexagons you see on the maps in this tool.\n

\n\n
\n ),\n defaultState: features => {\n let property = \"issues_normalized_by_population\"\n return {\n property,\n color: Object.assign(\n d => \"transparent\",\n d3.scaleSequential(\n d3.extent(features, d => d.properties[property]),\n d3.interpolatePlasma\n )\n ),\n stroke: true,\n opacity: 0,\n legendFormat: d3.format(\"d\")\n }\n }\n },\n\n issueDensityMap: {\n buttonTitle: \"Where Are the Reports?\",\n hoverInfo: ({hoverFeatures, sectionState}) => {\n let round = d3.format(\".2f\")\n // note: Averaging the smoothed means is a very strange operation, since the amount of data\n // that went into each hex estimate may be very different. A better way to do this is to go\n // back to the source data and perform averaging on the aggregated raw values. But this is\n // close enough for now.\n let mean = d3.mean(hoverFeatures.map(d => d.properties[sectionState.property]))\n let sum = d3.sum(hoverFeatures.map(d => d.properties[sectionState.property]))\n if (mean === undefined) {\n return
\n }\n let format = d3.format(\",.0f\")\n let showingIssues = sectionState.property === \"issues_normalized_by_population\"\n\n return (\n
\n {showingIssues && (\n
\n {format(100 * mean)} issues per 100 people here.\n
\n )}\n {!showingIssues && (\n
\n {format(sum)} people live here.\n
\n )}\n
\n )\n },\n body: ({features, sectionState, setSectionState, hexes, property, color}) => {\n let showingIssues = sectionState.property === \"issues_normalized_by_population\"\n let format = d3.format(\"d\")\n\n let linkClick = () => {\n let property = showingIssues\n ? \"hex_population\"\n : \"issues_normalized_by_population\"\n let domain = showingIssues ? d3.extent(hexes.features, d => d.properties[property]) : [0, 2]\n setSectionState(\n Object.assign({}, sectionState, {\n property,\n color: d3.scaleSequential(domain, d3.interpolatePlasma),\n })\n )\n }\n\n return (\n
\n

Where Are the Reports?

\n
Where people report most
\n \n\n

\n The map is colored based on the number of 311 reports per 100 people living in each hexagon. Mouse over the map to see the data for groups of hexagons.\n

\n

\n Right now, the map is showing reports per person. See population density instead?\n

\n

\n Right now, the map is\n {showingIssues\n ? [\" showing reports per person. \", See population density instead?]\n : [\" showing population density. \", See reports per person instead?]}\n

\n
\n )\n },\n defaultState: features => {\n let property = \"issues_normalized_by_population\"\n let format = d3.format(\",.0d\")\n return {\n property,\n color: d3.scaleSequential(\n // clip off at the high end; the data currently goes to 6 but this way\n // we keep a linear scale while seeing variation in the range we care about\n [0, 2],\n d3.interpolatePlasma\n ),\n opacity: 1,\n legendFormat: d => format(100 * d),\n }\n }\n },\n\n mostCommonIssues: {\n buttonTitle: \"What’s Happening?\",\n hoverInfo: ({hoverFeatures, sectionState}) => {\n let mean = d3.mean(hoverFeatures.map(d => d.properties[sectionState.property]))\n if (mean === undefined) {\n return
\n }\n let round = d3.format(\".2f\")\n let percent = d3.format(\".0%\")\n let pc = percent(Math.abs(mean - 1))\n\n return (\n
\n
\n = 1 ? \"more\" : \"less\"}>\n {pc.length === 2 ? 0 : \"\"}\n {pc} {mean >= 1 ? \"more than average\" : \"less than average\"}\n {\" \"}\n issues related to {sectionState.category.toLowerCase()}.\n
\n
\n )\n },\n body: ({sectionState, setSectionState}) => {\n return (\n
\n

What’s Happening?

\n
\n The most common reports by place\n
\n \n\n

\n This map colors the hexagons based on whether a category is reported more or less than average. Green means higher than average reporting, and purple means lower than average. Click the categories below to see which places report different categories.\n

{\" \"}\n {CATEGORY_NAMES.map(c => (\n \n setSectionState(\n Object.assign({}, sectionState, {\n category: c,\n property: `category_ratio_${c}`,\n color: divergingLogScale\n })\n )\n }>\n
{titleCase(c)}
\n {sectionState.category === c && (\n
{categoryTypeSubtitle[c]}
\n )}\n
\n ))}\n
\n )\n },\n defaultState: features => ({\n category: CATEGORY_NAMES[0],\n property: `category_ratio_${CATEGORY_NAMES[0]}`,\n color: divergingLogScale,\n opacity: 1,\n legendFormat: d3.format(\".0%\")\n })\n },\n\n timeliness: {\n buttonTitle: \"Timeliness\",\n hoverInfo: ({hoverFeatures, sectionState}) => {\n let mean = d3.mean(hoverFeatures.map(d => d.properties[sectionState.property]))\n if (mean === undefined) {\n return
\n }\n let round = d3.format(\".2f\")\n let percent = d3.format(\".0%\")\n let pc = percent(mean)\n\n return (\n
\n
\n {pc} of issues are addressed on time here.\n
\n
\n )\n },\n body: () => (\n
\n

Timeliness

\n
How long until issues are resolved?
\n\n

\n Reports are routed to relevant city departments. But, reports can be quite different. Some (shoveling snow) are time-sensitive and relatively low-effort, while others (tree removal) need to be scheduled in advance. And, for reports on private or federal property, the City of Boston cannot respond.\n

\n

\n This map shows how often reports of parking, trash pickup, and abandoned vehicles are addressed on-time.\n

\n
\n ),\n defaultState: features => {\n let property = \"on_time_pc_smoothed\"\n return {\n property,\n color: d3.scaleSequential(\n d3.extent(features, d => d.properties[property]),\n d3.interpolatePlasma\n ),\n opacity: 1,\n legendFormat: d3.format('.0%'),\n }\n }\n },\n\n conclusions: {\n buttonTitle: \"Conclusions\",\n body: () => (\n
\n

Conclusions

\n
\n 311 data can tell us what is happening, where it’s happening, and how long it takes to fix. \n
\n\n

\n Does this 311 data match your own experience of Boston’s places?\n

\n

\n How do you think the maps might be different if all Bostonians reported their problems? \n

\n

\n How do you imagine 311 data could help us make better decisions as a city?\n

\n
\n ),\n defaultState: features => {\n let property = \"issues_normalized_by_population\"\n return {\n property,\n color: Object.assign(\n d => \"transparent\",\n d3.scaleSequential(\n d3.extent(features, d => d.properties[property]),\n d3.interpolatePlasma\n )\n ),\n opacity: 0,\n legendFormat: d3.format(\"d\"),\n stroke: true,\n }\n }\n }\n}\n\nexport const appIntro = (\n <>\n

Exploring Boston’s Issues,
Block-by-Block

\n
What do Bostonians see and report?
\n
\n

Boston 311 lets people report things to the city. What does that 311 data say about your neighborhood?

\n\n
\n \n)\n","export function titleCase(str) {\n str = str.toLowerCase().split(' ');\n for (var i = 0; i < str.length; i++) {\n str[i] = str[i].charAt(0).toUpperCase() + str[i].slice(1);\n }\n return str.join(' ');\n}\n\n","import React, {useCallback} from \"react\"\nimport * as d3 from \"d3\"\nimport * as _ from \"lodash\"\nimport {\n mean_sidewalk_score,\n mean_walkability_score,\n mean_social_need_score\n} from \"./data.js\"\nimport {titleCase} from \"./utils.js\"\n\n// sidewalk_score\n// walkability_score\n// social_need_score\nconst makeComposition = arr => {\n let max = d3.sum(arr)\n return arr.map(d => d / max)\n}\n\nexport const moduleName = \"scoring\"\n\nexport const sectionOrder = [\n \"mapOfBoston\",\n \"introHex\",\n \"firstThing\",\n \"secondThing\",\n \"thirdThing\",\n \"allThreeThings\"\n]\n\nconst propHoverInfo = ({hoverFeatures, sectionState}) => {\n let name = {\n sidewalk_score: \"sidewalk score\",\n walkability_score: \"walkability score\",\n social_need_score: \"social need score\"\n }[sectionState.property]\n\n let meanScore = {\n sidewalk_score: mean_sidewalk_score,\n walkability_score: mean_walkability_score,\n social_need_score: mean_social_need_score\n }[sectionState.property]\n\n let value = d3.mean(hoverFeatures.map(d => d.properties[sectionState.property]))\n if (value === undefined) {\n return null\n }\n let round = d3.format(\".2f\")\n let percent = d3.format(\".0%\")\n\n let thing = value / meanScore\n console.log(\"value\", value, \"meanScore\", meanScore, \"thing\", thing)\n let pc = percent(Math.abs(thing - 1))\n let pcLabel = (\n \n {pc.length === 2 ? 0 : \"\"}\n {pc}\n \n )\n\n let caption\n switch (sectionState.property) {\n case \"sidewalk_score\":\n caption = (\n \n = 1 ? \"less\" : \"more\"}>\n {pcLabel} {thing >= 1 ? \"worse\" : \"better\"}\n {\" \"}\n than the average condition.\n \n )\n break\n case \"walkability_score\":\n caption = (\n \n = 1 ? \"more\" : \"less\"}>\n {pcLabel} {thing >= 1 ? \"more\" : \"less\"}\n {\" \"}\n walkable than average.\n \n )\n break\n case \"social_need_score\":\n caption = (\n \n = 1 ? \"more\" : \"less\"}>\n {pcLabel} {thing >= 1 ? \"more\" : \"less\"}\n {\" \"}\n social need than average.\n \n )\n break\n }\n return (\n
\n
\n {caption}\n
\n
\n )\n}\n\nexport const sections = {\n mapOfBoston: {\n buttonTitle: \"A Map of Boston\",\n body: () => (\n
\n

A Map of Boston

\n
Our city and its places
\n

\n First, let’s orient ourselves by looking at this map of Boston.\n

\n
\n ),\n defaultState: features => {\n let property = \"issues_normalized_by_population\"\n let format = d3.format(\"d\")\n return {\n property,\n color: Object.assign(\n d => \"transparent\",\n d3.scaleSequential(\n d3.extent(features, d => d.properties[property]),\n d3.interpolateRdPu\n )\n ),\n opacity: 0,\n legendFormat: d => format(100 * d)\n }\n }\n },\n\n introHex: {\n buttonTitle: \"Sidewalk, Walkability, and Social Need Data\",\n body: () => (\n
\n

Sidewalk, Walkability, and Social Need Data

\n
From points to hexagons
\n\n

\n We’ll use three data sets to decide where to fix sidewalks. \n

\n

\n That is a lot of data. To make patterns in that data easier to see, we have included the data from all three data sets, grouped into the hexagons you see on the maps in this tool.\n

\n
\n ),\n defaultState: features => {\n let property = \"issues_normalized_by_population\"\n return {\n property,\n color: Object.assign(\n d => \"transparent\",\n d3.scaleSequential(\n d3.extent(features, d => d.properties[property]),\n d3.interpolateRdPu\n )\n ),\n stroke: true,\n opacity: 0,\n legendFormat: d3.format(\"d\")\n }\n }\n },\n\n firstThing: {\n buttonTitle: \"Scoring Sidewalks\",\n hoverInfo: propHoverInfo,\n body: ({features, sectionState, setSectionState, hexes, property, color}) => {\n return (\n
\n

Scoring Sidewalks

\n
Where are sidewalks in need of repair?
\n\n

\n This map shows where sidewalks in Boston need repairs.\n

\n\n

\n The darker the hexagon, the worse its sidewalks are.\n

\n
\n )\n },\n defaultState: features => {\n let property = \"sidewalk_score\"\n return {\n property,\n color: d3.scaleSequential(\n [0, 1],\n d3.interpolateReds\n ),\n opacity: 1,\n legendFormat: d3.format(\".0%\")\n }\n }\n },\n\n secondThing: {\n buttonTitle: \"Scoring Walkability\",\n hoverInfo: propHoverInfo,\n body: ({features, sectionState, setSectionState, hexes, property, color}) => {\n return (\n
\n

Scoring Walkability

\n
Where are sidewalks used most?
\n\n

\n This map shows shops, hospitals, schools, transit stops, and other destinations that make a place accessible and walkable. \n

\n

\n The darker the hexagon, the more destinations it has, and the more its sidewalks are used. \n

\n
\n )\n },\n defaultState: features => {\n let property = \"walkability_score\"\n return {\n property,\n color: d3.scaleSequential([0, 1], d3.interpolateBlues),\n opacity: 1,\n legendFormat: d3.format(\".0%\")\n }\n }\n },\n\n thirdThing: {\n buttonTitle: \"Scoring Social Need\",\n hoverInfo: propHoverInfo,\n body: () => (\n
\n

Scoring Social Need

\n
\n Where are sidewalks needed the most?\n
\n\n

\n This map shows where households are in poverty, and where children and older populations live. These groups need sidewalks because driving and public transit might be unaffordable or inaccessible for them. \n

\n

\n How would you determine social need? \n

\n

\n The darker the hexagon, the larger the population of people needing sidewalks. \n

\n
\n ),\n defaultState: features => {\n let property = \"social_need_score\"\n return {\n property,\n color: d3.scaleSequential(\n d3.extent(features, d => d.properties[property]),\n d3.interpolateGreens\n ),\n opacity: 1,\n legendFormat: d3.format(\".0%\")\n }\n }\n },\n\n allThreeThings: {\n buttonTitle: \"Tradeoffs\",\n hoverInfo: ({hoverFeatures, sectionState}) => null,\n body: ({sectionState, setSectionState}) => {\n let {composition} = sectionState\n let round = d3.format(\".0%\")\n\n return (\n
\n

Tradeoffs

\n
\n Data and decisions\n
\n

\n How might we combine sidewalk, walkability, and social need scores to decide which sidewalks to repair first? Drag the white circle to change the importance of each data set, and watch the map update priority hexagons in yellow\n

\n\n {composition && (\n
\n

\n

\n {round(composition[2])} social need\n
{\" \"}\n +{\" \"}\n
\n {round(composition[1])} walkability\n
{\" \"}\n +{\" \"}\n
\n {round(composition[0])} sidewalk\n
\n

\n\n {\n setSectionState(Object.assign({}, sectionState, {composition}))\n },\n 250,\n {leading: true}\n )}\n />\n
\n )}\n
\n )\n },\n defaultState: features => {\n let property = `tradeoff_score`\n return {\n property,\n color: d3.scaleSequential([0, 1], d3.interpolateViridis),\n opacity: 1,\n legendFormat: d3.format(\".0%\"),\n composition: [0.1, 0.1, 0.8]\n }\n }\n }\n}\n\nconst triArea = (a, b, c) => {\n let [xa, ya] = a,\n [xb, yb] = b,\n [xc, yc] = c\n return 0.5 * (xa * yb + xb * yc + xc * ya - xa * yc - xc * yb - xb * ya)\n}\n\nlet TriangleSlider = ({composition, onChange}) => {\n let areaGen = d3.area()\n let R = 40\n let {PI, sin, cos, sqrt, abs, pow, max} = Math\n let pi = PI,\n twopi = 2 * PI,\n halfpi = PI / 2\n let o = -halfpi\n let a = [cos(o), sin(o)]\n let b = [cos(o + twopi / 3), sin(o + twopi / 3)]\n let c = [cos(o + (2 * twopi) / 3), sin(o + (2 * twopi) / 3)]\n let pathData = areaGen([a, b, c, a])\n\n let event = p => {\n let total = triArea(a, b, c)\n let areas = makeComposition(\n [triArea(b, c, p), triArea(c, a, p), triArea(a, b, p)].map(\n area => max(0, area) / total\n )\n )\n onChange(areas)\n return areas\n }\n\n const triRef = useCallback(node => {\n if (node !== null) {\n let _node = d3.select(node)\n let dragged = () => {\n // [d3.event.x / R, d3.event.y / R]\n let areas = event(d3.mouse(node, node.parentElement))\n // todo: set the circle position immediately\n let x = R * d3.sum([a[0] * areas[0], b[0] * areas[1], c[0] * areas[2]])\n let y = R * d3.sum([a[1] * areas[0], b[1] * areas[1], c[1] * areas[2]])\n circleRefCurrent &&\n d3\n .select(circleRefCurrent)\n .attr(\"cx\", x)\n .attr(\"cy\", y)\n }\n _node.call(\n d3\n .drag()\n .on(\"drag\", dragged)\n .on(\"start\", dragged)\n )\n }\n }, [])\n\n let circleRefCurrent = null\n const circleRef = useCallback(node => {\n if (node !== null) {\n circleRefCurrent = node\n }\n }, [])\n\n let areas = composition\n let x = R * d3.sum([a[0] * areas[0], b[0] * areas[1], c[0] * areas[2]])\n let y = R * d3.sum([a[1] * areas[0], b[1] * areas[1], c[1] * areas[2]])\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n {[a, b, c].map(([x, y], i) => (\n \n ))}\n \n )\n}\n\nexport const appIntro = (\n <>\n

Decide Where Change Happens

\n
\n Can data be used for more sensitive decision-making?\n
\n
\n

\n New technologies from sensors to social media are producing more and more data about our cities, neighborhoods, and streets.\n

\n\n

\n When cities make decisions about changing the public realm, they use a variety of data to consider different factors. \n

\n\n

\n If you had to choose where to improve or replace Boston’s sidewalks, how would you do it?\n

\n\n
\n \n)\n","import * as d3 from \"d3\"\nimport React, {useState, useEffect} from \"react\"\nimport legendCoverup from \"./res/img/Legend Coverup.png\"\n\nconst MapLegend = ({hexes, color, property, format, opacity}) => {\n let features = hexes.features\n let nstops = 5\n let extent = d3.extent(color.domain())\n\n let scale = d3\n .scaleLinear()\n .domain([0, 1])\n .range(extent)\n let width = 217, height = 37\n let fontSize = 13\n let observedVsExpected = \"Observed # issues vs. average\"\n const legendLabels = {\n \"hex_population\": \"Population per hexagon\",\n \"sidewalk_score\": \"Sidewalk score\",\n \"walkability_score\": \"Walkability score\",\n \"social_need_score\": \"Social need score\",\n \"tradeoff_score\": \"Your combined score\",\n \"issues_normalized_by_population\": \"# of issues per 100 people\",\n \"total_population\": \"Total population\",\n \"category_ratio_LIVING CONDITIONS\": observedVsExpected,\n \"category_ratio_PARKING\": observedVsExpected,\n \"category_ratio_TRASH, RECYCLING, AND WASTE\": observedVsExpected,\n \"category_ratio_STREETS, SIDEWALKS, AND PARKS\": observedVsExpected,\n \"category_ratio_BUILDING AND CONSTRUCTION\": observedVsExpected,\n \"category_ratio_SNOW\": observedVsExpected,\n \"category_ratio_ANIMALS\": observedVsExpected,\n \"category_ratio_TRANSPORTATION, VEHICLES, AND BICYCLES\": observedVsExpected,\n \"on_time_pc_smoothed\": \"% of on-time issues\",\n }\n\n // A quick last-minute change to prototype transparent hexagons in the conclusion section\n let hideLegend = color(\"anything\") === \"transparent\"\n\n return (hideLegend ?
:\n
\n
\n
{legendLabels[property] || property}
\n
\n \n \n \n \n \n \n \n \n \n \n \n\n \n {d3.range(nstops).map(d => {\n let pc = d / (nstops - 1)\n return (\n \n )\n })}\n \n \n \n\n {format(scale(0))}\n {format(scale(0.5))}\n {format(scale(1))}\n\n \n
\n
\n
\n )\n}\n\nexport default MapLegend","import React, {useState, useEffect} from \"react\"\nimport {Map} from \"./Map.js\"\nimport {appIntro as appIntro311, sections as sections311, sectionOrder as sectionOrder311} from \"./sections_311.js\"\nimport {appIntro as appIntroScoring, sections as sectionsScoring, sectionOrder as sectionOrderScoring} from \"./sections_scoring.js\"\nimport \"mapbox-gl/dist/mapbox-gl.css\"\nimport \"./App.css\"\nimport {hexes, CATEGORY_NAMES} from \"./data.js\"\nimport * as d3 from \"d3\"\nimport MapLegend from \"./MapLegend.js\"\n\nconst MapOverlay = ({children}) => {\n return
{children}
\n}\n\nconst App = () => {\n let features = hexes.features\n // Whether to show the 'hover the map' mesage\n let [hoveredBefore, setHoveredBefore] = useState(false) //\n\n // Make sure to reset the hoveredBefore indicator when the sections reset.\n let [sectionIndex, _setSectionIndex] = useState(null)\n let setSectionIndex = value => {\n // reset the hover indicator every time we go back to the first screen\n if (value == 0 ) {\n setHoveredBefore(false)\n }\n _setSectionIndex(value)\n }\n\n // The module name is '311' or 'scoring'\n let [moduleName, setModuleName] = useState('311')\n\n let sections = {'311': sections311, 'scoring': sectionsScoring}[moduleName]\n let sectionOrder = {'311': sectionOrder311, 'scoring': sectionOrderScoring}[moduleName]\n let section = sections[sectionOrder[sectionIndex || 0]]\n\n // Section state is specified in the individual modules.\n let [sectionState, setSectionState] = useState(() => section.defaultState(features))\n\n // Reset section state when sections change\n useEffect(() => setSectionState(section.defaultState(features)), [sectionIndex])\n\n let {property, color, legendFormat, composition} = sectionState\n let numSections = sectionOrder.length\n\n // The map hover\n let [hoverFeatures, setHoverFeatures] = useState([])\n if (hoverFeatures.length && !hoveredBefore) {\n setHoveredBefore(true)\n }\n\n let appIntro = moduleName == '311' ? appIntro311 : appIntroScoring\n\n return (\n
\n {sectionIndex === null && (\n
\n
\n
{setModuleName('311');}}>Explore 311 Data
\n
{setModuleName('scoring');}}>Explore Decision-making
\n
\n {appIntro}\n\n setSectionIndex(0) }>\n Get Started\n
\n \n \n
\n
\n
\n )}\n\n {sectionIndex !== null && [\n \n\n {section.body({features, sectionState, setSectionState, hexes, property, color})}\n \n ,\n\n\n sectionIndex > 1 && sectionIndex < 5 && (\n \n \n {!hoveredBefore &&
{navigator.platform.match(/i(Phone|Pod)/i) ? \"Tap on\" : \"Hover\"} the map to inspect the data.
}\n {hoverFeatures.length > 0 && section.hoverInfo && section.hoverInfo({hoverFeatures, sectionState})}\n
\n )\n ]}\n\n 1}\n clickZoomable={moduleName == '311' && sectionIndex == 5}\n fadeOpacity={\n sectionIndex !== null && sectionState.fadeOpacity !== undefined\n ? sectionState.fadeOpacity\n : 0.65\n }\n onHover={features => setHoverFeatures(features)}\n onUnhover={features => setHoverFeatures([])}\n />\n
\n )\n} \n\nconst Sidebar = ({children}) =>
{children}
\n\nconst SectionNavigator = ({title, sectionIndex, setSectionIndex, numSections, sectionOrder}) => {\n let activeIf = target => (sectionIndex === target ? \" active\" : \"\")\n \n let lastSection = sectionIndex === numSections - 1\n return (\n
\n \n setSectionIndex(lastSection ? null : (sectionIndex + 1) % numSections)\n }\n className={!lastSection ? \"SectionNavigator-main\" : \"SectionNavigator-main last\"}>\n
\n
\n {lastSection ? \"Back to Beginning\" : title}\n
\n
\n \n
\n
\n
\n
\n {d3.range(sectionOrder.length).map(n => (\n setSectionIndex(n)}\n className={\"SectionNavigator-dot\" + activeIf(n)}\n />\n ))}\n
\n
\n
\n )\n}\n\nconst NextButton = ({flip, onClick}) => (\n
\n \n \n \n
\n)\n\nexport default App\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}