Groovy Week 2020: Building a Bounding Box using a Collector
In our third installment of the 2020 Groovy Week, we are going to cover a typical use case of hale»studio's Collector feature: building a bounding box covering the geometries of all source objects. For an introduction to the powerful Collector feature, make sure to check out our previous post on the subject. Like in the previous Groovy Week posts, note that this article assumes you have working knowledge of hale»studio and know the terminology.
Wednesday's Script: Building a Bounding Box using a Collector (Florian)
A typical use case for calculating a bounding box covering the geometries of all source objects is creating an alignment to the INSPIRE Species Distribution theme. Transforming to this theme typically comprises creating several SpeciesDistributionUnit
instances and a single SpeciesDistributionDataset
instance which references those units.
When creating the SpeciesDistributionDataset
instance, one of the mandatory target attributes to fill is domainExtent
which should contain the geographic extent of all contained SpeciesDistributionUnit
instances. To achieve this, we will create a bounding box covering all SpeciesDistributionUnit
geometries on the fly during the transformation using a Collector. While there exists the specialized function Compute Extent
for calculating bounding boxes, using it would require a Merge
over all source instances. Using a Collector is more efficient in this case.
Instead of using the Rename
function to map the source geometry to the SpeciesDistributionUnit
, use the following Groovy script:
To assign the calculated bounding to the domainExtent
property of the SpeciesDistributionDataset
type, use the script below:
Make sure to reduce the priority of the SpeciesDistributionDataset
transformation to make sure that it is executed last, i.e. after all SpeciesDistributionUnit
s are created.
You can download the script snippets here and here and import them in hale»studio as a Groovy snippet by going to File -> Import -> Groovy Snippet. Please note that some scripts use protected functions, so you might need to "Lift Groovy Restrictions" to execute the script. Make sure you replace the placeholder attribute names with your own attribute names.
Happy transforming!