1

Repeater map

This commit is contained in:
Evan Pratten 2023-12-18 23:52:23 -05:00
parent 188e6b7da3
commit 9a872cd7aa
4 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,47 @@
---
title: Local Repeaters
extra:
css_import:
- https://unpkg.com/leaflet@1.9.4/dist/leaflet.css
head_js_import:
- https://unpkg.com/leaflet@1.9.4/dist/leaflet.js
js_import:
- /js/radio/local-repeaters.js
---
This page keeps track of local repeaters. See incorrect data here? Please [contact me](/contact).
## Analog Repeaters
<div id="analog-repeater-map" style="width:100%; aspect-ratio: 4/3; margin-bottom: 1em;"></div>
<div id="analog-repeaters" style="width:max-content;max-width:100%;margin:auto;overflow:scroll;">
| Callsign | Downlink | Uplink | PL | Coverage | Reach | Links |
|----------|----------|---------|-------|-----------------------------------------------------------|--------|----------------|
| VA3ATL | 444.775 | 449.775 | 110.9 | <span lat="43.648" lon="-79.3860">GTA</span> | 70 km | |
| VE3WOO | 443.900 | 448.900 | 127.3 | <span lat="43.647" lon="-79.3821">GTA</span> | 50 km | |
| VE3WOO | 442.750 | 447.750 | 103.5 | <span lat="43.666" lon="-79.4166">GTA</span> | | VE3WOO |
| VE3WOO | 444.175 | 449.175 | 103.5 | <span lat="43.882" lon="-79.9325">GTA</span> | 50 km | VE3WOO |
| VE3ZOE | 443.075 | 448.075 | | <span lat="43.249" lon="-79.8346">Golden Horseshoe</span> | 100 km | |
| VE3GRW | 442.900 | 447.900 | 107.2 | <span lat="43.106" lon="-79.1126">Golden Horseshoe</span> | 200 km | |
| VE3YYZ | 443.050 | 448.050 | 156.7 | <span lat="43.648" lon="-79.3821">Toronto</span> | 35 km | VE3RTR |
| VE3OKR | 442.450 | 447.450 | | <span lat="43.467" lon="-79.6875">Oakville</span> | 40 km | |
| VE3RSB | 444.825 | 449.825 | 131.8 | <span lat="43.360" lon="-79.8580">Burlington</span> | 40 km | |
| VE3ADT | 444.125 | 449.125 | 131.8 | <span lat="43.587" lon="-79.9825">Milton</span> | 45 km | |
| VE3MIS | 145.430 | 144.830 | 103.5 | <span lat="43.593" lon="-79.6350">Mississauga</span> | 20 km | |
| VE3YRA | 145.350 | 144.750 | 103.5 | <span lat="44.027" lon="-79.3460">GTA</span> | 75 km | |
| VE3SKY | 146.985 | 146.385 | 103.5 | <span lat="43.665" lon="-79.4166">GTA</span> | 70 km | |
| VE3GYQ | 145.350 | 144.750 | 114.8 | <span lat="42.983" lon="-81.2501">London</span> | 50 km | |
| VE3TTT | 147.180 | 147.780 | 114.8 | <span lat="42.984" lon="-81.2442">London</span> | 75 km | VE3SUE |
| VE3SUE | 444.400 | 449.400 | 114.8 | <span lat="42.983" lon="-81.2500">London</span> | 50 km | |
| VA3FEZ | 444.100 | 449.100 | 114.8 | <span lat="42.956" lon="-81.2776">London</span> | | VE3MMX |
| VE3MMX | 147.225 | 147.825 | 114.8 | <span lat="42.739" lon="-81.3454">St Thomas</span> | 35 km | |
| VE3MMX | 443.750 | 448.750 | 114.8 | <span lat="42.739" lon="-81.3454">St Thomas</span> | | |
| VE3TCB | 146.940 | 146.340 | 114.8 | <span lat="43.163" lon="-81.8570">Grand Bend</span> | 50 km | VE3SUE, VE3SRT |
| VE3SRT | 442.050 | 447.050 | 114.8 | <span lat="43.313" lon="-81.7554">Grand Bend</span> | 50 km | VE3SUE |
| VE3MCR | 147.000 | 147.600 | 114.8 | <span lat="43.186" lon="-81.4075">Grand Bend</span> | | VE3SUE |
| VE3RGB | 146.760 | 146.160 | 114.8 | <span lat="43.335" lon="-81.7372">Grand Bend</span> | | VE3SUE |
| VE3RTR | 444.975 | 449.975 | 162.2 | <span lat="44.057" lon="-78.1328">Peterborough</span> | 65 km | |
</div>

