From 7fb977f562ac92cb1546c4fd9520b367b32cdf94 Mon Sep 17 00:00:00 2001 From: MuchQuak <loganpwilt@gmail.com> Date: Mon, 6 Jan 2025 15:35:06 -0800 Subject: [PATCH 1/6] Closes #2010, Adds simple popup to assist with color recognition # Issue #2010 # Summary Hooks into the macrostrat api to pull lat long input when the macrostrat layer is clicked. --- js/symb/leafletMap.js | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/js/symb/leafletMap.js b/js/symb/leafletMap.js index d2da017d93..3c82617d7a 100644 --- a/js/symb/leafletMap.js +++ b/js/symb/leafletMap.js @@ -26,6 +26,21 @@ function getObservationSvg(opts = {color: "#7A8BE7", size: 24, className:""}) { }); } +async function getMacroStratData(lat, lng, zoom) { + return fetch(`https://macrostrat.org/api/v2/mobile/map_query_v2?lng=${lng}&lat=${lat}&z=${zoom}`) + .then(async response => { + if(!response.ok) { + return {}; + } + const json_data = await response.json() + + if(!json_data.success) { + return {}; + } + return json_data.success.data; + }) +} + function getSpecimenSvg(opts = {color: "#7A8BE7", size: 24, className:""}) { const default_ops = {color: "#7A8BE7", size: 24}; opts = {...default_ops, ...opts}; @@ -142,6 +157,68 @@ class LeafletMap { attribution: 'Map data: © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, <a href="http://viewfinderpanoramas.org">SRTM</a> | Map style: © <a href="https://opentopomap.org">OpenTopoMap</a> (<a href="https://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA</a>)' }); + const macro_strat_info = async e => { + const zoom = e.target._zoom; + const lat = e.latlng.lat; + const lon = e.latlng.lng; + const macro_strat_data = await getMacroStratData(lat, lon, zoom); + + if(macro_strat_data.mapData && macro_strat_data.mapData.length) { + var popup = L.popup() + .setLatLng([lat, lon]) + .setContent(` + <div> + <div> + <span>Age:</span> + <span>${macro_strat_data.mapData[0].age}</span> + </div> + </div>`) + .openOn(this.mapLayer); + } + } + + + /* Alternative to using the api. Uses color inference. Back if we don't want to use macrostrat api*/ + const macro_strat_color = (e) => { + const zoom = e.target._zoom; + + let coords = this.mapLayer.project(e.latlng, zoom).floor(); + + let pX = coords.x / 256; + let pY = coords.y / 256; + + coords.x = Math.floor(pX); + coords.y = Math.floor(pY); + coords.z = zoom + + const tile = new Image(); + tile.crossOrigin = "anonymous"; + tile.src = `https://macrostrat.org/api/v2/maps/burwell/emphasized/${coords.z}/${coords.x}/${coords.y}/tile.png`; + + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + + tile.addEventListener('load', function() { + ctx.drawImage(tile, 0, 0); + const dX = Math.floor((pX - coords.x) * 512); + const dY = Math.floor((pY - coords.y) * 512); + const pixel = ctx.getImageData(dX, dY, 1, 1); + + ctx.fillRect(dX, dY, 10, 10); + + const data = pixel.data; + console.log(`rgb(${data[0]} ${data[1]} ${data[2]} / ${data[3] / 255})`); + }); + } + + macro_strat.on('add', (e) => { + this.mapLayer.on('click', macro_strat_info) + }) + + macro_strat.on('remove', (e) => { + this.mapLayer.off('click', macro_strat_info) + }) + if(map_options.layer_control !== false) { const layers = { "Terrain": terrainLayer, From fd08b9ef450c2078ef4ab715052234b1b9bae1be Mon Sep 17 00:00:00 2001 From: MuchQuak <loganpwilt@gmail.com> Date: Tue, 7 Jan 2025 12:23:55 -0800 Subject: [PATCH 2/6] Filling about the popup with desired info --- js/symb/leafletMap.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/js/symb/leafletMap.js b/js/symb/leafletMap.js index 3c82617d7a..6814808e7f 100644 --- a/js/symb/leafletMap.js +++ b/js/symb/leafletMap.js @@ -163,15 +163,36 @@ class LeafletMap { const lon = e.latlng.lng; const macro_strat_data = await getMacroStratData(lat, lon, zoom); + const loop_strat_names = (data) => { + let html_str = ""; + for(let strat_name of data.macrostrat.strat_names) { + html_str += `<a href="https://macrostrat.org/sift/#/strat_name/${strat_name.strat_name_id}">${strat_name.rank_name}</a> ` + } + + return html_str; + } + if(macro_strat_data.mapData && macro_strat_data.mapData.length) { - var popup = L.popup() + L.popup() .setLatLng([lat, lon]) .setContent(` <div> <div> - <span>Age:</span> + <span><b>Unit: </b></span> + <span>${macro_strat_data.mapData[0].name}</span> + </div> + <div> + <span><b>Age: </b></span> <span>${macro_strat_data.mapData[0].age}</span> </div> + <div> + <span><b>Source:</b></span> + ${macro_strat_data.mapData[0].ref.authors}, ${macro_strat_data.mapData[0].ref.ref_title}: ${macro_strat_data.mapData[0].ref.ref_source}, ${macro_strat_data.mapData[0].ref.isbn_doi} ${macro_strat_data.mapData[0].ref.source_id} / ${macro_strat_data.mapData[0].map_id} + </div> + <div> + <span><b>Macrostrat ID: </b></span> + ${loop_strat_names(macro_strat_data.mapData[0])} + </div> </div>`) .openOn(this.mapLayer); } From 5cbce0910b093e536d8116d5950df228dc491492 Mon Sep 17 00:00:00 2001 From: MuchQuak <loganpwilt@gmail.com> Date: Tue, 7 Jan 2025 12:28:39 -0800 Subject: [PATCH 3/6] External linking on strat_names --- js/symb/leafletMap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/symb/leafletMap.js b/js/symb/leafletMap.js index 6814808e7f..85476ce5a8 100644 --- a/js/symb/leafletMap.js +++ b/js/symb/leafletMap.js @@ -166,7 +166,7 @@ class LeafletMap { const loop_strat_names = (data) => { let html_str = ""; for(let strat_name of data.macrostrat.strat_names) { - html_str += `<a href="https://macrostrat.org/sift/#/strat_name/${strat_name.strat_name_id}">${strat_name.rank_name}</a> ` + html_str += `<a target="_blank" href="https://macrostrat.org/sift/#/strat_name/${strat_name.strat_name_id}">${strat_name.rank_name}</a> ` } return html_str; From 7dcfb833ee53c2cf0b8716697a19591e52c89a2f Mon Sep 17 00:00:00 2001 From: MuchQuak <loganpwilt@gmail.com> Date: Fri, 10 Jan 2025 14:48:55 -0800 Subject: [PATCH 4/6] style adjustments --- js/symb/leafletMap.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/js/symb/leafletMap.js b/js/symb/leafletMap.js index 85476ce5a8..7721c0e7da 100644 --- a/js/symb/leafletMap.js +++ b/js/symb/leafletMap.js @@ -176,21 +176,21 @@ class LeafletMap { L.popup() .setLatLng([lat, lon]) .setContent(` - <div> + <div style="font-size:1rem"> <div> - <span><b>Unit: </b></span> + <span style="font-weight:bold">Unit: </span> <span>${macro_strat_data.mapData[0].name}</span> </div> <div> - <span><b>Age: </b></span> + <span style="font-weight:bold">Age: </span> <span>${macro_strat_data.mapData[0].age}</span> </div> - <div> - <span><b>Source:</b></span> + <div style="font-size:0.8rem"> + <span style="font-weight:bold">Source:</span> ${macro_strat_data.mapData[0].ref.authors}, ${macro_strat_data.mapData[0].ref.ref_title}: ${macro_strat_data.mapData[0].ref.ref_source}, ${macro_strat_data.mapData[0].ref.isbn_doi} ${macro_strat_data.mapData[0].ref.source_id} / ${macro_strat_data.mapData[0].map_id} </div> - <div> - <span><b>Macrostrat ID: </b></span> + <div style="margin-top:1rem"> + <span style="font-weight:bold">Macrostrat matched names: </span> ${loop_strat_names(macro_strat_data.mapData[0])} </div> </div>`) @@ -248,7 +248,7 @@ class LeafletMap { "Satellite": Esri_WorldImagery, }; const overlays = { - "Macro Strat": L.layerGroup([macro_strat]) + "Macrostrat": L.layerGroup([macro_strat]) } L.control.layers(layers, overlays).addTo(this.mapLayer); } From 2fbf226dc2071f83163cb6f2dea3a40b12ae0e35 Mon Sep 17 00:00:00 2001 From: MuchQuak <loganpwilt@gmail.com> Date: Fri, 10 Jan 2025 15:08:12 -0800 Subject: [PATCH 5/6] better error handling on popup construction --- js/symb/leafletMap.js | 48 ++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/js/symb/leafletMap.js b/js/symb/leafletMap.js index 7721c0e7da..3cd4f583cf 100644 --- a/js/symb/leafletMap.js +++ b/js/symb/leafletMap.js @@ -173,26 +173,42 @@ class LeafletMap { } if(macro_strat_data.mapData && macro_strat_data.mapData.length) { + let content = "" + + if(macro_strat_data.mapData[0].name) { + content += `<div> + <span style="font-weight:bold">Unit: </span> + <span>${macro_strat_data.mapData[0].name}</span> + </div>`; + } + + if(macro_strat_data.mapData[0].age) { + content+= `<div> + <span style="font-weight:bold">Age: </span> + <span>${macro_strat_data.mapData[0].age}</span> + </div>`; + + } + + if(macro_strat_data.mapData[0].ref) { + content += `<div style="font-size:0.8rem"> + <span style="font-weight:bold">Source:</span> + ${macro_strat_data.mapData[0].ref.authors}, ${macro_strat_data.mapData[0].ref.ref_title}: ${macro_strat_data.mapData[0].ref.ref_source}, ${macro_strat_data.mapData[0].ref.isbn_doi} ${macro_strat_data.mapData[0].ref.source_id} / ${macro_strat_data.mapData[0].map_id} + </div>`; + } + + if(macro_strat_data.mapData[0].macrostrat && macro_strat_data.mapData[0].macrostrat.strat_names && macro_strat_data.mapData[0].macrostrat.strat_names.length) { + content += `<div style="margin-top:1rem"> + <span style="font-weight:bold">Macrostrat matched names: </span> + ${loop_strat_names(macro_strat_data.mapData[0])} + </div>`; + } + L.popup() .setLatLng([lat, lon]) .setContent(` <div style="font-size:1rem"> - <div> - <span style="font-weight:bold">Unit: </span> - <span>${macro_strat_data.mapData[0].name}</span> - </div> - <div> - <span style="font-weight:bold">Age: </span> - <span>${macro_strat_data.mapData[0].age}</span> - </div> - <div style="font-size:0.8rem"> - <span style="font-weight:bold">Source:</span> - ${macro_strat_data.mapData[0].ref.authors}, ${macro_strat_data.mapData[0].ref.ref_title}: ${macro_strat_data.mapData[0].ref.ref_source}, ${macro_strat_data.mapData[0].ref.isbn_doi} ${macro_strat_data.mapData[0].ref.source_id} / ${macro_strat_data.mapData[0].map_id} - </div> - <div style="margin-top:1rem"> - <span style="font-weight:bold">Macrostrat matched names: </span> - ${loop_strat_names(macro_strat_data.mapData[0])} - </div> + ${content} </div>`) .openOn(this.mapLayer); } From f69f861c5a86d348920bb2e01cc03e9cb3bdedab Mon Sep 17 00:00:00 2001 From: MuchQuak <loganpwilt@gmail.com> Date: Fri, 10 Jan 2025 15:18:25 -0800 Subject: [PATCH 6/6] Word adjustment for strat_names label --- js/symb/leafletMap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/symb/leafletMap.js b/js/symb/leafletMap.js index 3cd4f583cf..47ea1d81e1 100644 --- a/js/symb/leafletMap.js +++ b/js/symb/leafletMap.js @@ -199,7 +199,7 @@ class LeafletMap { if(macro_strat_data.mapData[0].macrostrat && macro_strat_data.mapData[0].macrostrat.strat_names && macro_strat_data.mapData[0].macrostrat.strat_names.length) { content += `<div style="margin-top:1rem"> - <span style="font-weight:bold">Macrostrat matched names: </span> + <span style="font-weight:bold">Macrostrat matched units: </span> ${loop_strat_names(macro_strat_data.mapData[0])} </div>`; }