Public
Edited
Feb 28, 2023
1 star
Insert cell
# Portland Map Feb.20 Sample Graphics
Insert cell
portlandBoundary = FileAttachment("Portland Boundary.geojson").json()
Insert cell
sideWater = FileAttachment("side water.geojson").json()
Insert cell
water = FileAttachment("water@1.geojson").json()
Insert cell
d3 = require("d3@6")
Insert cell


chart = {
const width = 700,
height = 600;
const svg = d3.create("svg")
.attr("viewBox", [50, 50, width-120, height-100]);

// Use Mercator projection
var projection = d3
.geoMercator()
.fitSize([width - 60, height - 50], bbox);

var path1 = d3.geoPath().projection(projection);
var path2 = d3.geoPath().projection(projection);
var path3 = d3.geoPath().projection(projection);

var g = svg.append("g").attr("id", "paths");
g.selectAll("path2") //d3 geopath
.data(streets.features) //get data to define path
.enter() //there are more data than elements, this selects them
.append("path") //appends path to data
.attr('class','outlines')
.attr("d", path2) //The d attribute defines a path to be drawn, only applies to appended elements
.style("fill", "none")
.style('stroke-opacity','.5')
.style("stroke-width", '.2')
.style("stroke", "rgb(0,0,0)")

g.selectAll("path2") //d3 geopath
.data(highwaylines.features) //get data to define path
.enter() //there are more data than elements, this selects them
.append("path") //appends path to data
.attr('class','outlines')
.attr("d", path2) //The d attribute defines a path to be drawn, only applies to appended elements
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '2')
.style("stroke", "palevioletred")

g.selectAll("path3") //d3 geopath
.data(portlandBoundary.features) //get data to define path
.enter() //there are more data than elements, this selects them
.append("path") //appends path to data
.attr('class','outlines')
.attr("d", path3) //The d attribute defines a path to be drawn, only applies to appended elements
.style("fill", "floralwhite")
.style("fill-opacity", '.2')
.style('stroke-opacity','.6')
.style("stroke-width", '1')
.style("stroke", "rgb(119,94,148)")

g.selectAll("path3") //d3 geopath
.data(parks.features) //get data to define path
.enter() //there are more data than elements, this selects them
.append("path") //appends path to data
.attr('class','outlines')
.attr("d", path3) //The d attribute defines a path to be drawn, only applies to appended elements
.style("fill", "mediumvioletred")
.style("fill-opacity", ".5")
.style('stroke-opacity','1')
.style("stroke-width", '.6')
.style("stroke", "lightslategrey")

g.selectAll("path3") //d3 geopath
.data(water.features) //get data to define path
.enter() //there are more data than elements, this selects them
.append("path") //appends path to data
.attr('class','outlines')
.attr("d", path3) //The d attribute defines a path to be drawn, only applies to appended elements
.style("fill", "teal")
.style("fill-opacity", ".5")
.style('stroke-opacity','1')
.style("stroke-width", '1')
.style("stroke", "lightslategrey")

g.selectAll("path3") //d3 geopath
.data(sideWater.features) //get data to define path
.enter() //there are more data than elements, this selects them
.append("path") //appends path to data
.attr('class','outlines')
.attr("d", path3) //The d attribute defines a path to be drawn, only applies to appended elements
.style("fill", "slategrey")
.style("fill-opacity", ".05")
.style('stroke-opacity','.1')
.style("stroke-width", '.1')
.style("stroke", "black")

g.selectAll("path2") //d3 geopath
.data(ferryline.features) //get data to define path
.enter() //there are more data than elements, this selects them
.append("path") //appends path to data
.attr('class','outlines')
.attr("d", path2) //The d attribute defines a path to be drawn, only applies to appended elements
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '2')
.style("stroke", "blueviolet")
.style('stroke-dasharray','2 2')



var c = svg.selectAll("circle") //d3 geopath
.data(locs)
.enter() //there are more data than elements, this selects them
.append("circle") //appends path to data
.attr("cx", function(d) {return projection([d.longitude, d.latitude])[0]})
.attr("cy", function(d) {return projection([d.longitude, d.latitude])[1]})
.attr('r',4)
.attr('fill',colorType)
.style('fill-opacity','2')
.style('stroke','darkviolet')
.style('stroke-width','1')
.on('mouseover', spotText)
.on('mouseout', removespotText)

