Calculated column formulas are a powerful feature of Cartographica, allowing you to create a column that changes with other data in the layer. However, it's not obvious that these formulas contain a lot of additional flexibility. It is possible, for example, to create discontinuous functions by using the "if" operator, which is mentioned in the documentation.
trunc(value/500)*500 if(value>0) else 0
Breaking this down, we'll use 599 as an example value first:
- trunc( value/500) takes the value, divides it by 500 and then removes everything after the decimal point. 599/500 is 1.198 and thus trunc( 599/500) = 1
- *500 multiplies this by 500. 1*500 = 500.
- if (value>0) is where the fun begins. Right now, the calculated amount is 500, but this test will determine if that calculation is used or not. The test is value>0, thus 599>0, which in this case is true. Thus, we'll be using the value before now in the formula.
- else 0 is not going to be used here because the if(value>0) test was successful. However, if it wasn't, then we'd be moving to the next expression, which is 0.
- trunc( value/500) takes the value, divides it by 500 and then removes everything after the decimal point. -4200/500 is -8.4 and thus trunc( -4200/500) = -8
- *500 multiplies this by 500. -8*500 = -4000.
- if (value>0) is where the fun begins. This time, the calculated amount is -4000, but this test will determine if that calculation is used or not. The test is value>0, thus -4000>0, which in this case is false. Thus, we'll be throwing out the calculation we've done so far.
- else 0 is now going to be used, because we failed the previous test.
So, with the value=-4200, the column calculated by this formula would be 0.
Of course, there's no reason why you should limit yourself to a single source column, so instead of testing the column in the calculation, you could test a value from another column. For example, let's say you have a polygon layer with a "Crop" column that describes what is planted in an area. You want to calculate the potential yield for your polygon layer, knowing that when Crop is "Corn", it's going to be 10 per acre, when it's "Wheat" it's 8 per acre, and when it's "Fallow" it's zero. How do we represent this?
geometry.area()*10 if (Crop=="Corn") else (geometry.area()*8) if (Crop=="Wheat") else 0)
A few things to note about this:
- It is comprised of 2 different clauses:
geometry.area()*10 if (Crop=="Corn") else ...
geomerty.area()*8 if (Crop=="Wheat") else 0
With the second clause being in parenthesis to indicate that it is to be taken as a unit and only evaluated if the first clause is inappropriate.
- The equality comparison is made using a == and not an =. This is part of the syntax and must be yielded. If you use just a single =, you will get an error while typing in the formula.