/* eslint-disable */
|
|
var map = L.map('mapid').setView([63.8333, -152], 1),
|
|
accessToken = 'pk.eyJ1IjoiZmx5bG9jYWwiLCJhIjoiY2t0OHUxZXB6MTVueTJ4cGVwOHRuc2s2NyJ9.YF9frLvISHfOuT7nqs3TNg',
|
|
apiUrl = `https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=${accessToken}`;
|
|
|
|
var form = `AND(Is_Origin=1,{IsCurrent-AsOrigin}='Yes')`;
|
|
|
|
var markers = L.markerClusterGroup();
|
|
var destinationsLayer = L.layerGroup();
|
|
|
|
var points = [],
|
|
mainOffset;
|
|
|
|
async function fetchMapData() {
|
|
|
|
const response = await fetch(`https://api.airtable.com/v0/appiQwfVZixRgRICe/Airports_IATA?filterByFormula=${form}&fields[]=Airport_IATA&fields[]=Icon_Url&fields[]=Latitude_Deg&fields[]=Longitude_Deg&sort[0][field]=Airport_IATA&sort[0][direction]=asc`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
'Authorization': 'Bearer keyJ2ht64ZSN57AG1'
|
|
},
|
|
});
|
|
|
|
response.ok; // => false
|
|
response.status; // => 404
|
|
|
|
const mapData = await response.json();
|
|
|
|
points = mapData.records;
|
|
mainOffset = mapData.offset;
|
|
|
|
return mapData;
|
|
}
|
|
|
|
async function fetchMapData2(mapData) {
|
|
if (mapData.offset) {
|
|
|
|
const response = await fetch(`https://api.airtable.com/v0/appiQwfVZixRgRICe/Airports_IATA?filterByFormula=${form}&fields[]=Airport_IATA&fields[]=Icon_Url&fields[]=Latitude_Deg&fields[]=Longitude_Deg&sort[0][field]=Airport_IATA&sort[0][direction]=asc&offset=${mapData.offset}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
'Authorization': 'Bearer keyJ2ht64ZSN57AG1'
|
|
},
|
|
});
|
|
|
|
response.ok; // => false
|
|
response.status; // => 404
|
|
|
|
const mapData2 = await response.json();
|
|
|
|
points = [...points, ...mapData2.records];
|
|
|
|
return mapData2;
|
|
|
|
}
|
|
}
|
|
|
|
function getOrigIcon(icon) {
|
|
|
|
var origIcon = L.icon({
|
|
iconUrl: icon,
|
|
//shadowUrl: 'leaf-shadow.png',
|
|
iconSize: [80, 40], // size of the icon
|
|
//shadowSize: [50, 64], // size of the shadow
|
|
iconAnchor: [40, 40], // point of the icon which will correspond to marker's location
|
|
//shadowAnchor: [4, 62], // the same for the shadow
|
|
popupAnchor: [0, 0] // point from which the popup should open relative to the iconAnchor
|
|
});
|
|
|
|
return origIcon;
|
|
|
|
}
|
|
|
|
function getBlueIcon() {
|
|
|
|
var origIcon = L.icon({
|
|
iconUrl: 'https://spencerflagg.com/flylocal/pins/pin.svg',
|
|
//shadowUrl: 'leaf-shadow.png',
|
|
iconSize: [14, 16], // size of the icon
|
|
//shadowSize: [50, 64], // size of the shadow
|
|
iconAnchor: [7, 16], // point of the icon which will correspond to marker's location
|
|
//shadowAnchor: [4, 62], // the same for the shadow
|
|
popupAnchor: [0, 0] // point from which the popup should open relative to the iconAnchor
|
|
});
|
|
|
|
return origIcon;
|
|
|
|
}
|
|
|
|
fetchMapData().then(mapData => {
|
|
fetchMapData2(mapData).then(function () {
|
|
|
|
var mapDataFiltered = points.map((record) => {
|
|
return {
|
|
"iata": record.fields.Airport_IATA,
|
|
"lat": record.fields.Latitude_Deg,
|
|
"long": record.fields.Longitude_Deg,
|
|
"icon": record.fields.Icon_Url
|
|
}
|
|
});
|
|
|
|
// console.log(mapDataFiltered); // => 'Page not found'
|
|
|
|
mapDataFiltered.forEach((record) => {
|
|
|
|
var popupContent = `
|
|
<div>${record.iata}</div>
|
|
<button id='origBtn' data-iata='${record.iata}' data-lat='${record.lat}' data-long='${record.long}'>make origin</button>
|
|
`;
|
|
|
|
var marker = L.marker([record.lat, record.long], { icon: getOrigIcon(record.icon + '+FFFFFF+BBBBBB+000000') })
|
|
.bindPopup(popupContent);
|
|
//.addTo(map);
|
|
|
|
markers.addLayer(marker);
|
|
});
|
|
})
|
|
});
|
|
|
|
// console.log(mapData[0].Airport_IATA);
|
|
|
|
L.tileLayer(apiUrl, {
|
|
attribution: 'FlyLocal | Map data © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
|
|
maxZoom: 18,
|
|
//id: 'mapbox/streets-v11',
|
|
//id: 'mapbox/outdoors-v11',
|
|
//id: 'mapbox/satellite-streets-v11',
|
|
id: 'flylocal/ckt9x8aho0igb18mmm9ks2fsv',
|
|
tileSize: 512,
|
|
zoomOffset: -1,
|
|
accessToken: 'your.mapbox.access.token'
|
|
}).addTo(map);
|
|
|
|
map.addLayer(markers);
|
|
|
|
map.on('popupopen', function (e) {
|
|
var thisMarker = e.popup._source;
|
|
|
|
// console.log(thisMarker);
|
|
|
|
var origButton = document.getElementById("origBtn"),
|
|
destButton = document.getElementById("destBtn");
|
|
|
|
origButton.addEventListener("click", function () {
|
|
//alert(thisButton.dataset.iata);
|
|
|
|
fetchDestData(origButton.dataset.iata).then(mapData => {
|
|
|
|
var mapDataFiltered = mapData.records.map((record) => {
|
|
return {
|
|
"iata": record.fields.Airport_IATA,
|
|
"lat": record.fields.Latitude_Deg,
|
|
"long": record.fields.Longitude_Deg,
|
|
"icon": record.fields.Icon_Url
|
|
}
|
|
});
|
|
|
|
// console.log(mapDataFiltered); // => 'Page not found'
|
|
|
|
map.removeLayer(markers);
|
|
|
|
// re-add origin
|
|
var marker = L.marker([thisButton.dataset.lat, thisButton.dataset.long], { icon: getBlueIcon() })
|
|
.addTo(map);
|
|
|
|
destinationsLayer.clearLayers();
|
|
map.removeLayer(destinationsLayer);
|
|
|
|
// add all destinations
|
|
mapDataFiltered.forEach((record) => {
|
|
|
|
|
|
|
|
var popupContent = `
|
|
<div>${record.iata}</div>
|
|
<button id='origBtn' data-iata='${record.iata}' data-lat='${record.lat}' data-long='${record.long}'>make origin</button>
|
|
<button id='destBtn' data-iata='${record.iata}' data-lat='${record.lat}' data-long='${record.long}'>make destination</button>
|
|
`;
|
|
|
|
var marker = L.marker([record.lat, record.long], { icon: getOrigIcon(record.icon + '+05FF00+04C300+000000') })
|
|
.bindPopup(popupContent).addTo(map);
|
|
|
|
|
|
});
|
|
|
|
map.addLayer(destinationsLayer);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
destButton.addEventListener("click", function () {
|
|
|
|
var lat = origButton.dataset.lat,
|
|
long = origButton.dataset.long;
|
|
|
|
var thisArc = L.Polyline.Arc([thisButton.dataset.lat, thisButton.dataset.long], [record.lat, record.long], {
|
|
vertices: 200,
|
|
});
|
|
|
|
var thisDecorator = L.polylineDecorator(thisArc, {
|
|
patterns: [
|
|
// defines a pattern of 10px-wide dashes, repeated every 20px on the line
|
|
{ offset: 0, repeat: 20, symbol: L.Symbol.dash({ pixelSize: 3, pathOptions: { color: '#007FFF', weight: 8, lineCap: 'square' } }) },
|
|
{ offset: '100%', repeat: 0, symbol: L.Symbol.arrowHead({ pixelSize: 15, polygon: false, pathOptions: { stroke: true, color: '#007FFF', weight: 8, lineCap: 'square' } }) }
|
|
]
|
|
});
|
|
|
|
destinationsLayer.addLayer(thisDecorator);
|
|
|
|
});
|
|
});
|
|
|
|
async function fetchDestData(iata) {
|
|
|
|
var destFormula = `AND(Is_Destination=1,{IsCurrent-AsDest}="Yes",(FIND("${iata}", Associated_Origin_Search)>0))`;
|
|
const response = await fetch(`https://api.airtable.com/v0/appiQwfVZixRgRICe/Airports_IATA?filterByFormula=${destFormula}&fields[]=Airport_IATA&fields[]=Latitude_Deg&fields[]=Longitude_Deg&fields[]=Icon_Url&sort[0][field]=Airport_IATA&sort[0][direction]=asc`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
'Authorization': 'Bearer keyJ2ht64ZSN57AG1'
|
|
},
|
|
});
|
|
|
|
response.ok; // => false
|
|
response.status; // => 404
|
|
|
|
const mapData = await response.json();
|
|
|
|
points = mapData.records;
|
|
mainOffset = mapData.offset;
|
|
|
|
return mapData;
|
|
}
|