function colorType(d,i){
var color = 'gold'
if(d.type=='morgue'){color = 'gold'}
if(d.type=='house'){color = 'gold'}
if(d.type=='house'){color = 'gold'}
if(d.type=='house'){color = 'gold'}
if(d.type=='saloon'){color = 'gold'}
if(d.type=='scow'){color = 'gold'}
return color

}
function spotText(event,d){
d3.select(this).attr('fill','mediumslateblue')
.attr('r', 6)
.style('stroke', 'mediumslateblue')
.style("stroke-opacity",'.5')
.style("stroke-width", '5')
svg.append('text')
.attr('class','spots')
.attr('x', '340')
.attr('y','320')
.attr('font-family','Helvetica')
.attr('font-size', '.7em')
.attr('text.anchor','start')
.attr('font-weight', 'bold')
.text(d.name)

svg.append('text')
.attr('class','spots')
.attr('x', '340')
.attr('y','330')
.attr('font-family','Helvetica')
.attr('font-size', '.65em')
.attr('text.anchor','start')
.attr('font-weight', 'normal')
.text(d.description)

svg.append('line')
.attr('class','spotLine')
.attr('x1', '340')
.attr('y1', '318')
.attr('x2', projection([d.longitude, d.latitude])[0])
.attr('y2', '318')
.style('stroke-width','.5')
.style('stroke','black')
.style('stroke-dasharray','2 2')
svg.append('line')
.attr('class','spotLine')
.attr('x1', projection([d.longitude, d.latitude])[0])
.attr('y1', '318')
.attr('x2', projection([d.longitude, d.latitude])[0])
.attr('y2', projection([d.longitude, d.latitude])[1])
.style('stroke-width','.7')
.style('stroke','darkblue')
.style('stroke-dasharray','2 2')
}
function removespotText(event,d){
d3.select(this).attr('fill',colorType)
d3.select(this).attr('r', 4)
d3.select(this).style('stroke-opacity','.65')
d3.select(this).style('stroke-width', '1')
d3.selectAll('text.spots').remove()
d3.selectAll('line.spotLine').remove()
}



svg.append("rect")
.attr("x", 497)
.attr("y", 97)
.attr("width", 85)
.attr("height", 27)
.attr('fill', 'white')
.style('fill-opacity','.5')
.style('stroke', 'teal')
.style('stroke-width', '1.5')
svg.append('image')
.attr('href',jamesTurk)
.attr('class','spotImage')
.attr('x', '500')
.attr('y','90')
.attr('width', 17)
.attr('height', 40)
.on('mouseover', spotProfile1)
.on('mouseout', removespotProfile)

svg.append('image')
.attr('href',bridgetGrant)
.attr('class','spotImage')
.attr('x', '520')
.attr('y','90')
.attr('width', 17)
.attr('height', 40)
.on('mouseover', spotProfile2)
.on('mouseout', removespotProfile)

svg.append('image')
.attr('href',larrySullivan)
.attr('class','spotImage')
.attr('x', '540')
.attr('y','90')
.attr('width', 17)
.attr('height', 40)
.on('mouseover', spotProfile3)
.on('mouseout', removespotProfile)

svg.append('image')
.attr('href',buncoKelly)
.attr('class','spotImage')
.attr('x', '560')
.attr('y','90')
.attr('width', 17)
.attr('height', 40)
.on('mouseover', spotProfile)
.on('mouseout', removespotProfile)

function spotProfile(i,d){
d3.select(this).attr('fill','lavenderblush')

svg.append("rect")
.attr('class','whitebox')
.attr("x", 150)
.attr("y", 100)
.attr("height", 154)
.attr("width", 300)
.attr('stroke','gold')
.attr("stroke-width", '2')
.attr('stroke-opacity', '1')
.style("fill", 'white');

svg.append('image')
.attr('href',joeBuncoKelly)
.attr('class','spotProfile')
.attr('x', '150')
.attr('y','103')
.attr('width', 300)
.attr('height', 150)
}



