hook the ui up to the overpass data

This commit is contained in:
Daniel Barlow 2025-05-28 18:50:12 +01:00
parent dc95c2252e
commit 398693bc07
2 changed files with 76 additions and 54 deletions

View File

@ -1,12 +1,12 @@
; (local { : view } (require :fennel))
(local { : fdopen } (require :posix.stdio))
(local nmea (require :nmea))
(local tiles (require :tiles))
(import-macros { : define-tests : expect : expect= } :assert)
(local {
: Gtk
: OsmGpsMap
: Gdk
: Gio
: GLib
@ -52,20 +52,37 @@ label.readout {
(local state-widgets { })
(fn osm-widget []
(let [w
(doto (OsmGpsMap.Map {})
(tset :map-source OsmGpsMap.MapSource_t.OPENSTREETMAP)
(: :set_center_and_zoom 52.595 -0.1 17)
(: :layer_add (OsmGpsMap.MapOsd {
:show_copyright true
; :show_coordinates true
:show_scale true
}))
)]
(tset state-widgets :osm w)
w))
(local
app-state {
:time-of-day 0
:elapsed-time 0
:speed 14
:lat 49
:lon 0
:course 22
}
)
(fn osm-widget []
(let [height 256]
(Gtk.Label {
:width height :height height
:on_draw
(fn [self g]
(print app-state.lat app-state.lon )
(let [lines (tiles.polylines app-state.lat app-state.lon 17)]
(g:set_source_rgb 0.2 0.2 0.4)
(g:set_line_width 3)
(each [_ line (ipairs lines)]
(case line
[[sx sy] & more]
(do
(g:move_to sx sy)
(each [_ [x y] (ipairs more)]
(g:line_to x y)))))
(g:stroke)
true))
})))
(fn readout [name text]
(let [w
@ -89,18 +106,6 @@ label.readout {
(expect= (hhmmss (+ 45 (* 60 12) (* 60 60 3))) "3:12:45")
(local
app-state {
:time-of-day 0
:elapsed-time 0
:speed 14
:lat 49
:lon 0
:course 22
}
)
(fn merge [table1 table2]
(collect [k v (pairs table2) &into table1]
k v))

View File

@ -5,35 +5,8 @@
(import-macros { : define-tests : expect : expect= : expect-near } :assert)
(local { : view } (require :fennel))
(local f% string.format)
(local
query
(->
[
"[bbox:30.618338,-96.323712,30.591028,-96.330826]"
"[out:json]"
"[timeout:90];"
"("
"way ("
"30.626917110746,"
"-96.348809105664,"
"30.634468750236,"
"-96.339893442898"
");"
");"
"out ;"
]
(table.concat "\n")))
(let [r
(req.new_from_uri
"https://overpass-api.de/api/interpreter")]
(tset r.headers ":method" "POST")
(r:set_body (dict_to_query { :data query }))
(let [(headers stream) (r:go)]
(print (view headers))
(print (view (json.decode (stream:get_body_as_string))))))
(fn sinh [x] (/ (- 1 (math.exp (* -2 x))) (* 2 (math.exp (- x)))))
(expect (< (math.abs (- (sinh 2) 3.626860407847)) 0.001))
@ -69,3 +42,47 @@
(expect= (math.floor x) 65343)
(expect= (math.floor y) 43221))
(fn overpass [lat lon]
(let [n (+ lat 0.01)
w (- lon 0.01)
s lat
e lon]
(->
[
"[out:json];"
(f% "way(%f,%f,%f,%f)['highway'];" s w n e)
"(._;>;);"
"out;"
]
(table.concat "\n"))))
(fn canvas [elements offset-x offset-y]
(let [nodes {}
lines []]
(each [_ e (ipairs elements)]
(case e.type
:node (tset nodes e.id e)
:way
(table.insert
lines
(icollect [_ nd (ipairs e.nodes)]
(let [node (. nodes nd)
(tx ty) (latlon->tile node.lat node.lon 17)]
;;(print e.tags.name e.id e.name node.lat node.lon)
[ (* 256 (- tx offset-x)) (* 256 (- ty offset-y)) ])))))
lines))
(fn polylines [lat long zoom]
(let [r
(req.new_from_uri
"https://overpass-api.de/api/interpreter")
query { :data (overpass lat long zoom) }]
(tset r.headers ":method" "POST")
(r:set_body (dict_to_query query))
(let [(headers stream) (r:go)
(tx ty) (latlon->tile lat long zoom)
data (json.decode (stream:get_body_as_string))]
(canvas data.elements (math.floor tx) (math.floor ty)))))
{ : polylines }