Overlay_polygon
geometric-functions overlay_polygon
syntax
- overlay_polygon or bp_overlay_polygon (first_polygon_data_item, second_polygon_data_item) for integer coordinates, using the boost-polygon library
- bg_overlay_polygon (first_polygon_data_item, second_polygon_data_item) works also on floating point coordinates, using the boost-geometry libraray.
description
overlay_polygon(first_polygon_data_item, second_polygon_data_item) results in a new uint32 domain-unit with an entry for each intersecting part of the first_polygon_data_item and the second_polygon_data_item.
The function generates three subitems for the new domain unit:
- geometry: the geometry of the resulting polygons (in the figure the yellow polygons). This attribute has the same values-unit as the first_polygon_data_item and second_polygon_data_item attributes.
- first_rel: a relation for the new domain unit towards the domain of the first_polygon_data_item.
- second_rel: a relation for the new domain unit towards the domain of the second_polygon_data_item.
In QGIS, this operation is known as intersect
.
It is similar to:
unit<uint32> CartesianProduct := combine(DomainUnit(first_polygon_data_item), DomainUnit(second_polygon_data_item))
{
attribute<ValuesUnit(first_polygon_data_item)> Geometry(poly) := first_polygon_data_item[first_rel] * second_polygon_data_item[second_rel];
attribute<bool> IsIntersecting := area(Geometry, Float64) > 0.0;
}
unit<uint32> result := select(CartesianProduct/IsIntersecting)
{
attribute<DomainUnit(first_polygon_data_item)> first_rel := collect_by_cond(., CartesianProduct/first_rel);
attribute<DomainUnit(second_polygon_data_item)> second_rel := collect_by_cond(., CartesianProduct/second_rel);
attribute<ValuesUnit(first_polygon_data_item)> Geometry(poly) := collect_by_cond(., CartesianProduct/Geometry);
}
applies to
attributes first_polygon_data_item and second_polygon_data_item with an ipoint or spoint value-type.
conditions
- The composition type of the first_polygon_data_item and second_polygon_data arguments needs to be polygon.
- The values-unit of the first_polygon_data_item and second_polygon_data arguments items must match.
- The order of the points in the first_polygon_data_item and second_polygon_data needs to be clockwise for exterior bounds and counter clockwise for holes in polygons (right-hand-rule).
This function results in problems for (integer) coordinates larger than 2^25 (after translation where the first point is moved to (0, 0)). If your integer coordinates for instance represent mm, 2^25[mm] = about 33 [km]. The reason is that for calculating intersections, products of coordinates are calculated and casted to float64 with a 53 bits mantissa (in the development/test environment of boost::polygon these were float80 values with a 64 bits mantissa). We advise to keep the size of your integer coordinates for polygons limited and for instance do not use a mm precision for country borders (meter or kilometer might be sufficient).
since version
7.042
example
unit<uint32> intersect := overlay_polygon(Building/geometry, District/geometry);