<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feeds/rss-style.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>gjore.milevski</title>
        <link>https://gjoremilevski.com/</link>
        <description>Personal site of Gjore Milevski, Frontend Software Engineer at Development Seed.</description>
        <lastBuildDate>Sun, 22 Mar 2026 16:43:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Astro-Theme-Retypeset with Feed for Node.js</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Gjore Milevski</copyright>
        <atom:link href="https://gjoremilevski.com/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Scalable linked data views]]></title>
            <link>https://gjoremilevski.com/posts/scalable-linked-data-views/</link>
            <guid isPermaLink="false">https://gjoremilevski.com/posts/scalable-linked-data-views/</guid>
            <pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A quick look at using DuckDB-WASM, Mosaic and GeoArrow to query Parquet files directly in the browser.]]></description>
            <content:encoded><![CDATA[<p><strong>Browser-based computing does not always need RESTful APIs.</strong></p>
<p>Here is a recent experiment from my personal lab: using DuckDB-WASM, Mosaic and GeoArrow to query a Parquet file directly in the browser without a backend.</p>
<p>The architecture uses Mosaic's global Coordinator to manage state between linked views using SQL predicates. Because DuckDB-WASM returns standard Arrow tables, the WKB output is converted to GeoArrow point vectors before being passed to the GeoArrowScatterplotLayer for rendering. Credit goes to Kyle Barron for his work on the <code>@geoarrow/deck.gl-layers</code> package.</p>
<p>&lt;video src="/earthquake-demo.mp4" controls autoplay muted loop style="max-width: 100%;"&gt;&lt;/video&gt;</p>
<p>Desktop-only demo with bi-directional brushing: <a href="https://linked-views-demo.netlify.app/">https://linked-views-demo.netlify.app/</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to get wind tiles for your next wind visualization]]></title>
            <link>https://gjoremilevski.com/posts/wind-visualization/</link>
            <guid isPermaLink="false">https://gjoremilevski.com/posts/wind-visualization/</guid>
            <pubDate>Sat, 21 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A quick guide to turning wind data into tiles you can use in DeckGL visualizations, using TiTiler and vsicurl.]]></description>
            <content:encoded><![CDATA[<p><strong>Quick (and open-source) way to build wind visualizations</strong></p>
<p><em>(thanks to Henry Rodman for the vrt and vsicurl hints below)</em></p>
<h2>Step 1: Find the right GRIB2 file</h2>
<p>Browse NOAA’s HRRR model (limited to CONUS, see below for global options) via the <a href="https://registry.opendata.aws/noaa-hrrr-pds/">ASDI bucket</a>.</p>
<p>File structure:</p>
<pre><code>s3://noaa-hrrr-bdp-pds/hrrr.YYYYMMDD/conus/hrrr.t{HH}z.wrfsfcf{XX}.grib2
</code></pre>
<ul>
<li><code>t{HH}z</code> = model run hour</li>
<li><code>f{XX}</code> = forecast hour (<code>f00</code> is analysis, <code>f01</code>–<code>f48</code> are 1–48h forecasts)</li>
</ul>
<p>Example URL for wind at 10m on 2025-05-12 06Z, 4-hour forecast:</p>
<pre><code>https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrrr.20250512/conus/hrrr.t06z.wrfsfcf04.grib2
</code></pre>
<h2>Step 2: Understand the wind data</h2>
<p>Wind data is split into two bands:</p>
<ul>
<li><strong>U</strong> = east-west component (positive = eastward)</li>
<li><strong>V</strong> = north-south component (positive = northward)</li>
</ul>
<p>You'll need both bands for visualization.</p>
<h2>Step 3: Create the TiTiler URL</h2>
<p>Use <code>vsicurl</code> to let TiTiler access the remote GRIB2 file directly:</p>
<pre><code>https://your-titiler-instance.xyz/cog/preview.png?rescale=-127,128&amp;url=vrt:///vsicurl/https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrrr.20250512/conus/hrrr.t06z.wrfsfcf04.grib2
</code></pre>
<h2>Step 4: Extract wind bands</h2>
<p>Get the U and V wind components (in this case, bands 10 and 11):</p>
<pre><code>https://your-titiler-instance.xyz/cog/preview.png?rescale=-127,128&amp;url=vrt:///vsicurl/https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrrr.20250512/conus/hrrr.t06z.wrfsfcf04.grib2?bands=10,11&amp;format=png
</code></pre>
<p>This gives you the necessary tiled wind png, ready for visualization. It should look something like this one:</p>
<p><img src="src/assets/wind-tile.png" alt="Wind tile example" /></p>
<h2>Step 5: Visualize with DeckGL</h2>
<p>Pass your complete TiTiler URL to the <code>ParticleLayer</code> from <a href="https://github.com/weatherlayers/weatherlayers-gl">WeatherLayers</a> in Deck.GL:</p>
<pre><code>new ParticleLayer({
  id: 'wind-particles',
  image: 'THE_URL_GOES_HERE',
  imageType: 'VECTOR',
  imageUnscale: [-127, 128],
  bounds: [-134.1214, 21.1222, -60.8912, 52.6287],
  clipBounds: [-134.1214, 21.1222, -60.8912, 52.6287],
  // rest of the config
})
</code></pre>
<p>The result should look something like this:</p>
<p>&lt;video src="/wind-viz.mp4" controls autoplay muted loop style="max-width: 100%;"&gt;&lt;/video&gt;</p>
<h2>What about GFS?</h2>
<p>I haven’t tested it yet, but the same approach should work for GFS data <a href="https://registry.opendata.aws/noaa-gfs-bdp-pds/">(NOAA GFS on AWS)</a> with the only difference being the path structure.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[VEDA's Fire Event Explorer]]></title>
            <link>https://gjoremilevski.com/posts/fire-event-explorer/</link>
            <guid isPermaLink="false">https://gjoremilevski.com/posts/fire-event-explorer/</guid>
            <pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A web-based tool to track fire events, overlay wind and terrain and export animations. Developed in collaboration with the Wildfire Tracking Lab as part of NASA's VEDA project.]]></description>
            <content:encoded><![CDATA[<p>The Fire Event Explorer, developed in collaboration with the <a href="https://earth-information-system.github.io/fireatlas/docs/">Wildfire Tracking Lab</a>, is now available as part of NASA’s VEDA Dashboard.</p>
<p>It lets you explore the progression of wildfire perimeters over time, overlay wind and terrain data and export animations or videos, all directly in the browser.</p>
<ul>
<li>Explore the tool: https://earthdata.nasa.gov/dashboard/tools/fire-event-explorer</li>
<li>How and why it was built: https://developmentseed.org/blog/2025-06-03-fire-exploration-tool/</li>
</ul>
<p>&lt;video src="/fire-event-explorer.webm" controls autoplay muted loop style="max-width: 100%;"&gt;&lt;/video&gt;</p>
<p>Note: VEDA is a set of open-source components and services for easily working with
earth observation data, as envisioned by NASA IMPACT.</p>
]]></content:encoded>
        </item>
    </channel>
</rss>