map7 = {
const container = yield htl.html`<div style="height: 500px"></div>`;
const map = L.map(container, {
minZoom: 14.5,
maxZoom: 17.5,
});
map.setView([40.80794694447276, -73.96214143872722], 16);
L.tileLayer('https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}@2x.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
var phoneIcon = L.icon({
iconUrl: "https://cdn0.iconfinder.com/data/icons/map-locations-and-tourism/512/47-512.png",
iconSize: [21.12, 24.42],
iconAnchor: [16, 37],
popupAnchor: [-3, -30]
});
var gaurdIcon = L.icon({
iconUrl: "https://static.thenounproject.com/png/63811-200.png",
iconSize: [32, 37],
iconAnchor: [16, 37],
popupAnchor: [-3, -50]
});
L.geoJSON(columbia_university, {
onEachFeature: function(feature, layer) {
if (feature.properties && feature.properties.name) {
layer.bindPopup(feature.properties.name);
}
}
}).addTo(map);
L.geoJSON(columbia_call_boxes, {
onEachFeature: function(feature, layer) {
L.marker([feature.geometry.coordinates[1],feature.geometry.coordinates[0]], {icon: phoneIcon}).addTo(map);
}
})
const crimeLayer = L.layerGroup().addTo(map);
$: if (options2) {
crimeLayer.clearLayers(); // Clear previous layers
// Filter Clery crime data
const filteredCleryData = data.filter(d => options2.includes(d.filterCat));
let finalFilteredCleryData = filteredCleryData; // Presume no time filter needed initially
// Filter Campus crime data
let filteredCampusCrimes = campusCrimes.filter(d => options2.includes(d.filterCat));
let finalFilteredCampusCrimes = filteredCampusCrimes; // Presume no time filter needed initially
// Apply time filter only if both startTime and endTime are set
if (startTime1 != null && endTime1 != null) {
finalFilteredCleryData = filteredCleryData.filter(d => {
const crimeTime = getHourFromTimeString(d.TIME);
return crimeTime >= startTime1 && crimeTime <= endTime1;
});
finalFilteredCampusCrimes = filteredCampusCrimes.filter(d => {
const crimeTime = getHourFromTimeString(d.CMPLNT_FR_TM);
return crimeTime >= startTime1 && crimeTime <= endTime1;
});
}
finalFilteredCleryData.forEach(d => {if (!isNaN(d.LATITUDE) && !isNaN(d.LONGITUDE)) {
const color = colorScheme(d.filterCat);
const jitterFactorOne = Math.random()*0.000154
const jitterFactorTwo = Math.random()*0.000154
const polygon = L.polygon([
[d.LATITUDE - 0.00015 + jitterFactorOne, d.LONGITUDE + jitterFactorTwo],
[d.LATITUDE + jitterFactorOne, d.LONGITUDE - 0.000077 + jitterFactorTwo],
[d.LATITUDE + jitterFactorOne, d.LONGITUDE + 0.000077 + jitterFactorTwo]
], {
fillColor: color,
color: color,
weight: 1,
opacity: 1,
fillOpacity: 1
}).addTo(crimeLayer);
L.circle([d.LATITUDE + 0.00001 + jitterFactorOne, d.LONGITUDE + jitterFactorTwo], {
radius: 6.52,
fillColor: color,
color: color,
weight: 1,
opacity: 1,
fillOpacity: 1
}).addTo(crimeLayer).bindPopup(`<strong>Description:</strong> ${d.DESCRIPTION}`).bindTooltip(`<strong><u>Clery Crime:</u></strong> ${d.CRIME}<br> <strong>Date:</strong> ${d.TIME.substring(0, d.TIME.indexOf(" "))}<br><strong>Time:</strong> ${d.TIME.substring(d.TIME.indexOf(" "), d.TIME.length)}`);
}
});
finalFilteredCampusCrimes.forEach(d => {if (!isNaN(d.Latitude) && !isNaN(d.Longitude)) {
const color = colorScheme(d.filterCat);
const jitterFactorOne = Math.random()*0.000924
const jitterFactorTwo = Math.random()*0.000924
L.rectangle([
[parseFloat(d.Latitude) - 0.0000385 + jitterFactorOne, parseFloat(d.Longitude) - 0.0000385 + jitterFactorTwo],
[parseFloat(d.Latitude) + 0.0000385 + jitterFactorOne, parseFloat(d.Longitude) + 0.0000385 + jitterFactorTwo]
], {
fillColor: color,
color: color,
weight: 1,
opacity: .5,
fillOpacity: .5
}).addTo(crimeLayer).bindTooltip(`<strong><u>NYPD Crime:</u></strong> ${d.OFNS_DESC}<br><strong>Date:</strong> ${d.CMPLNT_FR_DT}<br><strong>Time:</strong> ${d.CMPLNT_FR_TM}`);
}
});
}
// add each line manually so it has a set name
var route = worseroute;
var latlngs = [];
for(const point of route)
{
latlngs.push([point.A,point.B]);
}
var worserouteLine = L.polyline(latlngs, {
color: "purple",
weight: 4,
opacity: 0
});
worserouteLine.addTo(map).on('mouseover', function(e) {
var layer = e.target;
layer.setStyle({
weight: 6
})}).on('mouseout',function(e) {
var layer = e.target;
layer.setStyle({
weight: 4
})
});
route = routeSample;
var latlngs = [];
for(const point of route)
{
latlngs.push([point.A,point.B]);
}
var routeSampleLine = L.polyline(latlngs, {
color: "purple",
weight: 4,
opacity: 0
});
routeSampleLine.addTo(map).on('mouseover', function(e) {
var layer = e.target;
layer.setStyle({
weight: 6
})}).on('mouseout',function(e) {
var layer = e.target;
layer.setStyle({
weight: 4
})
});
route = TCBroad;
var latlngs = [];
for(const point of route)
{
latlngs.push([point.A,point.B]);
}
var TCBroadLine = L.polyline(latlngs, {
color: "purple",
weight: 4,
opacity: 0
});
TCBroadLine.addTo(map).on('mouseover', function(e) {
var layer = e.target;
layer.setStyle({
weight: 6
})}).on('mouseout',function(e) {
var layer = e.target;
layer.setStyle({
weight: 4
})
});
route = TCAm;
var latlngs = [];
for(const point of route)
{
latlngs.push([point.A,point.B]);
}
var TCAmLine = L.polyline(latlngs, {
color: "purple",
weight: 4,
opacity: 0
});
TCAmLine.addTo(map).on('mouseover', function(e) {
var layer = e.target;
layer.setStyle({
weight: 6
})}).on('mouseout',function(e) {
var layer = e.target;
layer.setStyle({
weight: 4
})
});
if(paths=="Barnard to SIPA via 120th")
{
worserouteLine.setStyle({
opacity: 1
});
}
else if(paths=="Barnard to SIPA via College Walk")
{
routeSampleLine.setStyle({
opacity: 1
});
}
else if(paths=="Butler to TC via Broadway")
{
TCBroadLine.setStyle({
opacity: 1
});
}
else if(paths== "Butler to TC via Amsterdam")
{
TCAmLine.setStyle({
opacity: 1
});
}
var legend = L.control({position: 'topleft'});
legend.onAdd = function (map) {
var div = L.DomUtil.create('div', 'info legend');
// set white background
div.style.backgroundColor = 'white';
div.style.padding = '10px';
div.innerHTML += '<div style="font-weight: bold; font-size: 16px; text-align: center; ">Legend</div>';
// Add the image and label to the legend
div.innerHTML +=
'<img src="https://cdn0.iconfinder.com/data/icons/map-locations-and-tourism/512/47-512.png" style="width: 20px; height: 20px;"> Call Booth'+ '<br>';
// Add NYPD crime data
div.innerHTML +=
'<div style="display: flex; align-items: center; margin-bottom: 5px;">' +
'<div style="width: 8px; height: 8px; border: 1.5px solid black; margin-right: 9px; margin-left: 5px;"></div>' +
'<span>NYPD Crime Incident</span>' +
'</div>';
// Add Clery Crime Data
div.innerHTML +=
'<div style="display: flex; align-items: center; margin-bottom: 3px;">' +
'<svg width="25" height="20" style="margin-right: 5px; margin-left: -5px;">' + // Adjusted left margin
'<circle cx="15" cy="5.5" r="5" style="fill: white; stroke: black; stroke-width: 1; clip-path: url(#circleClip);"></circle>' +
'<polygon points="10,6 15,15 20,6" style="fill: white; stroke: black;"></polygon>' +
'<line x1="10" y1="6" x2="20" y2="6" style="stroke: white; stroke-width: 1;"></line>' +
'</svg>' +
'<span style="margin-top: 2px;"> Clery Crime Incidents</span>' +
'</div>';
// Add route to map
div.innerHTML +=
'<div style="display: flex; align-items: center; margin-bottom: 1.7px;">' +
'<svg width="25" height="10" style="margin-right: 5px; margin-left: -5px;">' +
'<line x1="5" y1=4 x2="20" y2="4" style="stroke: purple; stroke-width: 4;"></line>' +
'</svg>' +
'<span style="margin-top: -2px;"> Route</span>' +
'</div>';
// Add color codes
for (var i = 1; i < (crimes.length+1); i++) {
//div.innerHTML +=
//'<i style="background:' + adjustedColorList[i-1] + '"></i> ' + crimes[i-1] + '<br>';
div.innerHTML += '<div style="display: inline-block; width: 15px; height: 15px; border-radius: 50%; background-color: ' + adjustedColorList[i-1] + '; margin-right: 5px;"></div>' + crimes[i-1] + '<br>';
}
return div;
};
legend.addTo(map);
return container;
}