Sean Gillies (Posts about lidar)
https://sgillies.net/tags/lidar.atom
2023-12-31T01:26:24Z
Sean Gillies
Nikola
Rasterio cookbook recipe number one
https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html
2014-02-14T00:00:00-07:00
2014-02-14T00:00:00-07:00
Sean Gillies
<p>I got a nice message today from a developer who found rasterio to be the right
tool for scaling the values of a 15 GB LiDAR DEM. Here's the code.</p>
<div class="code"><pre class="code python"><a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-1" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-1" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-1"></a><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-2" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-2" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-2"></a><span class="kn">import</span> <span class="nn">rasterio</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-3" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-3" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-3"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-4" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-4" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-4"></a><span class="sd">"""</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-5" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-5" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-5"></a><span class="sd">2014-02-13</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-6" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-6" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-6"></a><span class="sd">Bryan Luman</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-7" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-7" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-7"></a><span class="sd">Use it however you like at your own risk</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-8" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-8" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-8"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-9" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-9" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-9"></a><span class="sd">Problem:</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-10" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-10" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-10"></a><span class="sd">I have a huge DEM converted from LiDAR LAS points. I'd like to make</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-11" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-11" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-11"></a><span class="sd">it slightly less massive for further processing.</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-12" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-12" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-12"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-13" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-13" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-13"></a><span class="sd">All my z values are between 682 and 869 feet stored as float32. If</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-14" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-14" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-14"></a><span class="sd">I convert them to centimeters and they will fit well within a 16 bit</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-15" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-15" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-15"></a><span class="sd">unsigned integer.</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-16" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-16" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-16"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-17" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-17" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-17"></a><span class="sd">This saves a significant amount of storage space and greatly reduces</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-18" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-18" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-18"></a><span class="sd">any type of future analysis.</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-19" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-19" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-19"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-20" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-20" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-20"></a><span class="sd">"""</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-21" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-21" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-21"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-22" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-22" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-22"></a><span class="n">CM_IN_FOOT</span> <span class="o">=</span> <span class="mf">30.48</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-23" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-23" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-23"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-24" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-24" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-24"></a><span class="k">with</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">drivers</span><span class="p">():</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-25" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-25" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-25"></a> <span class="k">with</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'massive_dem_as_float'</span><span class="p">)</span> <span class="k">as</span> <span class="n">src</span><span class="p">:</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-26" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-26" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-26"></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">meta</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-27" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-27" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-27"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-28" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-28" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-28"></a> <span class="n">driver</span><span class="o">=</span><span class="s1">'GTiff'</span><span class="p">,</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-29" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-29" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-29"></a> <span class="n">dtype</span><span class="o">=</span><span class="n">rasterio</span><span class="o">.</span><span class="n">uint16</span><span class="p">,</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-30" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-30" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-30"></a> <span class="n">count</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-31" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-31" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-31"></a> <span class="n">compress</span><span class="o">=</span><span class="s1">'lzw'</span><span class="p">,</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-32" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-32" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-32"></a> <span class="n">nodata</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-33" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-33" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-33"></a> <span class="n">bigtiff</span><span class="o">=</span><span class="s1">'YES'</span> <span class="c1"># Output will be larger than 4GB</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-34" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-34" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-34"></a> <span class="p">)</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-35" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-35" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-35"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-36" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-36" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-36"></a> <span class="n">windows</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">block_windows</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-37" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-37" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-37"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-38" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-38" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-38"></a> <span class="k">with</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">open</span><span class="p">(</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-39" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-39" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-39"></a> <span class="s1">'less_massive_dem_with_as_int.tif'</span><span class="p">,</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-40" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-40" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-40"></a> <span class="s1">'w'</span><span class="p">,</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-41" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-41" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-41"></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">as</span> <span class="n">dst</span><span class="p">:</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-42" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-42" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-42"></a> <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">window</span> <span class="ow">in</span> <span class="n">windows</span><span class="p">:</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-43" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-43" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-43"></a> <span class="n">src_data</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">read_band</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">window</span><span class="o">=</span><span class="n">window</span><span class="p">)</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-44" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-44" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-44"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-45" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-45" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-45"></a> <span class="c1"># Source nodata value is a very small negative number</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-46" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-46" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-46"></a> <span class="c1"># Converting in to zero for the output raster</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-47" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-47" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-47"></a> <span class="n">np</span><span class="o">.</span><span class="n">putmask</span><span class="p">(</span><span class="n">src_data</span><span class="p">,</span> <span class="n">src_data</span> <span class="o"><</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-48" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-48" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-48"></a>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-49" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-49" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-49"></a> <span class="n">dst_data</span> <span class="o">=</span> <span class="p">(</span><span class="n">src_data</span> <span class="o">*</span> <span class="n">CM_IN_FOOT</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">rasterio</span><span class="o">.</span><span class="n">uint16</span><span class="p">)</span>
<a id="rest_code_26ae95419c8c4e8ebb637235d6940ae3-50" name="rest_code_26ae95419c8c4e8ebb637235d6940ae3-50" href="https://sgillies.net/2014/02/14/rasterio-cookbook-recipe-number-one.html#rest_code_26ae95419c8c4e8ebb637235d6940ae3-50"></a> <span class="n">dst</span><span class="o">.</span><span class="n">write_band</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">dst_data</span><span class="p">,</span> <span class="n">window</span><span class="o">=</span><span class="n">window</span><span class="p">)</span>
</pre></div>
<p>This uses the windowed read and write and windows iterator features of
rasterio that I worked on with <a class="reference external" href="https://github.com/AsgerPetersen">Asger Skovbo Petersen</a>.</p>
<p>Do you have any more short rasterio code examples? I'd love to start collecting
these into a cookbook of sorts.</p>