LinearRing.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 
9 
10 namespace f2c::types {
11 
13  this->data_ = std::shared_ptr<OGRLinearRing>(
14  static_cast<OGRLinearRing*>(
15  OGRGeometryFactory::createGeometry(wkbLinearRing)),
16  [](OGRLinearRing* f) {OGRGeometryFactory::destroyGeometry(f);});
17 }
18 
19 LinearRing::LinearRing(const std::vector<Point>& ps) {
20  for (auto&& p : ps) {
21  this->addPoint(p);
22  }
23 }
24 
25 LinearRing::LinearRing(const std::initializer_list<Point>& ps) {
26  for (auto&& p : ps) {
27  this->addPoint(p);
28  }
29 }
30 
31 void LinearRing::operator*=(double b) {
32  for (auto&& p : *this) {
33  p *= b;
34  }
35 }
36 
37 double LinearRing::getX(size_t i) const {
38  return this->data_->getX(i);
39 }
40 
41 double LinearRing::getY(size_t i) const {
42  return this->data_->getY(i);
43 }
44 double LinearRing::getZ(size_t i) const {
45  return this->data_->getZ(i);
46 }
47 double LinearRing::length() const {
48  return this->data_->get_Length();
49 }
50 
52  this->data_->reversePoints();
53 }
54 
55 size_t LinearRing::size() const {
56  return isEmpty() ? 0 : this->data_->getNumPoints();
57 }
58 
59 void LinearRing::getGeometry(size_t i, Point& point) {
60  if (i >= this->size()) {
61  throw std::out_of_range(
62  "Error getGeometry: LinearRing does not contain point " +
63  std::to_string(i));
64  }
65  data_->getPoint(i, point.get());
66 }
67 
68 void LinearRing::getGeometry(size_t i, Point& point) const {
69  if (i >= this->size()) {
70  throw std::out_of_range(
71  "Error getGeometry: LinearRing does not contain point " +
72  std::to_string(i));
73  }
74  data_->getPoint(i, point.get());
75 }
76 
78  if (i >= this->size()) {
79  throw std::out_of_range(
80  "Error getGeometry: LinearRing does not contain point " +
81  std::to_string(i));
82  }
83  OGRPoint point;
84  data_->getPoint(i, &point);
85  return Point(point);
86 }
87 
88 const Point LinearRing::getGeometry(size_t i) const {
89  if (i >= this->size()) {
90  throw std::out_of_range(
91  "Error getGeometry: LinearRing does not contain point " +
92  std::to_string(i));
93  }
94  return Point(data_->getX(i), data_->getY(i), data_->getZ(i));
95 }
96 
97 void LinearRing::setGeometry(size_t i, const Point& p) {
98  data_->setPoint(i, p.getX(), p.getY(), p.getZ());
99 }
100 
102  this->addPoint(p);
103 }
104 
105 void LinearRing::addPoint(double x, double y, double z) {
106  data_->addPoint(x, y, z);
107 }
108 
109 void LinearRing::addPoint(const Point& p) {
110  data_->addPoint(p.getX(), p.getY(), p.getZ());
111 }
112 
114  return getGeometry(0);
115 }
116 
118  return getGeometry(size()-1);
119 }
120 
122  return data_->isClockwise();
123 }
124 
125 bool LinearRing::isClosed() const {
126  return data_->IsEmpty() || data_->get_IsClosed();
127 }
128 
130  if (!this->isClosed()) {
131  this->addPoint(this->startPoint());
132  }
133  return *this;
134 }
135 
137  std::vector<double> dist;
138  std::vector<Point> ps;
139  for (size_t i = 0; i < this->size() - 1; ++i) {
140  ps.emplace_back(p.closestPointInSegment(this->at(i), this->at(i+1)));
141  dist.emplace_back(ps.back().distance(p));
142  }
143  return ps[std::min_element(dist.begin(), dist.end()) - dist.begin()];
144 }
145 
146 
147 } // namespace f2c::types
148 
f2c::types::LinearRing::getX
double getX(size_t i) const
Definition: LinearRing.cpp:37
f2c::types::Point::getZ
double getZ() const
Definition: Point.cpp:97
f2c::types
Types used by fields2cover library.
Definition: Cell.h:20
f2c::types::LinearRing::reversePoints
void reversePoints()
Definition: LinearRing.cpp:51
f2c::types::LinearRing::getZ
double getZ(size_t i) const
Definition: LinearRing.cpp:44
f2c::types::LinearRing::setGeometry
void setGeometry(size_t i, const Point &p)
Definition: LinearRing.cpp:97
f2c::types::LinearRing::getY
double getY(size_t i) const
Definition: LinearRing.cpp:41
f2c::types::Point::closestPointInSegment
Point closestPointInSegment(const Point &seg_s, const Point &seg_e) const
Definition: Point.cpp:169
f2c::types::LinearRing::addPoint
void addPoint(double x, double y, double z=0)
Definition: LinearRing.cpp:105
f2c::types::LinearRing
Definition: LinearRing.h:18
f2c::types::LinearRing::startPoint
const Point startPoint() const
Definition: LinearRing.cpp:113
f2c::types::LinearRing::getGeometry
void getGeometry(size_t i, Point &point)
Definition: LinearRing.cpp:59
f2c::types::LinearRing::isClockwise
bool isClockwise() const
Definition: LinearRing.cpp:121
f2c::types::LinearRing::isClosed
bool isClosed() const
Definition: LinearRing.cpp:125
f2c::types::Geometry< OGRLinearRing, R >::isEmpty
bool isEmpty() const
Definition: Geometry_impl.hpp:222
f2c::types::LinearRing::addGeometry
void addGeometry(const Point &p)
Definition: LinearRing.cpp:101
LineString.h
f2c::types::Geometry::get
T * get()
Definition: Geometry_impl.hpp:71
8_complete_flow.ps
list ps
Definition: 8_complete_flow.py:43
f2c::types::LinearRing::closestPointTo
Point closestPointTo(const Point &p) const
Definition: LinearRing.cpp:136
f2c::types::Point
Definition: Point.h:21
f2c::types::LinearRing::size
size_t size() const
Definition: LinearRing.cpp:55
f2c::types::LinearRing::endPoint
const Point endPoint() const
Definition: LinearRing.cpp:117
LinearRing.h
f2c::types::Geometry< OGRLinearRing, R >::data_
std::shared_ptr< OGRLinearRing > data_
Definition: Geometry.h:129
f2c::types::LinearRing::closeRing
LinearRing & closeRing()
Definition: LinearRing.cpp:129
f2c::types::Point::getY
double getY() const
Definition: Point.cpp:96
f2c::types::LinearRing::operator*=
void operator*=(double b)
Definition: LinearRing.cpp:31
f2c::types::Point::getX
double getX() const
Definition: Point.cpp:95
f2c::types::LinearRing::length
double length() const
Definition: LinearRing.cpp:47
f2c::types::LinearRing::LinearRing
LinearRing()
Definition: LinearRing.cpp:12
f2c::types::to_string
std::string to_string(double d, const int precision=6)
Definition: Path.cpp:274


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