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

  1. The composition type of the first_polygon_data_item and second_polygon_data arguments needs to be polygon.
  2. The values-unit of the first_polygon_data_item and second_polygon_data arguments items must match.
  3. 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);