1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/**
* SPDX-License-Identifier: GPL-2.0-or-later
*
* This file is part of osm2pgsql (https://osm2pgsql.org/).
*
* Copyright (C) 2006-2025 by the osm2pgsql developer community.
* For a full list of authors see the git log.
*/
#include <catch.hpp>
#include "common-buffer.hpp"
#include "geom-from-osm.hpp"
#include "geom-functions.hpp"
#include "geom-output.hpp"
#include "geom.hpp"
TEST_CASE("geometry collection with point", "[NoDB]")
{
geom::geometry_t geom{geom::collection_t{}};
auto &c = geom.get<geom::collection_t>();
c.add_geometry(geom::geometry_t{geom::point_t{1, 1}});
REQUIRE(geometry_type(geom) == "GEOMETRYCOLLECTION");
REQUIRE(dimension(geom) == 0);
REQUIRE(num_geometries(geom) == 1);
REQUIRE(area(geom) == Approx(0.0));
REQUIRE(length(geom) == Approx(0.0));
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{1, 1}});
REQUIRE(geometry_n(geom, 1) == geom::geometry_t{geom::point_t{1, 1}});
}
TEST_CASE("geometry collection with multipoint", "[NoDB]")
{
geom::geometry_t mpgeom{geom::multipoint_t{}};
auto &mp = mpgeom.get<geom::multipoint_t>();
mp.add_geometry(geom::point_t{1, 1});
mp.add_geometry(geom::point_t{1, 2});
mp.add_geometry(geom::point_t{2, 1});
mp.add_geometry(geom::point_t{2, 2});
geom::geometry_t geom{geom::collection_t{}};
auto &c = geom.get<geom::collection_t>();
c.add_geometry(std::move(mpgeom));
REQUIRE(geometry_type(geom) == "GEOMETRYCOLLECTION");
REQUIRE(dimension(geom) == 0);
REQUIRE(num_geometries(geom) == 1);
REQUIRE(area(geom) == Approx(0.0));
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{1.5, 1.5}});
}
TEST_CASE("geometry collection with several geometries", "[NoDB]")
{
geom::geometry_t geom{geom::collection_t{}};
auto &c = geom.get<geom::collection_t>();
c.add_geometry(geom::geometry_t{geom::point_t{1, 1}});
c.add_geometry(geom::geometry_t{geom::linestring_t{{1, 1}, {2, 2}}});
c.add_geometry(geom::geometry_t{geom::point_t{2, 2}});
REQUIRE(geometry_type(geom) == "GEOMETRYCOLLECTION");
REQUIRE(dimension(geom) == 1);
REQUIRE(num_geometries(geom) == 3);
REQUIRE(area(geom) == Approx(0.0));
REQUIRE(length(geom) == Approx(1.41421));
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{1.5, 1.5}});
REQUIRE(geometry_n(geom, 1) == geom::geometry_t{geom::point_t{1, 1}});
REQUIRE(geometry_n(geom, 2) ==
geom::geometry_t{geom::linestring_t{{1, 1}, {2, 2}}});
REQUIRE(geometry_n(geom, 3) == geom::geometry_t{geom::point_t{2, 2}});
}
TEST_CASE("geometry collection with polygon", "[NoDB]")
{
geom::geometry_t geom{geom::collection_t{}};
auto &c = geom.get<geom::collection_t>();
c.add_geometry(geom::geometry_t{geom::point_t{1, 1}});
c.add_geometry(geom::geometry_t{
geom::polygon_t{geom::ring_t{{1, 1}, {1, 2}, {2, 2}, {2, 1}, {1, 1}}}});
REQUIRE(geometry_type(geom) == "GEOMETRYCOLLECTION");
REQUIRE(num_geometries(geom) == 2);
REQUIRE(area(geom) == Approx(1.0));
REQUIRE(length(geom) == Approx(0.0));
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{1.5, 1.5}});
}
TEST_CASE("create_collection from OSM data", "[NoDB]")
{
test_buffer_t buffer;
buffer.add_node("n1 x1 y1");
buffer.add_way("w20 Nn1x1y1,n2x2y1,n3x2y2,n4x1y2,n1x1y1");
buffer.add_way("w21 Nn5x10y10,n6x10y11");
buffer.add_relation("r30 Mw20@");
auto const geom = geom::create_collection(buffer.buffer());
REQUIRE(geometry_type(geom) == "GEOMETRYCOLLECTION");
REQUIRE(dimension(geom) == 1);
REQUIRE(num_geometries(geom) == 3);
auto const &c = geom.get<geom::collection_t>();
REQUIRE(c[0] == geom::geometry_t{geom::point_t{1, 1}});
REQUIRE(c[1] == geom::geometry_t{geom::linestring_t{
{1, 1}, {2, 1}, {2, 2}, {1, 2}, {1, 1}}});
REQUIRE(c[2] == geom::geometry_t{geom::linestring_t{{10, 10}, {10, 11}}});
REQUIRE(area(geom) == Approx(0.0));
REQUIRE(length(geom) == Approx(5.0));
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{3.2, 3.3}});
}
TEST_CASE("create_collection from no OSM data returns null geometry", "[NoDB]")
{
test_buffer_t buffer;
buffer.add_relation("r30 Mw20@");
auto const geom = geom::create_collection(buffer.buffer());
REQUIRE(geometry_type(geom) == "NULL");
REQUIRE(dimension(geom) == 0);
REQUIRE(num_geometries(geom) == 0);
}
TEST_CASE("create_collection from OSM data with single-node way", "[NoDB]")
{
test_buffer_t buffer;
buffer.add_way("w20 Nn1x1y1");
auto const geom = geom::create_collection(buffer.buffer());
REQUIRE(geom.is_null());
}
|