transform_test.cpp
Go to the documentation of this file.
1 //=============================================================================
2 // Copyright (C) 2021-2024 Wageningen University - All Rights Reserved
3 // Author: Gonzalo Mier
4 // BSD-3 License
5 //=============================================================================
6 
7 #include <iostream>
8 #include <gtest/gtest.h>
10 #include "fields2cover.h"
11 
12 TEST(fields2cover_utils_transformer, convert_to_F2C_and_return) {
13  F2CCell poly(F2CLinearRing({
14  F2CPoint(6.062131843297665, 51.51238564279176, 0),
15  F2CPoint(6.062215149507296, 51.51204470468504, 0),
16  F2CPoint(6.062232423018175, 51.51197104647852, 0),
17  F2CPoint(6.062259746209906, 51.51187606814959, 0),
18  F2CPoint(6.062131843297665, 51.51238564279176, 0),
19  }));
20  auto poly_to_transform = poly;
21  EXPECT_TRUE(poly == poly_to_transform);
22  F2CField field {F2CCells(poly_to_transform)};
23  field.setEPSGCoordSystem(4326);
24  f2c::Transform::transform(field, "EPSG:28992");
25  EXPECT_EQ(field.getField().getCellBorder(0).startPoint(), F2CPoint(0, 0, 0));
26  EXPECT_EQ(field.getCRS(), "EPSG:28992");
27 
28  auto ref_gps_point = f2c::Transform::getRefPointInGPS(field);
29  EXPECT_NEAR(ref_gps_point.getX(), 6.062131843297665, 1e-3);
30  EXPECT_NEAR(ref_gps_point.getY(), 51.51238564279176, 1e-3);
31  EXPECT_NEAR(ref_gps_point.getZ(), 0, 1e-3);
32 
33  f2c::Transform::transform(field, "EPSG:4326");
34  auto final_field = (field.getField() + field.getRefPoint()).getCellBorder(0);
35  for (int i = 0; i < final_field.size(); ++i) {
36  EXPECT_NEAR(final_field.getGeometry(i).getX(),
37  poly.getGeometry(0).getGeometry(i).getX(), 1e-3);
38  EXPECT_NEAR(final_field.getGeometry(i).getY(),
39  poly.getGeometry(0).getGeometry(i).getY(), 1e-3);
40  EXPECT_NEAR(final_field.getGeometry(i).getZ(),
41  poly.getGeometry(0).getGeometry(i).getZ(), 1e-3);
42  }
43 
44  EXPECT_NO_THROW(f2c::Transform::transform(field, "UTM:32N datum:WGS84"));
45  EXPECT_THROW( f2c::Transform::transform(field, "NONE"), std::invalid_argument);
46  field.setCRS("");
47  EXPECT_THROW( f2c::Transform::transform(field, "EPSG:28992"), std::invalid_argument);
48 }
49 
50 TEST(fields2cover_utils_transformer, convert_to_UTM_and_return) {
51  F2CCell poly(F2CLinearRing({
52  F2CPoint(6.062131843297665, 51.51238564279176, 0),
53  F2CPoint(6.062215149507296, 51.51204470468504, 0),
54  F2CPoint(6.062232423018175, 51.51197104647852, 0),
55  F2CPoint(6.062259746209906, 51.51187606814959, 0),
56  F2CPoint(6.062131843297665, 51.51238564279176, 0),
57  }));
58  auto poly_to_transform = poly;
59  EXPECT_TRUE(poly == poly_to_transform);
60  F2CField field {F2CCells(poly_to_transform)};
61  field.setEPSGCoordSystem(4326);
63  EXPECT_EQ(field.getField().getCellBorder(0).startPoint(), F2CPoint(0, 0, 0));
64  EXPECT_EQ(field.getCRS(), "UTM:32N datum:WGS84");
65  EXPECT_EQ(field.getPrevCRS(), "EPSG:4326");
66 
68  auto final_field = (field.getField() + field.getRefPoint()).getCellBorder(0);
69  for (int i = 0; i < final_field.size(); ++i) {
70  EXPECT_NEAR(final_field.getGeometry(i).getX(),
71  poly.getGeometry(0).getGeometry(i).getX(), 1e-3);
72  EXPECT_NEAR(final_field.getGeometry(i).getY(),
73  poly.getGeometry(0).getGeometry(i).getY(), 1e-3);
74  EXPECT_NEAR(final_field.getGeometry(i).getZ(),
75  poly.getGeometry(0).getGeometry(i).getZ(), 1e-3);
76  }
77 
78  field.setCRS("");
79  EXPECT_LT(field.area(), 1e-5);
80  EXPECT_GT(field.area(), 0);
82  EXPECT_EQ(field.getCRS(), "UTM:32N datum:WGS84");
83  EXPECT_NEAR(field.area(), 5.9, 0.005);
85  EXPECT_LT(field.area(), 1e-5);
86  EXPECT_GT(field.area(), 0);
87 
88  field.setCRS("");
90  EXPECT_EQ(field.getCRS(), "UTM:32N datum:ETRS89");
91  EXPECT_NEAR(field.area(), 5.9, 0.005);
93  EXPECT_LT(field.area(), 1e-5);
94  EXPECT_GT(field.area(), 0);
95 
96 
97  field.setCRS("EPSG:4258");
99  EXPECT_EQ(field.getCRS(), "UTM:32N datum:ETRS89");
100  EXPECT_NEAR(field.area(), 5.9, 0.005);
102  EXPECT_LT(field.area(), 1e-5);
103  EXPECT_GT(field.area(), 0);
104 
105  field.setCRS("ERROR");
106  EXPECT_THROW( f2c::Transform::transformToUTM(field), std::invalid_argument);
107  field.setCRS("");
108  EXPECT_THROW( f2c::Transform::transformToPrevCRS(field), std::invalid_argument);
109 }
110 
111 TEST(fields2cover_utils_transformer, convert_types) {
112  F2CLineString line({
113  F2CPoint(6.062131843297665, 51.51238564279176, 0),
114  F2CPoint(6.062215149507296, 51.51204470468504, 0)});
115  F2CSwath swath{line, 30, 1};
117  swaths.push_back(swath);
118 
119  auto moved_swaths = f2c::Transform::transformSwaths(swaths, "EPSG:4326", "EPSG:28992");
120 
121  F2CStrip strip;
122  strip.setCell(F2CCell::buffer(moved_swaths[0].getPath(), 15));
123  F2CStrips strips;
124  strips.emplace_back(strip);
125 
126 
127  auto cells = moved_swaths.at(0).areaCovered();
128  F2CField field(cells, "field");
129  field.setEPSGCoordSystem(28992);
130  field.setPrevCRS("EPSG:4326");
131  EXPECT_NE(field.getRefPoint().getX(), 6.062131843297665);
132  EXPECT_NE(field.getRefPoint().getY(), 51.51238564279176);
133  EXPECT_GT(field.getRefPoint().getX(), 1e4);
134  EXPECT_GT(field.getRefPoint().getY(), 1e4);
135  EXPECT_NEAR(field.area(), 1150, 10);
136  EXPECT_NEAR(strip.getCell().area(), 1150, 10);
137 
138  auto moved_strips = f2c::Transform::transformStrips(strips, "EPSG:28992", "EPSG:4326");
139  auto moved_cells = f2c::Transform::transform(cells, "EPSG:28992", "EPSG:4326");
140  EXPECT_NEAR(moved_strips[0].getCell().area(), moved_cells.area(), 1e-7);
141 
142  F2CPath path;
143  path.appendSwath(moved_swaths.at(0), 10);
144  F2CPath path2;
145  F2CSwath swath2{F2CLineString({F2CPoint(0,0), F2CPoint(1,1)}), 40, 2};
146  path2.appendSwath(swath2, 10);
147 
148 
149  auto returned_path = f2c::Transform::transformPath(path, "EPSG:28992", "EPSG:4326");
150  EXPECT_NEAR(returned_path[0].point.getX(), 6.062131843297665, 1e-3);
151  EXPECT_NEAR(returned_path[0].point.getY(), 51.51238564279176, 1e-3);
152  auto returned_path2 = f2c::Transform::transformPathWithFieldRef(path2, field, "EPSG:4326");
153  EXPECT_NEAR(returned_path2[0].point.getX(), 6.062131843297665, 1e-3);
154  EXPECT_NEAR(returned_path2[0].point.getY(), 51.51238564279176, 1e-3);
155  auto returned_path3 = f2c::Transform::transformToPrevCRS(path2, field);
156  EXPECT_NEAR(returned_path3[0].point.getX(), 6.062131843297665, 1e-3);
157  EXPECT_NEAR(returned_path3[0].point.getY(), 51.51238564279176, 1e-3);
158 
159  auto returned_swaths =
160  f2c::Transform::transformSwathsWithFieldRef(moved_swaths, field, "EPSG:4326");
161  EXPECT_NEAR(returned_path2[0].point.getX(), 6.062131843297665, 1e-3);
162  EXPECT_NEAR(returned_path2[0].point.getY(), 51.51238564279176, 1e-3);
163 }
f2c::types::Cell::buffer
static Cell buffer(const Cell &geom, double width)
Definition: Cell.cpp:99
f2c::types::Geometries::area
double area() const
Compute area of the geometry.
Definition: Geometries_impl.hpp:14
5_route_planning.swaths
swaths
Definition: 5_route_planning.py:58
f2c::types::Path::appendSwath
void appendSwath(const Swath &swath, double cruise_speed)
Definition: Path.cpp:210
1_basic_types.cells
cells
Definition: 1_basic_types.py:93
transformation.h
2_objective_functions.path
path
Definition: 2_objective_functions.py:88
f2c::types::Field
Definition: Field.h:18
f2c::Transform::transform
static void transform(F2CField &field, const std::string &coord_sys_to)
Definition: transformation.cpp:20
f2c::Transform::transformPathWithFieldRef
static F2CPath transformPathWithFieldRef(const F2CPath &path, const F2CField &field, const std::string &coord_sys_to)
Definition: transformation.cpp:50
F2CStrips
std::vector< F2CStrip > F2CStrips
Definition: types.h:57
f2c::types::Strip::setCell
void setCell(const Cell &cell)
Definition: Strip.cpp:19
f2c::types::Swath
Definition: Swath.h:23
F2CCells
f2c::types::Cells F2CCells
Definition: types.h:44
fields2cover.h
f2c::types::Strip
Definition: Strip.h:16
f2c::Transform::transformSwathsWithFieldRef
static F2CSwaths transformSwathsWithFieldRef(const F2CSwaths &swaths, const F2CField &field, const std::string &coord_sys_to)
Definition: transformation.cpp:95
f2c::types::Cell
Definition: Cell.h:32
f2c::types::Path
Definition: Path.h:23
f2c::Transform::transformSwaths
static F2CSwaths transformSwaths(const F2CSwaths &s, const std::string &coord_sys_from, const std::string &coord_sys_to)
Definition: transformation.cpp:123
f2c::types::LineString
Definition: LineString.h:19
F2CLinearRing
f2c::types::LinearRing F2CLinearRing
Definition: types.h:41
f2c::Transform::transformToPrevCRS
static void transformToPrevCRS(F2CField &field)
Definition: transformation.cpp:197
F2CLineString
f2c::types::LineString F2CLineString
Definition: types.h:40
f2c::types::Point
Definition: Point.h:21
2_objective_functions.field
field
Definition: 2_objective_functions.py:16
f2c::types::Cell::getGeometry
void getGeometry(size_t i, LinearRing &ring)
Definition: Cell.cpp:35
f2c::types::Strip::getCell
Cell & getCell()
Definition: Strip.cpp:11
f2c::Transform::transformStrips
static F2CStrips transformStrips(const F2CStrips &s, const std::string &coord_sys_from, const std::string &coord_sys_to)
Definition: transformation.cpp:113
f2c::Transform::transformPath
static F2CPath transformPath(const F2CPath &p, const std::string &coord_sys_from, const std::string &coord_sys_to)
Definition: transformation.cpp:139
TEST
TEST(fields2cover_utils_transformer, convert_to_F2C_and_return)
Definition: transform_test.cpp:12
f2c::types::Swaths
Definition: Swaths.h:20
f2c::Transform::getRefPointInGPS
static F2CPoint getRefPointInGPS(const F2CField &field)
Definition: transformation.cpp:235
F2CPoint
f2c::types::Point F2CPoint
Definition: types.h:38
2_objective_functions.swath2
swath2
Definition: 2_objective_functions.py:32
f2c::Transform::transformToUTM
static void transformToUTM(F2CField &field, bool is_etrs89_opt=true)
Definition: transformation.cpp:149


fields2cover
Author(s):
autogenerated on Fri Apr 25 2025 02:18:31