Plot recent packets on map.

This commit is contained in:
W1CDN 2024-01-15 17:04:13 -06:00
parent 260e946ab6
commit 3758ac21cb
5 changed files with 123 additions and 61 deletions

2
.gitignore vendored
View File

@ -2,3 +2,5 @@
config.ini config.ini
*.db *.db
*.log *.log
/temp/*
*.pyc

View File

@ -113,12 +113,31 @@ def index():
station['time_ago'] = timeago.format(station['last_heard_unix'], datetime.datetime.now()) station['time_ago'] = timeago.format(station['last_heard_unix'], datetime.datetime.now())
# Map stuff
frames_locs = list(filter(lambda x: x['latitude'] != None, frames))
# Make a GeoJSON
geojs = json.dumps({
"type": "FeatureCollection",
"features":[
{
"type":"Feature",
"geometry": {
"type":"Point",
"coordinates":[frame['longitude'], frame['latitude']],
},
"properties":frame,
} for frame in frames_locs
]
})
return render_template('index.html', return render_template('index.html',
station_call = config['Settings']['station_call'], station_call = config['Settings']['station_call'],
station_lat = config['Settings']['station_lat'], station_lat = config['Settings']['station_lat'],
station_lon = config['Settings']['station_lon'], station_lon = config['Settings']['station_lon'],
frames = frames, frames = frames,
stations = stations) stations = stations,
geojs = geojs)
@api_app.route('/map') @api_app.route('/map')
def map(): def map():
@ -126,31 +145,50 @@ def map():
# Get the default list of frames from the API # Get the default list of frames from the API
frames = json.loads(requests.get(config['Settings']['base_url']+"/packets").text)['data'] frames = json.loads(requests.get(config['Settings']['base_url']+"/packets").text)['data']
# Make markers for all the frames frames_locs = list(filter(lambda x: x['latitude'] != None, frames))
id_counter = 0
markers = ''
marker_ids = []
for frame in frames:
if frame['latitude'] != None:
# Create unique ID for each marker
idd = 'frame' + str(id_counter)
id_counter += 1
# Create each marker # Make a GeoJSON
markers += "var {idd} = L.marker([{latitude}, {longitude}]);\ geojs = json.dumps({
{idd}.addTo(map).bindTooltip('{from_ssid}', permanent=true).openTooltip();".format(idd=idd, latitude=frame['latitude'],\ "type": "FeatureCollection",
longitude=frame['longitude'], "features":[
from_ssid=frame['from'], {
created=frame['created']) "type":"Feature",
# Try to make a list of markers for Leaflet, but not working "geometry": {
marker_ids.append(idd) "type":"Point",
"coordinates":[frame['longitude'], frame['latitude']],
},
"properties":frame,
} for frame in frames_locs
]
})
# Make markers for all the frames
# id_counter = 0
# markers = ''
# marker_ids = []
# for frame in frames:
# if frame['latitude'] != None:
# # Create unique ID for each marker
# idd = 'frame' + str(id_counter)
# id_counter += 1
# # Create each marker
# markers += "var {idd} = L.marker([{latitude}, {longitude}]);\
# {idd}.addTo(map).bindTooltip('{from_ssid}', permanent=true).openTooltip();".format(idd=idd, latitude=frame['latitude'],\
# longitude=frame['longitude'],
# from_ssid=frame['from'],
# created=frame['created'])
# # Try to make a list of markers for Leaflet, but not working
# marker_ids.append(idd)
return render_template('map.html', return render_template('map.html',
station_lat = config['Settings']['station_lat'], station_lat = config['Settings']['station_lat'],
station_lon = config['Settings']['station_lon'], station_lon = config['Settings']['station_lon'],
markers = markers, station_call = config['Settings']['station_call'],
marker_ids = marker_ids) #markers = markers,
geojs = geojs)
class Packets(Resource): class Packets(Resource):
def get(self): def get(self):

View File

@ -4,18 +4,58 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>{{station_call}} Status</title> <title>{{station_call}} Status</title>
<!-- Leaflet's CSS -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin=""/>
<!-- Make sure you put this AFTER Leaflet's CSS -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
crossorigin=""></script>
<style> <style>
table, th, td { table, th, td {
border: 1px solid black; border: 1px solid black;
} }
#map { height: 250px; }
</style> </style>
</head> </head>
<body> <body>
<div style="width: 100%; overflow: hidden;">
<div style="width: 50%; float: left;">
<h1>{{station_call}} Status</h1> <h1>{{station_call}} Status</h1>
Station location: {{station_lat}}, {{station_lon}} Station location: {{station_lat}}, {{station_lon}}
<h2> About </h2> <h2> About </h2>
This is a work in progress. See <a href="https://amiok.net/gitea/W1CDN/aprs_tool">https://amiok.net/gitea/W1CDN/aprs_tool</a> for usage. This is a work in progress. See <a href="https://amiok.net/gitea/W1CDN/aprs_tool">https://amiok.net/gitea/W1CDN/aprs_tool</a> for usage.
</div>
<div style="margin-left: 50%;">
<div id="map"></div>
<script>
var map = L.map('map').setView([{{station_lat}}, {{station_lon}}], 10);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'}).addTo(map);
//{{markers|safe}}
// Show station location
var station = L.marker([{{station_lat}}, {{station_lon}}]).addTo(map).bindTooltip('{{station_call}}', permanent=true).openTooltip();
// Show GeoJSON of markers
var group = L.geoJSON({{geojs|safe}},
{
style: function (feature) {
return {color: feature.properties.color};
}
}).bindTooltip(function (layer) {
return 'Object '+layer.feature.properties.object_name+' from '+layer.feature.properties.from;
}, permanent=true).addTo(map);
// Zoom to show all
map.fitBounds(group.getBounds().pad(0.3));
</script>
</div>
</div>
<h2> Recent RF Packets </h2> <h2> Recent RF Packets </h2>
<table> <table>
@ -40,6 +80,8 @@ This is a work in progress. See <a href="https://amiok.net/gitea/W1CDN/aprs_tool
{% endfor %} {% endfor %}
</table> </table>
<h2> Recent Stations </h2> <h2> Recent Stations </h2>
<table> <table>
<tr> <tr>

View File

@ -19,7 +19,23 @@
var map = L.map('map').setView([{{station_lat}}, {{station_lon}}], 10); var map = L.map('map').setView([{{station_lat}}, {{station_lon}}], 10);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'}).addTo(map); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'}).addTo(map);
{{markers|safe}} //{{markers|safe}}
// Show station location
var station = L.marker([{{station_lat}}, {{station_lon}}]).addTo(map).bindTooltip('{{station_call}}', permanent=true).openTooltip();
// Show GeoJSON of markers
var group = L.geoJSON({{geojs|safe}},
{
style: function (feature) {
return {color: feature.properties.color};
}
}).bindTooltip(function (layer) {
return 'Object '+layer.feature.properties.object_name+' from '+layer.feature.properties.from;
}, permanent=true).addTo(map);
// Zoom to show all
map.fitBounds(group.getBounds().pad(0.2));
</script> </script>
</body> </body>

View File

@ -1,36 +0,0 @@
# Learn how to update database
import sqlite3
def get_db_connection():
conn = sqlite3.connect('database.db')
conn.row_factory = sqlite3.Row
return conn
conn = get_db_connection()
# Grab a random row from frames table and pretend it is new
cur = conn.cursor()
cur.execute("SELECT [from], id, created_unix FROM frames ORDER BY RANDOM() LIMIT 1;")
rows = cur.fetchall()
results = dict(rows[0])
values = ', '.join('"%s"' % w for w in results.values())
# Build query
# "from" is wrappedin [] because it is a reserved word and using '' doesn't work.
query3 = "INSERT INTO stations ([from], frames_id, last_heard_unix, count) \
VALUES("+values+", 1) \
ON CONFLICT([from]) \
DO UPDATE SET count = count + 1;"
# example https://stackoverflow.com/a/50718957/2152245
# query2 = "INSERT INTO stations ([from], frames_id, last_heard_unix, count) \
# VALUES('KC9TZN-8', 4068, 1687623864, 1) \
# ON CONFLICT([from]) \
# DO UPDATE SET count = count + 1;"
conn.execute(query3)
conn.commit()
conn.close()