Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision Both sides next revision
image_expression_null_value_handling [2022/08/20 19:45]
admin
image_expression_null_value_handling [2022/08/20 20:14]
admin
Line 39: Line 39:
  
 If you need to retrieve the number corresponding to a image null value, you can use the ''​null( iX )''​ expression. For instance, ''​null(i1)''​ returns the number corresponding to the null value of image ''​i1''​. So if, so some reason, you need to retrieve the image value or its corresponding numeric null value, you can use ''​i1 ? null(i1)''​ or ''​if isnull(i1) then null(i1) then i1''​. Note that ''​null(i1)''​ is very different from expression ''​null'',​ since ''​null(i1)''​ always returns a valid numeric value and ''​null''​ returns a special construct that, if not contained, invalidates the expression evaluation producing null as a result. If you need to retrieve the number corresponding to a image null value, you can use the ''​null( iX )''​ expression. For instance, ''​null(i1)''​ returns the number corresponding to the null value of image ''​i1''​. So if, so some reason, you need to retrieve the image value or its corresponding numeric null value, you can use ''​i1 ? null(i1)''​ or ''​if isnull(i1) then null(i1) then i1''​. Note that ''​null(i1)''​ is very different from expression ''​null'',​ since ''​null(i1)''​ always returns a valid numeric value and ''​null''​ returns a special construct that, if not contained, invalidates the expression evaluation producing null as a result.
 +
 +===== Proper Way of Testing for Image Values -- Guarding Against Null Values =====
 +
 +Lets assume that we want to replace all occurrences of a given valid value in a image with some other valid valid: ''​if i1 = 2 then 10 else i1''​. Since we are not explicitly guarding the ''​if then else''​ test against null, the expression is internally equivalent to ''​if isnull(i1) then null else if i1 = 2 then 10 else i1''​. So, simply using the most compact ''​if then else''​ definition works as expected.
 +
 +Now, lets assume the we want do combine two images a landscape map and road map as a single map, where roads in the road map are represent by the value 1 and everything else is represented using the null value. Assuming the ''​i1''​ is the landscape map and ''​i2''​ is the road map, we might be tempted to write an expression as ''​if i2 = 1 then 1 else i1''​. Unfortunately that is not going to work, since the expression is internally equivalent to ''​if isnull(i2) then null else if i2 = 1 then 1 else i1''​ (we not guarding against null values). As you can see, all occurrences of null values on the road map will be replicated in the output map.
 +
 +So, the proper way of doing the calculation is using a ''​isnull( ix)''​ to protect the ''​if then else''​ test against the null: ''​if not isnull(i2) and i2 = 1 then 1 else i2''​. Now we only test for the value in the road map if we are sure that value is not going to contaminate the whole ''​if then else''​ turning the result into null.