Skip to content

Instantly share code, notes, and snippets.

View joaofig's full-sized avatar

João Paulo Figueira joaofig

View GitHub Profile
@joaofig
joaofig / show_density_map.py
Created May 18, 2024 11:52
Creates and displays the VED density map on a Jupyter Notebook
import folium
from folium.raster_layers import TileLayer
html_map = folium.Map(prefer_canvas=True,
tiles="cartodbpositron",
location=(42.274569, -83.733228),
zoom_start=13)
tile_layer = TileLayer(tiles="http://127.0.0.1:8000/density/{x}/{y}/{z}", overlay=True,
attr="(C) JPF")
tile_layer.add_to(html_map)
@joaofig
joaofig / paint_tile.rs
Created May 17, 2024 18:00
Paints a single tile
fn paint_tile(pixels: Vec<TilePixel>,
color_grad: Gradient,
range: LevelRange) -> RgbaImage {
let mut bitmap = make_rgba_tile(0, 0, 0, 0);
if range.width() > 0.0 {
for pixel in pixels {
let intensity = (pixel.get_c() - range.min()).ln() / range.width().ln();
let rgba = color_grad.at(intensity);
let pix = Rgba::from(rgba.to_rgba8());
@joaofig
joaofig / get_tile_file_name.rs
Last active May 12, 2024 14:54
Computes the tile file name and generates its contents if the file does not exist.
async fn get_tile_file_name(x: i32, y: i32, z:i32) -> String {
let quad_key = Quadkey::tile_to_quadkey(x, y, z as usize);
let mut file_name = format!("./tiles/{}/{}.png", z, quad_key);
let path = Path::new(&file_name);
if !path.exists() {
let tile_quad_keys = get_tile_quad_keys(&quad_key).await;
if tile_quad_keys.is_empty() {
file_name = get_default_filename();
@joaofig
joaofig / get_density_tile.rs
Created May 9, 2024 17:00
The main entry point to the density tile server
#[get("/density/<x>/<y>/<z>")]
async fn get_density_tile(x: i32, y: i32, z: i32) -> Result<NamedFile> {
let file_name = if !(1..=18).contains(&z) {
get_default_filename()
} else {
get_tile_file_name(x, y, z).await
};
NamedFile::open(PathBuf::from(file_name)).await
}
@joaofig
joaofig / make_rgba_tile.rs
Created May 6, 2024 13:04
Creates a 256x256 tile with a solid color.
fn make_rgba_tile(r: u8, g: u8, b: u8, a: u8) -> RgbaImage {
ImageBuffer::from_pixel(256, 256, Rgba([r, g, b, a]))
}
@joaofig
joaofig / sqlx-sample.rs
Created May 5, 2024 10:21
sqlx sample code
use std::result::Result;
use sqlx::{SqlitePool, FromRow};
#[derive(FromRow, Debug, PartialEq, Clone)]
struct LevelRange {
level_num: i64,
level_min: f64,
level_max: f64,
}
@joaofig
joaofig / CompoundTrajectory_final.py
Last active January 15, 2024 15:53
Final methods of the compound trajectory class
@classmethod
def _trim_array(cls, array: np.ndarray) -> np.ndarray:
if array.shape[0] > 2:
return array[1:-1]
else:
return array
def to_trajectory(self) -> Trajectory:
lat = np.concatenate([self._trim_array(segment.lat) for segment in self.segments])
lon = np.concatenate([self._trim_array(segment.lon) for segment in self.segments])
@joaofig
joaofig / segment_to_trajectory.py
Created January 9, 2024 19:58
Converts a trajectory segment to a node-based trajectory, recomputing traversal times.
def segment_to_trajectory(segment: list[LatLon],
dt: float,
t0: float) -> Trajectory:
lat = np.array([point.lat for point in segment])
lon = np.array([point.lon for point in segment])
time = np.zeros_like(lat)
seg_lens = vec_haversine(lat[1:], lon[1:], lat[:-1], lon[:-1])
avg_speed = np.sum(seg_lens) / dt
time[0] = t0
@joaofig
joaofig / merge_trajectory.py
Created January 9, 2024 19:45
Merges the map-matched trajectory to the corresponding map nodes
def merge_trajectory(trajectory: Trajectory,
map_lat: np.ndarray,
map_lon: np.ndarray) -> list[list[LatLon]]:
segments: list[list[LatLon]] = []
j = 0
for i in range(trajectory.lat.shape[0]-1):
pt0 = LatLon(float(trajectory.lat[i]), float(trajectory.lon[i]))
pt1 = LatLon(float(trajectory.lat[i+1]), float(trajectory.lon[i+1]))
seg_len = pt0.haversine(*pt1.to_tuple())
@joaofig
joaofig / CompoundTrajectory_init.py
Created January 9, 2024 19:14
The compound trajectory constructor
class CompoundTrajectory:
def __init__(self, trajectory: Trajectory,
map_lat: np.ndarray,
map_lon: np.ndarray):
self.segments: list[Trajectory] = []
t0 = 0
merged = merge_trajectory(trajectory, map_lat, map_lon)
for i, segment in enumerate(merged):
dt = trajectory.dt[i]