BIN
static/dist/icons8/antenna.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,83 @@
// Configure the maps (center on Toronto)
var analog_rpt_map = L.map('analog-repeater-map').setView([43.6532, -79.3832], 8);
// Add OSM base map
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 18
}).addTo(analog_rpt_map);
// Process repeater tables
var analog_repeaters = Array.from(document.querySelectorAll("#analog-repeaters tbody tr")).map(function (row) {
console.log(row);
return {
callsign: row.cells[0].innerText,
downlink: row.cells[1].innerText,
uplink: row.cells[2].innerText,
pl_tone: row.cells[3].innerText,
grid: row.cells[4].innerText,
latitude: row.cells[4].querySelector("span").attributes["lat"].value,
longitude: row.cells[4].querySelector("span").attributes["lon"].value,
reach: row.cells[5].innerText.split(" ")[0],
linked_repeaters: row.cells[6].innerText.split(", ")
};
});
// Add repeater markers
analog_repeaters.forEach(function (repeater) {
console.log(repeater);
var marker = L.marker([repeater.latitude, repeater.longitude]).addTo(analog_rpt_map);
marker.bindPopup(`<b>${repeater.callsign}</b>`);
// marker.setIcon(L.divIcon({
// className: 'repeater-marker',
// iconSize: [16, 16]
// }));
});
// Draw the coverage areas
analog_repeaters.forEach(function (repeater) {
if (repeater.reach != "") {
var coverage = L.circle([repeater.latitude, repeater.longitude], {
color: 'gray',
opacity: 0.25,
fillColor: 'gray',
fillOpacity: 0.05,
radius: repeater.reach * 1000
}).addTo(analog_rpt_map);
coverage.bindPopup(`${repeater.callsign} coverage`);
}
});
// Draw the repeater links
analog_repeaters.forEach(function (repeater) {
repeater.linked_repeaters.forEach(function (linked_repeater) {
// Find that repeater
var linked_repeater_obj = analog_repeaters.find(function (obj) {
return obj.callsign === linked_repeater;
});
if (linked_repeater_obj) {
var link = L.polyline([
[repeater.latitude, repeater.longitude],
[linked_repeater_obj.latitude, linked_repeater_obj.longitude]
], {
color: 'gray',
weight: 2,
opacity: 0.75
}).addTo(analog_rpt_map);
link.bindPopup(`${repeater.callsign} to ${linked_repeater_obj.callsign}`);
}
});
});
// Add a custom CSS style for the markers
// document.head.insertAdjacentHTML('beforeend', `
// <style>
// .repeater-marker {
// background-image: url("/dist/icons8/antenna.png");
// background-size: cover;
// background-position: center;
// border: 1px solid grey;
// border-radius: 50%;
// }
// </style>`
// );

View File

@ -58,6 +58,11 @@
<link rel="stylesheet" href="{{url}}"> <!-- Requested by Page -->
{% endfor %}
{# Allow pages to import custom Head JS if they need #}
{% for url in extra.head_js_import | default(value=[]) %}
<script src="{{url}}"></script> <!-- Requested by Page -->
{% endfor %}
<link rel="stylesheet" href="/styles.css">
<!--noformat-->
{% endblock head %}