clean
This commit is contained in:
47
gengeo.py
47
gengeo.py
@@ -1,47 +0,0 @@
|
||||
import psycopg2
|
||||
import json
|
||||
|
||||
# Connect to your PostgreSQL database
|
||||
conn = psycopg2.connect(
|
||||
host="localhost",
|
||||
database="nws",
|
||||
user="nws",
|
||||
password="nws"
|
||||
)
|
||||
|
||||
# Create a cursor object
|
||||
cur = conn.cursor()
|
||||
|
||||
# Execute the SQL query
|
||||
cur.execute("""
|
||||
SELECT json_build_object(
|
||||
'type', 'FeatureCollection',
|
||||
'features', json_agg(
|
||||
json_build_object(
|
||||
'type', 'Feature',
|
||||
'geometry', ST_AsGeoJSON(geom)::json,
|
||||
'properties', json_build_object(
|
||||
'county', countyname,
|
||||
'state', state,
|
||||
'lat', lat,
|
||||
'lon', lon
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
FROM county
|
||||
WHERE cwa = 'RLX';
|
||||
""")
|
||||
|
||||
# Fetch the result
|
||||
geojson_result = cur.fetchone()[0]
|
||||
|
||||
# Print the GeoJSON result
|
||||
outfile = open("rlxtest.json", "w")
|
||||
json.dump(geojson_result,outfile, indent=2)
|
||||
|
||||
# Close the cursor and connection
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
|
||||
48
geo.py
48
geo.py
@@ -1,48 +0,0 @@
|
||||
#You can convert panoid to lat/lon using a free API call https://maps.googleapis.com/maps/api/streetview/metadata?pano=PANOID&key=YOURAPIKEY
|
||||
|
||||
|
||||
#https://maps.googleapis.com/maps/api/streetview/metadata?pano=onUr8119UohoEeRXfBNArQ&key=AIzaSyDNmQaLwMoVluAJ8PMIZZyMUfp3hlbsndw
|
||||
|
||||
import requests
|
||||
import os
|
||||
import json
|
||||
import webbrowser
|
||||
|
||||
|
||||
S = requests.Session()
|
||||
apikey = 'AIzaSyDNmQaLwMoVluAJ8PMIZZyMUfp3hlbsndw'
|
||||
|
||||
|
||||
|
||||
def geocheat(panoidurl):
|
||||
|
||||
query = requests.utils.urlparse(panoidurl).query
|
||||
params = dict(x.split('=') for x in query.split('&'))
|
||||
|
||||
if 'panoid' in params:
|
||||
panoid = params['panoid']
|
||||
|
||||
url = 'https://maps.googleapis.com/maps/api/streetview/metadata?pano='+panoid+'&key=AIzaSyDNmQaLwMoVluAJ8PMIZZyMUfp3hlbsndw'
|
||||
dataresponse = json.loads(S.get(url).text)
|
||||
#r = requests.get(url, timeout=3)
|
||||
#if r.status_code == 200:
|
||||
lat = dataresponse['location']['lat']
|
||||
lon = dataresponse['location']['lng']
|
||||
|
||||
|
||||
#print(lat,lon)
|
||||
# print(r.content)
|
||||
#print(dataresponse)
|
||||
mapurl = "https://maps.google.com/maps?q=loc:" + str(lat) + "+" + str(lon)
|
||||
|
||||
#os.system("start \"\" + mapurl)
|
||||
webbrowser.open(mapurl, new = 1)
|
||||
|
||||
poop = True
|
||||
while poop:
|
||||
|
||||
cheatme = input("Enter URL with panoid: ")
|
||||
geocheat(cheatme)
|
||||
|
||||
|
||||
|
||||
66
gr2power.py
66
gr2power.py
@@ -1,66 +0,0 @@
|
||||
import requests
|
||||
import json
|
||||
import psycopg2
|
||||
import psycopg2.extensions
|
||||
from datetime import datetime, timezone
|
||||
import re
|
||||
from shapely import wkt
|
||||
|
||||
def generate_gr2_triangle_placefile(filename="power_outages_gr2.txt"):
|
||||
"""
|
||||
Generates a GR2Analyst placefile using Triangles and Text for power outages.
|
||||
|
||||
Args:
|
||||
filename (str): The name of the placefile to create.
|
||||
"""
|
||||
try:
|
||||
conn = psycopg2.connect(host='localhost', database='nws', user='nws', password='nws')
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute("SELECT startguess,outagen,lastchange,st_astext(realareageom),lat,lon,cause, outagen FROM power WHERE cwa = 'RLX' and active = true") # Include outagen in select
|
||||
outages = cursor.fetchall()
|
||||
|
||||
with open(filename, "w") as pf:
|
||||
pf.write("Refresh: 1\n")
|
||||
pf.write("Threshold: 999 nautical_miles\n")
|
||||
pf.write("Title: Power Outages (RLX CWA) - Triangles\n")
|
||||
pf.write("Font: 1, 11, 0, \"Courier New\"\n")
|
||||
pf.write("Color: 255 0 0\n") # Red for triangles (outage area)
|
||||
|
||||
for outage in outages:
|
||||
startguess, outagen_num_db, lastchange, realareageom_wkt, lat, lon, cause, outagen_display_num = outage # Get outagen as outagen_display_num
|
||||
|
||||
# Format hover text (optional for triangles, but can add later if needed)
|
||||
hover_text = f"Outage #{outagen_display_num}\\n" # Use outagen_display_num for display
|
||||
hover_text += f"Cause: {cause}\\n"
|
||||
hover_text += f"Last Update: {lastchange.strftime('%Y-%m-%d %H:%M:%Z UTC')}"
|
||||
|
||||
# Triangle vertices - create a small triangle around the outage point
|
||||
triangle_lat_offset = 0.02 # Adjust for triangle size (latitude offset)
|
||||
triangle_lon_offset = 0.03 # Adjust for triangle size (longitude offset)
|
||||
|
||||
pf.write("Triangles:\n")
|
||||
pf.write(f" {lat - triangle_lat_offset}, {lon - triangle_lon_offset}\n") # Vertex 1: Southwest
|
||||
pf.write(f" {lat + triangle_lat_offset}, {lon - triangle_lon_offset}\n") # Vertex 2: Southeast
|
||||
pf.write(f" {lat}, {lon + triangle_lon_offset}\n") # Vertex 3: North
|
||||
pf.write("End:\n")
|
||||
|
||||
# Blue text label for outage number
|
||||
pf.write("Color: 0 0 255\n") # Blue for text
|
||||
pf.write(f"Text: {lat}, {lon}, 1, \"Outage #{outagen_display_num}\", \"{hover_text}\"\n") # Include hover text
|
||||
|
||||
pf.write("End:\n")
|
||||
|
||||
print(f"GR2Analyst Triangle placefile '{filename}' generated successfully.")
|
||||
|
||||
except psycopg2.Error as db_error:
|
||||
print(f"Database error: {db_error}")
|
||||
except IOError as io_error:
|
||||
print(f"File I/O error: {io_error}")
|
||||
finally:
|
||||
if conn:
|
||||
conn.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate_gr2_triangle_placefile()
|
||||
# generate_gr2_triangle_placefile("my_outages_triangle.txt")
|
||||
24
ham.php
24
ham.php
@@ -1,24 +0,0 @@
|
||||
<?php
|
||||
// Connecting, selecting database
|
||||
$dbconn = pg_connect("host=localhost dbname=nws user=nws password=nws")
|
||||
or die('Could not connect: ' . pg_last_error());
|
||||
|
||||
// Performing SQL query
|
||||
//$query = "SELECT distinct on (camid) camid, filepath FROM camdb order by camid,dateutc desc";
|
||||
$query = "SELECT hour as hour, band as band, freq as freq FROM ham";
|
||||
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
|
||||
|
||||
// Printing results in HTML
|
||||
|
||||
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
|
||||
$array[] = $line;
|
||||
|
||||
}
|
||||
echo json_encode($array);
|
||||
|
||||
// Free resultset
|
||||
pg_free_result($result);
|
||||
|
||||
// Closing connection
|
||||
pg_close($dbconn);
|
||||
?>
|
||||
@@ -1,62 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>SRD Update</title>
|
||||
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<p>Form for updating bands that are currently being monitored/worked</p>
|
||||
<p>Fill out these as pairs then click submit, you need to fill 1 pair as a minimum:</p>
|
||||
<form action="hamupdate.php" method="post">
|
||||
<div class="form-group row">
|
||||
<label for="band[]" class="col-4 col-form-label">Band / Mode 1</label>
|
||||
<div class="col-8">
|
||||
<input id="band[]" name="band[]" type="text" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label for="band[]" class="col-4 col-form-label">Freq / Comments 1</label>
|
||||
<div class="col-8">
|
||||
<input id="band[]" name="band[]" type="text" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label for="band[]" class="col-4 col-form-label">Band / Mode 2</label>
|
||||
<div class="col-8">
|
||||
<input id="band[]" name="band[]" type="text" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label for="band[]" class="col-4 col-form-label">Freq / Comments 2</label>
|
||||
<div class="col-8">
|
||||
<input id="band[]" name="band[]" type="text" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label for="band[]" class="col-4 col-form-label">Band / Mode 3</label>
|
||||
<div class="col-8">
|
||||
<input id="band[]" name="band[]" type="text" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label for="band[]" class="col-4 col-form-label">Freq / Comments 3</label>
|
||||
<div class="col-8">
|
||||
<input id="band[]" name="band[]" type="text" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="offset-4 col-8">
|
||||
<button name="submit" type="submit" class="btn btn-primary">Submit</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
<script>
|
||||
</script>
|
||||
</html>
|
||||
481
ltg.html
481
ltg.html
@@ -1,481 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>RLX Lightning Archive</title>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"
|
||||
integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A=="
|
||||
crossorigin=""/>
|
||||
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"
|
||||
|
||||
integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA=="
|
||||
crossorigin=""></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js" integrity="sha512-ozq8xQKq6urvuU6jNgkfqAmT7jKN2XumbrX1JiB3TnF7tI48DPI4Gy1GXKD/V3EExgAs1V+pRO7vwtS1LHg0Gw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw-src.css" integrity="sha512-vJfMKRRm4c4UupyPwGUZI8U651mSzbmmPgR3sdE3LcwBPsdGeARvUM5EcSTg34DK8YIRiIo+oJwNfZPMKEQyug==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw-src.js" integrity="sha512-czICF/Crp0B7QB13iQZG9bYUpd/P1Ona1NeZN52gYsoVFXIpakDmdOUepMCHCMBIBd9Ei5Mlg8Quy4e504IT5A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css" integrity="sha512-gc3xjCmIy673V6MyOAZhIW93xhM9ei1I+gLbmFjUHIjocENRsLX/QUE1htk5q1XV2D/iie/VQ8DXI6Vu8bexvQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<style type="text/css">
|
||||
//#mapid { height: 800px; }
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
width: 100%
|
||||
|
||||
}
|
||||
#mapid {
|
||||
height: 97%;
|
||||
|
||||
}
|
||||
#bototmbar {
|
||||
height: 3%;
|
||||
}
|
||||
#form {
|
||||
position: absolute;
|
||||
width: 250px;
|
||||
left: 15px;
|
||||
top: 350px;
|
||||
z-index: 255555;
|
||||
|
||||
}
|
||||
#inputForm {
|
||||
background-color: #fff;
|
||||
width: 250px;
|
||||
z-index: 255553;
|
||||
}
|
||||
.datetimes {
|
||||
width: 250px;
|
||||
z-index: 2556557;
|
||||
}
|
||||
#current {
|
||||
z-index: 10000000;
|
||||
}
|
||||
|
||||
#legend {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
bottom: 40px;
|
||||
z-index: 55555;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
|
||||
<div id="mapid">
|
||||
<div id="legend">
|
||||
<img src="legend.png" alt="Legend">
|
||||
|
||||
</div>
|
||||
|
||||
<div id="form">
|
||||
<form id="inputForm">
|
||||
|
||||
<label for="datetimes">Time Range (UTC)</label>
|
||||
<input type="text" name="datetimes" class="datetimes" id="datetimes">
|
||||
Use the box drawing thing in the top right so you don't have to manually enter these<br>
|
||||
<label for="nwLon">NE Corner Latitude:</label><br>
|
||||
<input type="text" id="neLat" name="neLat" required><br>
|
||||
|
||||
<label for="nwLon">NE Corner Longitude:</label><br>
|
||||
<input type="text" id="neLon" name="neLon" required><br>
|
||||
|
||||
<label for="seLat">SW Corner Latitude:</label><br>
|
||||
<input type="text" id="swLat" name="swLat" required><br>
|
||||
|
||||
<label for="seLon">SW Corner Longitude:</label><br>
|
||||
<input type="text" id="swLon" name="swLon" required><br>
|
||||
|
||||
<label>Output Format:</label><br>
|
||||
<input type="radio" id="leafletMap" name="outputFormat" value="Leaflet Map" checked>
|
||||
<label for="leafletMap">Leaflet Map</label><br>
|
||||
|
||||
|
||||
<input type="radio" id="geoJSON" name="outputFormat" value="geoJSON">
|
||||
<label for="geoJSON">geoJSON</label><br>
|
||||
|
||||
<input type="radio" id="kml" name="outputFormat" value="KML">
|
||||
<label for="kml">KML</label><br>
|
||||
|
||||
<label>Database:</label><br>
|
||||
<label>Real-time ltg ingest has been disabled</label><br>
|
||||
<input type="radio" id="main" name="database" value="main" checked>
|
||||
<label for="main">Main (1986-Present)</label><br>
|
||||
<input type="radio" id="current" name="database" value="current">
|
||||
<label for="main">Current (Only new strikes)</label><br>
|
||||
|
||||
<!-- <input type="radio" id="csv" name="outputFormat" value="CSV">
|
||||
<label for="csv">CSV</label><br>-->
|
||||
|
||||
|
||||
<button type="button" onclick="generateOutput()">Generate Output</button>
|
||||
<button type="button" onclick="clearstrikes()">Clear Strikes</button><br>
|
||||
<label for="strikecount">Total / Pos / Neg Strikes Displayed:</label><br>
|
||||
<input type="text" id="strikecount" name="strikecount" value=0 readonly><br>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div id="bottombar">
|
||||
<a href="cams.html" class="w3-button w3-black">Cam List</a>
|
||||
<a href="admin.html" class="w3-button w3-black">Add Camera</a>
|
||||
<a href="db.html" class="w3-button w3-black">WU obs</a>
|
||||
<a href="5min.html" class="w3-button w3-black">5m ASOS obs</a>
|
||||
<a href="outagemap.html" class="w3-button w3-black">Power Outages</a>
|
||||
<a href="today.html" class="w3-button w3-black">CoCoRaHS Remarks</a>
|
||||
<a href="https://docs.google.com/forms/d/1-2rTBkNyyBVe08G1vN1hcSOEOvvLUcS1Vs2SmmaudlU" class="w3-button w3-black" target="_blank">Questions? Comments?</a>
|
||||
|
||||
<!-- <a href="http://stoat.org/work/db.html" class="w3-button w3-black">Wunderground Obs</a>-->
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
var mymap = L.map('mapid').setView([38.332372, -81.652480], 8);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var Esri_WorldStreetMap = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}', {
|
||||
attribution: 'Tiles © Esri'
|
||||
});
|
||||
|
||||
var Esri_WorldImagery = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
|
||||
attribution: 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
|
||||
});
|
||||
|
||||
var Esri_WorldTopoMap = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', {
|
||||
attribution: 'Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community'
|
||||
});
|
||||
var Stadia_StamenToner = L.tileLayer('https://tiles.stadiamaps.com/tiles/stamen_toner/{z}/{x}/{y}{r}.{ext}', {
|
||||
minZoom: 0,
|
||||
maxZoom: 20,
|
||||
attribution: '© <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://www.stamen.com/" target="_blank">Stamen Design</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
|
||||
ext: 'png'
|
||||
});
|
||||
var USGS_USImageryTopo = L.tileLayer('https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryTopo/MapServer/tile/{z}/{y}/{x}', {
|
||||
maxZoom: 20,
|
||||
attribution: 'Tiles courtesy of the <a href="https://usgs.gov/">U.S. Geological Survey</a>'
|
||||
});
|
||||
|
||||
|
||||
var baselayers = {
|
||||
"Esri Street Map": Esri_WorldStreetMap,
|
||||
"Esri Satellite": Esri_WorldImagery,
|
||||
"Esri Topo": Esri_WorldTopoMap,
|
||||
"USGS Sat/Topo": USGS_USImageryTopo
|
||||
}
|
||||
L.control.layers(baselayers,null,{collapsed: false}).addTo(mymap);
|
||||
|
||||
Esri_WorldStreetMap.addTo(mymap);
|
||||
|
||||
|
||||
var counties = 'counties.json'
|
||||
|
||||
var exteriorStyle = {
|
||||
"color": "#000000",
|
||||
"weight": 1,
|
||||
"fillOpacity": 0
|
||||
};
|
||||
|
||||
fetch(
|
||||
counties
|
||||
).then(
|
||||
res => res.json()
|
||||
).then(
|
||||
data => L.geoJSON(data, {style: exteriorStyle}).addTo(mymap)
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var LeafIcon = L.Icon.extend({
|
||||
options: {
|
||||
shadowUrl:
|
||||
'http://leafletjs.com/docs/images/leaf-shadow.png',
|
||||
iconSize: [38, 95],
|
||||
shadowSize: [50, 64],
|
||||
iconAnchor: [22, 94],
|
||||
shadowAnchor: [4, 62],
|
||||
popupAnchor: [-3, -76]
|
||||
}
|
||||
});
|
||||
|
||||
var greenIcon = new LeafIcon({
|
||||
iconUrl: 'http://leafletjs.com/docs/images/leaf-green.png'
|
||||
});
|
||||
|
||||
var drawnItems = new L.FeatureGroup();
|
||||
mymap.addLayer(drawnItems);
|
||||
|
||||
var drawControl = new L.Control.Draw({
|
||||
position: 'topright',
|
||||
draw: {
|
||||
rect: true,
|
||||
polygon: false,
|
||||
circle: false,
|
||||
marker: false,
|
||||
circlemarker: false,
|
||||
polyline: false
|
||||
},
|
||||
|
||||
edit: {
|
||||
featureGroup: drawnItems
|
||||
}
|
||||
});
|
||||
mymap.addControl(drawControl);
|
||||
|
||||
mymap.on('draw:created', function (e) {
|
||||
var type = e.layerType,
|
||||
layer = e.layer;
|
||||
document.getElementById('neLat').value = layer._bounds._northEast.lat.toFixed(4);
|
||||
document.getElementById('neLon').value = layer._bounds._northEast.lng.toFixed(4);
|
||||
document.getElementById('swLat').value = layer._bounds._southWest.lat.toFixed(4);
|
||||
document.getElementById('swLon').value = layer._bounds._southWest.lng.toFixed(4);
|
||||
|
||||
if (type === 'marker') {
|
||||
layer.bindPopup('A popup!');
|
||||
}
|
||||
|
||||
drawnItems.addLayer(layer);
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$(function() {
|
||||
var date = new Date();
|
||||
$('input[name="datetimes"]').daterangepicker({
|
||||
timePicker: true,
|
||||
timePicker24Hour: true,
|
||||
showDropdowns: true,
|
||||
startDate: moment().utc().startOf('hour').add(-23, 'hour'),
|
||||
endDate: moment().utc().startOf('hour').add(1,'hour'),
|
||||
maxSpan: { "years": 100 },
|
||||
linkedCalenders: false,
|
||||
minDate: new Date(1986,0,1),
|
||||
maxDate: new Date(date.getFullYear(), date.getMonth() + 1, 0),
|
||||
opens: 'right',
|
||||
drops: 'up',
|
||||
locale: {
|
||||
format: 'M/DD/YYYY HH:mm'
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function generateOutput() {
|
||||
// Retrieve user inputs
|
||||
var neLat = (document.getElementById("neLat").value);
|
||||
var neLon = document.getElementById("neLon").value;
|
||||
var swLat = document.getElementById("swLat").value;
|
||||
var swLon = document.getElementById("swLon").value;
|
||||
var database = document.querySelector('input[name="database"]:checked').value;
|
||||
var outputFormat = document.querySelector('input[name="outputFormat"]:checked').value;
|
||||
var startDate = $('#datetimes').data('daterangepicker').startDate._d;
|
||||
var endDate = $('#datetimes').data('daterangepicker').endDate._d;
|
||||
if (neLat && neLon && swLat && swLon) {
|
||||
|
||||
|
||||
let data = {swLat: swLat, neLat: neLat, swLon: swLon, neLon: neLon, type: outputFormat, startDate: startDate, endDate: endDate, database: database};
|
||||
// Perform actions based on the selected output format
|
||||
switch (outputFormat) {
|
||||
case "geoJSON":
|
||||
fetch_geoJSON(data)
|
||||
// Generate GeoJSON output
|
||||
// Implement your GeoJSON generation logic here
|
||||
break;
|
||||
case "KML":
|
||||
generate_kml(data)
|
||||
// Generate KML output
|
||||
// Implement your KML generation logic here
|
||||
break;
|
||||
case "CSV":
|
||||
// Generate CSV output
|
||||
// Implement your CSV generation logic here
|
||||
break;
|
||||
case "Leaflet Map":
|
||||
add_leaflet(data);
|
||||
// Show a Leaflet map with the specified coordinates and date/time
|
||||
// Implement your Leaflet map rendering logic here
|
||||
break;
|
||||
default:
|
||||
// Handle unsupported format
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
alert('Please ensure you have selected a bounding box for the data you want')
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
function fetch_geoJSON(data) {
|
||||
fetch("https://wx.stoat.org/cgi-bin/ltg.py", {
|
||||
method: "POST",
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify(data)
|
||||
}).then((res) => res.blob())
|
||||
.then((blob) => URL.createObjectURL(blob))
|
||||
.then((href) => {
|
||||
Object.assign(document.createElement('a'), {
|
||||
href,
|
||||
download: 'RLXltg.geojson',
|
||||
}).click();
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
function add_leaflet(data) {
|
||||
var geojsonMarkerOptions = {
|
||||
radius: 8,
|
||||
fillColor: "#ff7800",
|
||||
color: "#000",
|
||||
weight: 1,
|
||||
opacity: 1,
|
||||
fillOpacity: 0.8
|
||||
};
|
||||
|
||||
fetch("https://wx.stoat.org/cgi-bin/ltg.py", {
|
||||
method: "POST",
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify(data)
|
||||
}).then((res) => res.text())
|
||||
.then(text => (plot_geojson(text)));
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
function plot_geojson(data) {
|
||||
|
||||
|
||||
|
||||
data = jQuery.parseJSON(data);
|
||||
|
||||
|
||||
if (data.features == null) {
|
||||
alert("No strikes were returned from the database, try a different time range or bounding box!");
|
||||
}
|
||||
|
||||
|
||||
var geojsonMarkerOptions = {
|
||||
radius: 2,
|
||||
fillColor: "#ff7800",
|
||||
color: "#000",
|
||||
weight: 1,
|
||||
opacity: 1,
|
||||
fillOpacity: 0.8
|
||||
};
|
||||
L.geoJson(data, {
|
||||
pointToLayer: function (feature, latlng) {
|
||||
mypopup = L.popup().setContent("Time (UTC): " + (feature.properties.time) + "<br> Magnitude (kA) " + feature.properties.mag)
|
||||
counter = counter + 1;
|
||||
if (feature.properties.mag > 0) {
|
||||
poscounter = poscounter + 1;
|
||||
}
|
||||
if (feature.properties.mag < 0) {
|
||||
negcounter = negcounter + 1;
|
||||
}
|
||||
return L.circleMarker(latlng, {
|
||||
|
||||
radius: 3,
|
||||
fillColor: styleMarker(feature),
|
||||
color: styleMarker(feature),
|
||||
weight: 1,
|
||||
opacity: 1,
|
||||
fillOpacity: 0.8
|
||||
|
||||
|
||||
}
|
||||
).bindPopup(mypopup);
|
||||
}
|
||||
}).addTo(layerGroup);
|
||||
document.getElementById('strikecount').value = counter + " / " + poscounter + " / " + negcounter;
|
||||
drawnItems.clearLayers();
|
||||
//document.getElementById("current").innerHTML = 'Total Displayed Strikes: ' + counter;
|
||||
}
|
||||
|
||||
counter = 0;
|
||||
poscounter = 0;
|
||||
negcounter = 0;
|
||||
document.getElementById('strikecount').value = counter + " / " + poscounter + " / " + negcounter;
|
||||
function generate_kml(data) {
|
||||
fetch("https://wx.stoat.org/cgi-bin/ltg.py", {
|
||||
method: "POST",
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify(data)
|
||||
}).then((res) => res.blob())
|
||||
.then((blob) => URL.createObjectURL(blob))
|
||||
.then((href) => {
|
||||
Object.assign(document.createElement('a'), {
|
||||
href,
|
||||
download: 'RLXltg.kml',
|
||||
}).click();
|
||||
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
function styleMarker(feature) {
|
||||
if (feature.properties.mag > 0) {
|
||||
return 'red';
|
||||
|
||||
}
|
||||
if (feature.properties.mag < 0) {
|
||||
return 'blue';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function clearstrikes() {
|
||||
layerGroup.clearLayers();
|
||||
counter = 0;
|
||||
poscounter = 0;
|
||||
negcounter = 0;
|
||||
document.getElementById('strikecount').value = counter;
|
||||
}
|
||||
|
||||
|
||||
var layerGroup = L.layerGroup().addTo(mymap);
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
27
ltg.php
27
ltg.php
@@ -1,27 +0,0 @@
|
||||
<?php
|
||||
ini_set("log_errors", 1);
|
||||
ini_set("error_log", "/var/www/html/work/php-error.log");
|
||||
|
||||
// Connecting, selecting database
|
||||
$dbconn = pg_connect("host=localhost dbname=nws user=nws password=nws")
|
||||
or die('Could not connect: ' . pg_last_error());
|
||||
|
||||
|
||||
$name = file_get_contents('php://input');
|
||||
$arr = json_decode($name,true);
|
||||
file_put_contents('test1.txt', $arr);
|
||||
foreach($arr as $item) { //foreach element in $arr
|
||||
file_put_contents('test3.txt', $item, FILE_APPEND);
|
||||
$dtg = $item['time']; //etc
|
||||
$lat = $item['lat'];
|
||||
$lon = $item['lon'];
|
||||
$mag = $item['mag'];
|
||||
pg_query_params($dbconn,
|
||||
"INSERT INTO ltg (datetime,lat,lon,mag) values ($1, $2, $3, $4) on conflict do nothing",
|
||||
array($dtg,$lat,$lon,$mag)) or die('Query failed: ' . pg_last_error());
|
||||
pg_query("COMMIT");
|
||||
}
|
||||
pg_close($dbconn);
|
||||
?>
|
||||
|
||||
|
||||
59
onedb.html
59
onedb.html
@@ -1,59 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Wunderground obs</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js" integrity="sha512-WNLxfP/8cVYL9sj8Jnp6et0BkubLP31jhTG9vhL/F5uEZmg5wEzKoXp1kJslzPQWwPT1eyMiSxlKCgzHLOTOTQ==" crossorigin="anonymous"></script>
|
||||
<link href="https://unpkg.com/tabulator-tables@4.7.2/dist/css/tabulator.min.css" rel="stylesheet">
|
||||
<script type="text/javascript" src="https://unpkg.com/tabulator-tables@4.7.2/dist/js/tabulator.min.js"></script>
|
||||
<button onclick="reloadData()">Data autorefreshes every 5 minutes, click to refresh now</button>
|
||||
<a>QPE 00L is direct from WU, the other QPE are derived and may be off if time settings on the individual PWS are incorrect</a>
|
||||
<input type="checkbox" id="cwa" name="cwa" value="RLX" onchange="filters()">
|
||||
<label for="cwa">RLX only</label><br>
|
||||
<div id="wunderobs"></div>
|
||||
|
||||
<script>
|
||||
|
||||
function googleMap(cell, formatterParams){
|
||||
return "http://maps.google.com/maps?t=k&q=loc:" + cell.getData().lat + "+" + cell.getData().lon + "&basemap=satellite";
|
||||
}
|
||||
|
||||
|
||||
function reloadData() {
|
||||
table.replaceData("dbone.php");
|
||||
}
|
||||
|
||||
var table = new Tabulator("#wunderobs", {
|
||||
responsiveLayout:true,
|
||||
tooltipsHeader:true,
|
||||
columns:[
|
||||
{title:"Station", field:"sitename"},
|
||||
{title:"T", field:"tempf"},
|
||||
{title:"QPE 00L", field:"preciptotal",formatter:"money",headerTooltip:"Since Midnight"},
|
||||
{title:"Winddir", field:"winddir"},
|
||||
{title:"Speed", field:"windspd",headerTooltip:"Mph"},
|
||||
{title:"Gust", field:"windgust",headerTooltip:"Mph"}
|
||||
|
||||
],
|
||||
});
|
||||
|
||||
table.setData("oneraindb.php");
|
||||
|
||||
function filters() {
|
||||
var y = document.getElementById("cwa").checked;
|
||||
if (y) {
|
||||
table.addFilter("cwa", "=", 'RLX');
|
||||
}
|
||||
if (!y) {
|
||||
table.removeFilter("cwa", "=", 'RLX');
|
||||
}
|
||||
}
|
||||
// {title:"24hr QPE", field:"rain24", formatterParms:{precision:2}},
|
||||
var timeout = setInterval(reloadData, 300000);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
152
onerain.py
152
onerain.py
@@ -1,152 +0,0 @@
|
||||
import time
|
||||
import requests
|
||||
import json
|
||||
import geojson
|
||||
import psycopg2
|
||||
import psycopg2.extensions
|
||||
from psycopg2.extras import Json
|
||||
conn = psycopg2.connect(host='localhost', database='nws', user='nws', password='nws')
|
||||
cursor = conn.cursor()
|
||||
|
||||
|
||||
#one rain sensor database with last obs and metadata
|
||||
#one rain sensor database with all obs
|
||||
|
||||
#metsensor = [30,53,11,10,50,44,40,41]
|
||||
metsensor = [(3,'tempf'),(2,'raintotal'),(8,'humidity'),(7,'winddir'),(4,'windspd'),(5,'windgust')]
|
||||
rainsensor = [(2,'raintotal')]
|
||||
|
||||
|
||||
features = []
|
||||
alldata = []
|
||||
S = requests.Session()
|
||||
|
||||
cursor.execute("SELECT siteid, sitetype from onerainsites")
|
||||
#WHERE (Active = True) and ((EXTRACT(EPOCH FROM (current_timestamp - lastob ))/60) > 8 or (lastob ISNULL))"
|
||||
allonerainsites = cursor.fetchall()
|
||||
|
||||
|
||||
|
||||
def getData(siteid,sensorid):
|
||||
apiget = 'https://wvdhsem.onerain.com/export/flot/?method=sensor&site_id=' + str(siteid) + '&device_id=' + str(sensorid)
|
||||
#print(apiget)
|
||||
dataresponse = json.loads(S.get(apiget).text)
|
||||
#print(dataresponse)
|
||||
|
||||
|
||||
return dataresponse
|
||||
|
||||
|
||||
|
||||
|
||||
# sql = 'INSERT INTO wuobs (stationid, dateutc, winddir, windspd, windgust, tempf, dewpt, humidity, pressure, preciptotal) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) ON CONFLICT (stationid,dateutc) DO NOTHING'
|
||||
# sql2 = 'UPDATE wusites SET lastob = %s, winddir = %s, windspd = %s, windgust= %s, tempf = %s, dewpt = %s, humidity = %s, pressure = %s, preciptotal = %s WHERE stationid = %s'
|
||||
# cursor.execute(sql,ob)
|
||||
# cursor.execute(sql2,ob2)
|
||||
# conn.commit()
|
||||
# setDerived(stationid)
|
||||
|
||||
def setDerived(stationid):
|
||||
data1 = (stationid,)
|
||||
data = (stationid,stationid)
|
||||
ago24 = "UPDATE wusites set ago24 = subquery.preciptotal, ago24time = subquery.dateutc from (select preciptotal,stationid,dateutc from wuobs WHERE (dateutc < timezone('utc',current_timestamp) - interval '23 hours') and (dateutc > timezone('utc',current_timestamp) - interval '24 hours') and stationid = %s order by dateutc desc limit 1) as subquery where wusites.stationid = %s"
|
||||
ago3 = "UPDATE wusites set ago3 = subquery.preciptotal, ago3time = subquery.dateutc from (select preciptotal,stationid,dateutc from wuobs WHERE (dateutc < timezone('utc',current_timestamp) - interval '2.5 hours') and (dateutc > timezone('utc',current_timestamp) - interval '3 hours') and stationid = %s order by dateutc desc limit 1) as subquery where wusites.stationid = %s"
|
||||
ago6 = "UPDATE wusites set ago6 = subquery.preciptotal, ago6time = subquery.dateutc from (select preciptotal,stationid,dateutc from wuobs WHERE (dateutc < timezone('utc',current_timestamp) - interval '5.2 hours') and (dateutc > timezone('utc',current_timestamp) - interval '6 hours') and stationid = %s order by dateutc desc limit 1) as subquery where wusites.stationid = %s"
|
||||
midnight = "UPDATE wusites set lastmidnight = subquery.preciptotal from (select preciptotal,stationid from wuobs WHERE (dateutc < timezone('UTC', current_date::timestamp at time zone 'US/Eastern')) and (dateutc > timezone('UTC', current_date::timestamp at time zone 'US/Eastern' - interval '40 minutes')) and stationid = %s order by dateutc desc limit 1) as subquery where wusites.stationid = %s"
|
||||
windmax = "UPDATE wusites set windmax = subquery.windmax from (SELECT MAX(windgust) as windmax FROM wuobs where (dateutc > timezone('utc',current_timestamp) - interval '24 hours') and stationid = %s) as subquery where wusites.stationid = %s"
|
||||
maxt = "UPDATE wusites set maxt = subquery.maxt from (SELECT MAX(tempf) as maxt FROM wuobs where (dateutc > timezone('utc',current_timestamp) - interval '24 hours') and stationid = %s) as subquery where wusites.stationid = %s"
|
||||
mint = "UPDATE wusites set mint = subquery.mint from (SELECT MIN(tempf) as mint FROM wuobs where (dateutc > timezone('utc',current_timestamp) - interval '24 hours') and stationid = %s) as subquery where wusites.stationid = %s"
|
||||
|
||||
|
||||
|
||||
cursor.execute(ago24,data)
|
||||
cursor.execute(ago6,data)
|
||||
cursor.execute(ago3,data)
|
||||
cursor.execute(windmax,data)
|
||||
cursor.execute(midnight,data)
|
||||
cursor.execute(maxt,data)
|
||||
cursor.execute(mint,data)
|
||||
conn.commit()
|
||||
rain3 = "update wusites set rain3 = (case when (wusites.ago3time < timezone('UTC', current_date::timestamp at time zone 'US/Eastern') and wusites.stationid = %s) then (wusites.preciptotal + wusites.lastmidnight - wusites.ago3) when (wusites.ago3time > timezone('UTC', current_date::timestamp at time zone 'US/Eastern') and wusites.stationid = %s) then (wusites.preciptotal - wusites.ago3) end) where wusites.stationid = %s"
|
||||
rain6 = "update wusites set rain6 = (case when (wusites.ago6time < timezone('UTC', current_date::timestamp at time zone 'US/Eastern') and wusites.stationid = %s) then (wusites.preciptotal + wusites.lastmidnight - wusites.ago6) when (wusites.ago6time > timezone('UTC', current_date::timestamp at time zone 'US/Eastern') and wusites.stationid = %s) then (wusites.preciptotal - wusites.ago6) end) where wusites.stationid = %s"
|
||||
rain24 = "update wusites set rain24 = (wusites.preciptotal + wusites.lastmidnight - wusites.ago24) where wusites.stationid = %s"
|
||||
data2 = (stationid,stationid,stationid)
|
||||
cursor.execute(rain3,data2)
|
||||
cursor.execute(rain6,data2)
|
||||
cursor.execute(rain24,data1)
|
||||
conn.commit()
|
||||
|
||||
|
||||
|
||||
for i in allonerainsites:
|
||||
if i[1] == 'MET':
|
||||
for j in metsensor:
|
||||
|
||||
tempdata = getData(i[0],j[0])
|
||||
for p in tempdata['data']:
|
||||
datafield = p[1]
|
||||
datefield = int(p[0])/1000
|
||||
ob = (i[0],datefield,int(j[0]),datafield)
|
||||
sql = 'INSERT INTO onerainobs (siteid, dateutc, sensorid, data1) VALUES (%s,to_timestamp(%s),%s,%s) ON CONFLICT (siteid,sensorid,dateutc,data1) DO NOTHING'
|
||||
cursor.execute(sql,ob)
|
||||
conn.commit()
|
||||
if i[1] == 'Rain':
|
||||
for j in rainsensor:
|
||||
tempdata = getData(i[0],j[0])
|
||||
for p in tempdata['data']:
|
||||
datafield = p[1]
|
||||
datefield = int(p[0])/1000
|
||||
ob = (i[0],datefield,int(j[0]),datafield)
|
||||
sql = 'INSERT INTO onerainobs (siteid, dateutc, sensorid, data1) VALUES (%s,to_timestamp(%s),%s,%s) ON CONFLICT (siteid,sensorid,dateutc,data1) DO NOTHING'
|
||||
cursor.execute(sql,ob)
|
||||
|
||||
conn.commit()
|
||||
|
||||
|
||||
|
||||
|
||||
for i in allonerainsites:
|
||||
if i[1] == 'MET':
|
||||
for j in metsensor:
|
||||
sql = 'SELECT data1,dateutc from onerainobs where siteid = %s and sensorid = %s order by dateutc desc limit 1'
|
||||
getob = (i[0],j[0])
|
||||
cursor.execute(sql,getob)
|
||||
#WHERE (Active = True) and ((EXTRACT(EPOCH FROM (current_timestamp - lastob ))/60) > 8 or (lastob ISNULL))"
|
||||
obdata = cursor.fetchall()
|
||||
|
||||
if len(obdata) == 1:
|
||||
for l in obdata:
|
||||
|
||||
|
||||
sensor = str(j[1])
|
||||
sensortime = str(j[1])+'time'
|
||||
sql = 'UPDATE onerainsites set ' + sensor + ' = %s, ' + sensortime + ' = %s where siteid = %s'
|
||||
updateob = (l[0],l[1],i[0])
|
||||
|
||||
|
||||
|
||||
cursor.execute(sql,updateob)
|
||||
conn.commit()
|
||||
|
||||
if i[1] == 'Rain':
|
||||
|
||||
for j in rainsensor:
|
||||
sql = 'SELECT data1,dateutc from onerainobs where siteid = %s and sensorid = %s order by dateutc desc limit 1'
|
||||
getob = (i[0],j[0])
|
||||
cursor.execute(sql,getob)
|
||||
#WHERE (Active = True) and ((EXTRACT(EPOCH FROM (current_timestamp - lastob ))/60) > 8 or (lastob ISNULL))"
|
||||
obdata = cursor.fetchall()
|
||||
|
||||
if len(obdata) == 1:
|
||||
for l in obdata:
|
||||
|
||||
|
||||
sensor = str(j[1])
|
||||
sensortime = str(j[1])+'time'
|
||||
sql = 'UPDATE onerainsites set ' + sensor + ' = %s, ' + sensortime + ' = %s where siteid = %s'
|
||||
updateob = (l[0],l[1],i[0])
|
||||
|
||||
|
||||
|
||||
cursor.execute(sql,updateob)
|
||||
conn.commit()
|
||||
@@ -1,26 +0,0 @@
|
||||
<?php
|
||||
// Connecting, selecting database
|
||||
$dbconn = pg_connect("host=localhost dbname=nws user=nws password=nws")
|
||||
or die('Could not connect: ' . pg_last_error());
|
||||
|
||||
// Performing SQL query
|
||||
$query = "SELECT sitename, lat, lon, tempf, humidity,raintotal,winddir,windspd,windgust,tempftime, humiditytime,raintotaltime,winddirtime,windspdtime,windgusttime FROM onerainsites where sitetype = 'MET';";
|
||||
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
|
||||
|
||||
// Printing results in HTML
|
||||
|
||||
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
|
||||
$array[] = $line;
|
||||
|
||||
}
|
||||
echo json_encode($array);
|
||||
|
||||
// Free resultset
|
||||
pg_free_result($result);
|
||||
|
||||
// Closing connection
|
||||
pg_close($dbconn);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user