Skip to content

Commit c33342f

Browse files
committed
Add polygon tests, fix area() function
1 parent ddd6d64 commit c33342f

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed

src/geom-functions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ double area(geometry_t const &geom)
301301
}
302302
}
303303

304-
return total;
304+
return std::abs(total);
305305
}
306306

307307
namespace {

tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ set_test(test-geom-box LABELS NoDB)
4646
set_test(test-geom-lines LABELS NoDB)
4747
set_test(test-geom-null LABELS NoDB)
4848
set_test(test-geom-points LABELS NoDB)
49+
set_test(test-geom-polygons LABELS NoDB)
4950
set_test(test-middle)
5051
set_test(test-node-locations LABELS NoDB)
5152
set_test(test-options-database LABELS NoDB)

tests/test-geom-polygons.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* SPDX-License-Identifier: GPL-2.0-or-later
3+
*
4+
* This file is part of osm2pgsql (https://osm2pgsql.org/).
5+
*
6+
* Copyright (C) 2006-2022 by the osm2pgsql developer community.
7+
* For a full list of authors see the git log.
8+
*/
9+
10+
#include <catch.hpp>
11+
12+
#include "geom-functions.hpp"
13+
#include "geom.hpp"
14+
15+
TEST_CASE("polygon geometry without inner", "[NoDB]")
16+
{
17+
geom::geometry_t const geom{
18+
geom::polygon_t{geom::ring_t{{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}}}};
19+
20+
REQUIRE(num_geometries(geom) == 1);
21+
REQUIRE(area(geom) == Approx(1.0));
22+
REQUIRE(geometry_type(geom) == "POLYGON");
23+
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{0.5, 0.5}});
24+
}
25+
26+
TEST_CASE("polygon geometry without inner (reverse)", "[NoDB]")
27+
{
28+
geom::geometry_t const geom{
29+
geom::polygon_t{geom::ring_t{{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}}};
30+
31+
REQUIRE(num_geometries(geom) == 1);
32+
REQUIRE(area(geom) == Approx(1.0));
33+
REQUIRE(geometry_type(geom) == "POLYGON");
34+
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{0.5, 0.5}});
35+
}
36+
37+
TEST_CASE("polygon geometry with inner", "[NoDB]")
38+
{
39+
geom::geometry_t const geom{
40+
geom::polygon_t{geom::ring_t{{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}}}};
41+
42+
REQUIRE(num_geometries(geom) == 1);
43+
REQUIRE(area(geom) == Approx(1.0));
44+
REQUIRE(geometry_type(geom) == "POLYGON");
45+
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{0.5, 0.5}});
46+
}
47+
48+
TEST_CASE("geom::polygon_t", "[NoDB]")
49+
{
50+
geom::polygon_t polygon;
51+
52+
REQUIRE(polygon.outer().empty());
53+
polygon.outer() = geom::ring_t{{0, 0}, {0, 3}, {3, 3}, {3, 0}, {0, 0}};
54+
polygon.inners().emplace_back(
55+
geom::ring_t{{1, 1}, {2, 1}, {2, 2}, {1, 2}, {1, 1}});
56+
57+
REQUIRE(polygon.num_geometries() == 1);
58+
REQUIRE(polygon.inners().size() == 1);
59+
60+
geom::geometry_t geom{std::move(polygon)};
61+
REQUIRE(num_geometries(geom) == 1);
62+
REQUIRE(area(geom) == Approx(8.0));
63+
REQUIRE(geometry_type(geom) == "POLYGON");
64+
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{1.5, 1.5}});
65+
}

0 commit comments

Comments
 (0)