function spotProfile1(i,d){
d3.select(this).attr('fill','lavenderblush')

svg.append("rect")
.attr('class','whitebox')
.attr("x", 150)
.attr("y", 100)
.attr("height", 154)
.attr("width", 300)
.attr('stroke','gold')
.attr("stroke-width", '2')
.attr('stroke-opacity', '1')
.style("fill", 'white');

svg.append('image')
.attr('href',jamesTurkProfile)
.attr('class','spotProfile1')
.attr('x', '155')
.attr('y','103')
.attr('width', 295)
.attr('height', 145)
}
/*
function removespotProfile1(event,d){
d3.select(this).attr('fill',colorType)
d3.selectAll('image.spotProfile1').remove()
d3.selectAll('rect.whitebox').remove()
}
*/
function spotProfile2(event,d){
d3.select(this).attr('fill','lavenderblush')

svg.append("rect")
.attr('class','whitebox')
.attr("x", 150)
.attr("y", 100)
.attr("height", 154)
.attr("width", 300)
.attr('stroke','gold')
.attr("stroke-width", '2')
.attr('stroke-opacity', '1')
.style("fill", 'white');

svg.append('image')
.attr('href',grantProfile)
.attr('class','spotProfile2')
.attr('x', '155')
.attr('y','103')
.attr('width', 295)
.attr('height', 145)
}
/*
function removespotProfile2(event,d){
d3.select(this).attr('fill',colorType)
d3.selectAll('image.spotProfile2').remove()
d3.selectAll('rect.whitebox').remove()
}
*/
function spotProfile3(event,d){
d3.select(this).attr('fill','lavenderblush')

svg.append("rect")
.attr('class','whitebox')
.attr("x", 150)
.attr("y", 100)
.attr("height", 154)
.attr("width", 300)
.attr('stroke','gold')
.attr("stroke-width", '2')
.attr('stroke-opacity', '1')
.style("fill", 'white');

svg.append('image')
.attr('href',larryProfile)
.attr('class','spotProfile3')
.attr('x', '155')
.attr('y','103')
.attr('width', 295)
.attr('height', 145)
}
/*
function removespotProfile3(event,d){
d3.select(this).attr('fill',colorType)
d3.selectAll('image.spotProfile3').remove()
d3.selectAll('rect.whitebox').remove()
}
*/

function removespotProfile(i,d){

d3.selectAll('image.spotProfile').remove()
d3.selectAll('image.spotProfile1').remove()
d3.selectAll('image.spotProfile2').remove()
d3.selectAll('image.spotProfile3').remove()
d3.selectAll('rect.whitebox').remove()
}

setInterval(myTimer, 1800);

function myTimer() {
const d = new Date();
document.getElementById("demo").innerHTML = d.toLocaleTimeString();
svg.append('timer')
.attr('class','myTimer')
.attr('x', '450')
.attr('y','100')
}
return svg.node();
}


Insert cell
frame = {
const width = 1200,
height = 800;
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height]);


var g = svg.append("g").attr("id", "paths");

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(footstepsBorder1) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "teal")
.style("fill-opacity", '1')
.style('stroke-opacity','1')
.style("stroke-width", '1.5')
.style("stroke", "deeppink")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(footstepsBorder2) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "teal")
.style("fill-opacity", '1')
.style('stroke-opacity','1')
.style("stroke-width", '1.5')
.style("stroke", "deeppink")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(footstepsBorder3) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "teal")
.style("fill-opacity", '1')
.style('stroke-opacity','1')
.style("stroke-width", '1.5')
.style("stroke", "deeppink")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(timerBorder) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '3')
.style("stroke", "deeppink")

return svg.node();
}
Insert cell
Insert cell
rectangle = {
const svg = d4.create("svg")
svg.append("rect")
.attr('class','whitebox')
.attr("height", 350)
.attr("width", 200)
.style("fill", "white")
.attr('stroke','rosybrown')
.attr("stroke-width", '2')
.attr('stroke-opacity', '1')


return svg.node();
}
Insert cell
Insert cell
dashboard =

html`

<div class='dashboardOuter' style='height:800px;width:1200px'>
<div class='border' style='position:absolute;width:1160px;top:0px;left:0px'>
${border}
</div>
<div class='frame' style='position:absolute;width:1160px;top:0px;left:0px'>
${frame}
</div>
<div class='timer' style='position:absolute;top:-15px;left:550px;font-family:Helvetica;font-size:20px;font-weight:bold'>
${md`TIMER`}
</div>

<div class='map' style='position:absolute;width:685px;top:95px;left:238px'>
${chart}
</div>

<div class='map' style='position:absolute;width:200px;height:350px;top:490px;left:700px'>
${rectangle}
</div>

<div class='border' style='position:absolute;width:200px;top:500px;left:700px'>
${smallmap}
</div>

</div>

`
Insert cell
border = {
const width = 1200,
height = 800;
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height]);


