Aurora As heatmap

master
Tag Loomis 2024-08-12 16:47:12 -07:00
rodzic ffe0bc5468
commit f907bc9e09
3 zmienionych plików z 135 dodań i 51 usunięć

Wyświetl plik

@ -611,9 +611,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td id="mufTitle" colspan="3">Maximum Usable Frequency</td>
<td id="fof2Title" colspan="3">Critical Frequency NVIS</td>
<td id="epiTitle" colspan="3">Es Probability Index</td>
<td id="aufTitle" colspan="3">Aurora Forecast</td>
</tr>
<tr id="epiTimeTr">
<td colspan="3" align="center" id="epiTimeTd"></td>
<tr id="epiTimeTr"><td colspan="3" align="center" id="epiTimeTd"></td></tr>
<tr id="aufForTimeTr">
<td colspan="3" align="center" id="aufForTimeTd"></td>
</tr>
<tr id="epiTimeOffsetTr">
<td id="epiTimeOffsetTd">0</td>
@ -646,6 +648,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
rgb(170,219,209) 50%,
rgb(253,246,171) 100%);width: 170px;" class="barGraph"></td>
</tr>
<tr id="fof2BarTr">
<td colspan="3" style="background: linear-gradient(90deg,
rgb(184,159,190) 0%,
rgb(170,219,209) 50%,
rgb(253,246,171) 100%);width: 170px;" class="barGraph"></td>
</tr>
<tr id="mufRangeTr">
<td align="left">&lt;5</td>
<td align="right">14</td>

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 8.4 KiB

Wyświetl plik

