<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
Hi all, </div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
I’m trying to mask a band from a GeoTiff file like so:</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div><font face="Courier">>>> from osgeo import gdal, ogr, osr</font></div>
<div><font face="Courier">>>> from gdalconst import *</font></div>
<div><font face="Courier">>>> import numpy as np</font></div>
<div><font face="Courier">>>> import matplotlib as mpl</font></div>
<div>
<div><font face="Courier">>>> dataset = gdal.Open('001.tif')</font></div>
<div><font face="Courier">>>> band = dataset.GetRasterBand(1)</font></div>
<div><font face="Courier">>>> ba = band.ReadAsArray()</font></div>
<div><font face="Courier"><br>
</font></div>
<div><font face="Courier">>>> print "Origin:", ba[0, 0], type(ba[0, 0])  # NODATA value in image == zero</font></div>
<div>
<pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">Origin: 0 <type 'numpy.uint16'></font></pre>
</div>
<div><font face="Courier"><br>
</font></div>
<div><font face="Courier">>>> print "(5, 5):", ba[5, 5], type(ba[5, 5])</font></div>
<div>
<pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">(5, 5): 42271 <type 'numpy.uint16'></font></pre>
</div>
<div><font face="Courier"><br>
</font></div>
<div><font face="Courier">>>> print "Nodata:", band.GetNoDataValue()     # NODATA from file == None</font></div>
<div>
<pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">Nodata: None</font></pre>
</div>
<div><font face="Courier"><br>
</font></div>
<div><font face="Courier">>>> print "Mask flags:", band.GetMaskFlags()</font></div>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px;">
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">Mask flags: 1</font></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier"><br></font></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">>>> band.SetNoDataValue(0)                     # Set the NODATA value to zero
>>> print "Nodata:", band.GetNoDataValue(), type(band.GetNoDataValue())</font></pre>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px;">
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">Nodata: 0.0 <type 'float’></font></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier"><br></font></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">>>> mb = band.GetMaskBand()
>>> ma = mb.ReadAsArray()
<br></font></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">>>> print "Origin:", ma[0, 0], type(ma[0, 0])  # *** SHOULD BE ZERO!!! ***
</font><pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">Origin: 255 <type 'numpy.uint8'></font></pre></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier"><br></font></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">>>> print "(5, 5):", ma[5, 5], type(ma[5, 5])  # Correct</font></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">(5, 5): 255 <type 'numpy.uint8'></font></pre></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier"><br></font></pre>
<pre style="box-sizing: border-box; overflow: auto; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: inherit; word-break: break-all; word-wrap: break-word; border: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; white-space: pre-wrap; vertical-align: baseline;"><font face="Courier">>>> print np.any(ma==0)                        # Mask band is entirely 255</font></pre>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">False</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
As you can see, the mask covers the entire image and not the zeros on the edge.  </div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
The band.GetNoDataValue() is returning a Python float() which leads me to suspect that there is incorrect type handling within GDAL’s Python wrapping such that the mask generation is trying to compare the band’s raster values (GDAL_UInt16) to whatever the NoDataValue
 type is stored internally.  Am I way off base or is there something I’m missing?</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
Cheers!</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<div id="">
<div>
<div style="color: rgb(181, 181, 181); margin: 0px;"><span style="font-size: 10px;">______________________________________________</span></div>
<div style="color: rgb(108, 108, 108); margin: 0px;"><span style="font-size: 13px;">Dave Welch <span style="color: rgb(250, 167, 87);">Software Engineer</span></span></div>
<div style="color: rgb(108, 108, 108); margin: 0px;"><span style="font-size: 13px;">URTHE<span style="color: rgb(250, 167, 87);">CAST</span></span></div>
<div style="color: rgb(249, 145, 88); margin: 0px; min-height: 14px;"><br>
</div>
<div style="margin: 0px;"><span style="font-size: 13px;"><span style="color: rgb(81, 81, 81);">111 West Port Plaza Suite 300</span>  <span style="color: rgb(249, 145, 88);">l  </span><font color="#6c6c6c">St. Louis, MO </font><span style="color: rgb(249, 145, 88);">l</span> <font color="#6c6c6c">USA</font> <span style="color: rgb(249, 145, 88);">l</span> <font color="#6c6c6c">63146</font></span></div>
<div style="color: rgb(108, 108, 108); margin: 0px; min-height: 14px;"><span style="font-size: 10px;"><br>
</span></div>
<div style="color: rgb(112, 112, 112); margin: 0px;"><span style="font-size: 10px;"><a href="http://www.urthecast.com/">urthecast.com</a><span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(249, 145, 88);">l  </span>Connect <a href="https://twitter.com/urthecast">@urthecast</a></span></div>
<div style="margin: 0px; min-height: 14px;"><span style="font-size: 10px;"><br>
</span></div>
<div style="color: rgb(170, 170, 170); margin: 0px;"><span style="font-size: 10px;">This e-mail and any attachments are for the use of the intended recipient(s) and may contain legally privileged, proprietary and/or confidential information. </span></div>
<div style="color: rgb(170, 170, 170); margin: 0px;"><span style="font-size: 10px;">Any use or disclosure of this e-mail (including attachments) for any purpose other than those specifically authorized is prohibited. </span></div>
<div style="color: rgb(170, 170, 170); margin: 0px;"><span style="font-size: 10px;">If you are not the intended recipient, please immediately notify the sender and permanently delete all copies.</span></div>
</div>
<br>
</div>
</div>
</body>
</html>