var g = svg.append("g").attr("id", "paths");
var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(colorUnderlay) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "peachpuff")
.style("fill-opacity", '.4')

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(mapFrame1) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "rbg(87,52,11)")
.style("fill-opacity", '1')
.style('stroke-opacity','1')
.style("stroke-width", '1.5')
.style("stroke", "rosybrown")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(mapFrame2) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "rbg(87,52,11)")
.style("fill-opacity", '1')
.style('stroke-opacity','1')
.style("stroke-width", '1.5')
.style("stroke", "rosybrown")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(portlandtittle) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '1.2')
.style("stroke", "teal")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(kidnapstitle) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '.5')
.style("stroke", "mediumvioletred")
var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(lTitle) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '.5')
.style("stroke", "darkturquoise")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(paTitle) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '.5')
.style("stroke", "orange")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(onTitle) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '1')
.style("stroke", "dodgerblue")

var p = svg.selectAll('polyline')
g.selectAll("path3") //d3 geopath
.data(rdTitle) //get data to define path
.enter() //there are more data than elements, this selects them
.append('polyline') //appends path to data
.attr('class','outlines')
.attr('points', function(d) {return d})
.style("fill", "none")
.style('stroke-opacity','1')
.style("stroke-width", '1')
.style("stroke", "deeppink")



return svg.node();
}
Insert cell
footstepsBorder3 = FileAttachment("Footsteps border3.txt").tsv({array:true})
Insert cell
timerBorder = FileAttachment("timer border.txt").tsv({array:true})
Insert cell
rectBorder = FileAttachment("rect border.txt").tsv({array:true})
Insert cell
footstepsBorder1 = FileAttachment("Footsteps border1.txt").tsv({array:true})
Insert cell
footstepsBorder2 = FileAttachment("Footsteps border2.txt").tsv({array:true})
Insert cell
highwaylines = FileAttachment("HighwayLines.geojson").json()
Insert cell
kidnapstitle = FileAttachment("kidnapstitle.txt").tsv({array:true})
Insert cell
lTitle = FileAttachment("L title.txt").tsv({array:true})
Insert cell
onTitle = FileAttachment("ON title.txt").tsv({array:true})
Insert cell
paTitle = FileAttachment("PA title.txt").tsv({array:true})
Insert cell
rdTitle = FileAttachment("RD title.txt").tsv({array:true})
Insert cell
portlandtittle = FileAttachment("PortlandTittle@1.txt").tsv({array:true})
Insert cell
mapFrame2 = FileAttachment("Map Frame2.txt").tsv({array:true})
Insert cell
mapFrame1 = FileAttachment("Map Frame1@1.txt").tsv({array:true})
Insert cell
colorUnderlay = FileAttachment("Color underlay.txt").tsv({array:true})
Insert cell
mapFrame = FileAttachment("Map Frame.txt").tsv({array:true})
Insert cell
image = FileAttachment("image.png").url()
Insert cell
allRoutes = FileAttachment("all routes@4.geojson").json()
Insert cell
bridgetGrant = FileAttachment("Bridget Grant PNG 2.png").url()
Insert cell
buncoKelly = FileAttachment("Bunco Kelly PNG 2.png").url()
Insert cell
jamesTurk = FileAttachment("James Turk png 2.png").url()
Insert cell
larrySullivan = FileAttachment("Larry Sullivan PNG 2.png").url()
Insert cell
larryProfile = FileAttachment("Larry profile.png").url()
Insert cell
grantProfile = FileAttachment("Grant profile.png").url()
Insert cell
jamesTurkProfile = FileAttachment("James Turk profile.png").url()
Insert cell
buncoEstablishment = FileAttachment("Bunco-s establishment.PNG").url()
Insert cell
sailorBoardinghouses = FileAttachment("Sailor-s boardinghouses.PNG").url()
Insert cell
turkSailorsBoardinghouses = FileAttachment("Turk-s sailors boardinghouses.PNG").url()
Insert cell
import {skullTest} from "@mariamth/shanghai"
Insert cell
Insert cell
locs = d3.csv(locslink, d3.autoType)
Insert cell
bbox = FileAttachment("BBox@2.geojson").json()
Insert cell
streets = FileAttachment("Streets@1.geojson").json()
Insert cell
parks = FileAttachment("parks@2.geojson").json()
Insert cell
pdcBase = FileAttachment("pdc base.geojson").json()
Insert cell
ferryline = FileAttachment("Ferryline.geojson").json()
Insert cell
joeBuncoKelly = FileAttachment("Joe Bunco kelly@1.png").url()
Insert cell
import {map} with {projection, outline} from "@d3/world-map"
Insert cell
d4 = require("d3@6", "d3-geo-projection@3")
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more