@ -630,6 +630,7 @@ GT.predImageArray[0] = "./img/no-pred.png";
GT.predImageArray[1] = "./img/muf.png";
GT.predImageArray[2] = "./img/fof2.png";
GT.predImageArray[3] = "./img/epi.png";
GT.predImageArray[4] = "./img/auf.png";
GT.gridViewArray = Array();
GT.gridViewArray[1] = "Live";
@ -4228,13 +4229,13 @@ function timeNowSec()
return parseInt(Date.now() / 1000);
}
function createGlobalHeatmapLayer(name, radius, blur)
function createGlobalHeatmapLayer(name, blur, radius)
{
GT.layerSources[name] = new ol.source.Vector({});
GT.layerVectors[name] = new ol.layer.Heatmap({
source: GT.layerSources[name],
blur: 20,
radius: 15,
blur: blur,
radius: radius,
zIndex: Object.keys(GT.layerVectors).length + 1
});
GT.layerVectors[name].set("name", name);
@ -4426,7 +4427,7 @@ function initMap()
];
createGlobalMapLayer("award");
createGlobalHeatmapLayer("pskHeat", 10, 5);
createGlobalHeatmapLayer("pskHeat", 20, 15);
createGlobalMapLayer("qso");
createGlobalMapLayer("qsoPins");
createGlobalMapLayer("live");
@ -15188,7 +15189,10 @@ GT.epiTimeValue = 0;
function changePredOpacityValue()
{
predOpacityTd.innerHTML = GT.mapSettings.predOpacity = predOpacityValue.value;
predLayerRefreh();
if (GT.PredLayer != null)
{
GT.PredLayer.setOpacity(Number(GT.mapSettings.predOpacity));
}
}
function changeEpiTimeValue()
@ -15230,7 +15234,7 @@ function createPredSource()
{
return new ol.source.XYZ({
url: getCurrentPredURL(),
attributions: GT.mapSettings.predMode != 3 ? "<a href='https://prop.kc2g.com/acknowledgments/' target='_blank' title='Visit prop.kc2g.com' class='roundBorder'>KC2G</a>" : "<a href='https://www.propquest.co.uk/about.php' target='_blank' title='Visit PROPquest.co.uk' class='roundBorder'>PROPquest</a>",
attributions: GT.mapSettings.predMode != 3 ? "<a href='https://prop.kc2g.com/acknowledgments/' target='_blank' title='Visit prop.kc2g.com' class='roundBorder'>KC2G</a>" : GT.mapSettings.predMode == 3 ? "<a href='https://www.propquest.co.uk/about.php' target='_blank' title='Visit PROPquest.co.uk' class='roundBorder'>PROPquest</a>" : "NOAA",
minZoom: 0,
maxZoom: 0
});
@ -15238,13 +15242,37 @@ function createPredSource()
function createPredLayer()
{
var layerVector = new ol.layer.Tile({
source: createPredSource(),
opacity: Number(GT.mapSettings.predOpacity),
visible: true,
zIndex: 0
});
var layerVector;
if (GT.mapSettings.predMode != 4)
{
layerVector = new ol.layer.Tile({
source: createPredSource(),
opacity: Number(GT.mapSettings.predOpacity),
visible: true,
zIndex: 0
});
}
else
{
var source = new ol.source.Vector({});
layerVector = new ol.layer.Heatmap({
source: source,
opacity: Number(GT.mapSettings.predOpacity),
visible: true,
gradient: ['#f00', '#ff0', '#0f0', '#0ff', '#00f'],
blur: 30,
radius: 8,
zIndex: 0
});
if (GT.predLayerTimeout != null)
{
nodeTimers.clearTimeout(GT.predLayerTimeout);
GT.predLayerTimeout = null;
}
GT.predLayerTimeout = nodeTimers.setTimeout(predLayerRefreh, 300 * 1000);
}
layerVector.set("name", "Pred");
return layerVector;
@ -15252,7 +15280,7 @@ function createPredLayer()
function cyclePredLayer()
{
GT.mapSettings.predMode = (GT.mapSettings.predMode + 1) % 4;
GT.mapSettings.predMode = (GT.mapSettings.predMode + 1) % 5;
displayPredLayer();
saveMapSettings();
}
@ -15260,23 +15288,10 @@ function cyclePredLayer()
function predInit()
{
GT.predViews = Array();
GT.predViews[1] =
{
on: { mufTitle, mufBarTr, mufRangeTr },
off: { fof2Title, epiTitle, epiTimeTr, epiTimeOffsetTr, epiBarTr, epiRangeTr, fof2RangeTr }
};
GT.predViews[2] =
{
on: { fof2Title, mufBarTr, fof2RangeTr },
off: { mufTitle, epiTitle, epiTimeTr, epiTimeOffsetTr, epiBarTr, epiRangeTr, mufRangeTr }
};
GT.predViews[3] =
{
on: { epiTitle, epiTimeTr, epiTimeOffsetTr, epiBarTr, epiRangeTr },
off: { mufTitle, fof2Title, mufBarTr, mufRangeTr, fof2RangeTr }
};
GT.predViews[1] = { mufTitle, mufBarTr, mufRangeTr };
GT.predViews[2] = { fof2Title, fof2BarTr, fof2RangeTr }
GT.predViews[3] = { epiTitle, epiTimeTr, epiTimeOffsetTr, epiBarTr, epiRangeTr };
GT.predViews[4] = { aufTitle, aufForTimeTr };
}
function displayPredLayer()
@ -15285,24 +15300,15 @@ function displayPredLayer()
{
predDiv.style.display = "block";
predButton.style.display = "inline-block";
let view = GT.predViews[GT.mapSettings.predMode];
for (var item in view.on)
for (var viewIndex in GT.predViews)
{
view.on[item].style.display = "";
}
for (var item in view.off)
{
view.off[item].style.display = "none";
}
if (GT.PredLayer == null)
{
GT.PredLayer = createPredLayer();
GT.map.addLayer(GT.PredLayer);
}
else
{
predLayerRefreh();
for (var html in GT.predViews[viewIndex])
{
GT.predViews[viewIndex][html].style.display = viewIndex == GT.mapSettings.predMode ? "" : "none";
}
}
predLayerRefreh();
}
else
{
@ -15329,11 +15335,81 @@ function displayPredLayer()
function predLayerRefreh()
{
if (GT.PredLayer != null && GT.mapSettings.offlineMode == false)
if (GT.mapSettings.offlineMode == false)
{
GT.PredLayer.setSource(createPredSource());
GT.PredLayer.setOpacity(Number(GT.mapSettings.predOpacity));
if (GT.PredLayer)
{
GT.map.removeLayer(GT.PredLayer);
GT.PredLayer = null;
}
GT.PredLayer = createPredLayer();
GT.map.addLayer(GT.PredLayer);
}
if (GT.mapSettings.predMode == 4)
{
aufForTimeTd.innerHTML = "...retrieving data...";
getAuroraJson();
}
}
function getAuroraJson()
{
getBuffer(
"https://services.swpc.noaa.gov/json/ovation_aurora_latest.json",
handleAuroraResponse,
null,
"https",
443
);
}
function square(long, lat)
{
var thing = new ol.geom.Polygon([
[
ol.proj.fromLonLat([long, lat]),
ol.proj.fromLonLat([long, lat+1]),
ol.proj.fromLonLat([long+1, lat+1]),
ol.proj.fromLonLat([long+1, lat])
]
]);
var square = new ol.Feature({
geometry: thing
});
return square;
}
function handleAuroraResponse(buffer)
{
if (GT.PredLayer != null && GT.mapSettings.predMode == 4)
{
var json = String(buffer);
json = JSON.parse(json);
GT.PredLayer.getSource().clear();
aufForTimeTd.innerHTML = "<font color='lightblue'>" + userTimeString(Date.parse(json["Forecast Time"])) + "</font>";
let count = 0;
for (let where in json.coordinates)
{
let lat = Math.abs(json.coordinates[where][1]);
if (json.coordinates[where][2] > 0 && lat > 2 && lat < 86)
{
count++;
let toPoint = ol.proj.fromLonLat([(json.coordinates[where][0] + 180) % 360 - 180, json.coordinates[where][1]]);
let lonLat = new ol.geom.Point(toPoint);
let pointFeature = new ol.Feature({
geometry: lonLat,
weight: json.coordinates[where][2] / 100
});
GT.PredLayer.getSource().addFeature(pointFeature);
}
}
console.log(count);
}
}
nodeTimers.setInterval(refreshSpotsNoTx, 300000);