Program Listing for File MultiLineString.h

Return to documentation for file (include/fields2cover/types/MultiLineString.h)

//=============================================================================
//    Copyright (C) 2021-2024 Wageningen University - All Rights Reserved
//                     Author: Gonzalo Mier
//                        BSD-3 License
//=============================================================================

#pragma once
#ifndef FIELDS2COVER_TYPES_MULTILINESTRING_H_
#define FIELDS2COVER_TYPES_MULTILINESTRING_H_

#include <gdal/ogr_geometry.h>
#include <utility>
#include "fields2cover/types/Geometries.h"
#include "fields2cover/types/LineString.h"

namespace f2c::types {

struct MultiLineString :
    public Geometries<MultiLineString, OGRMultiLineString,
            wkbMultiLineString, LineString> {
 public:
  using Geometries<MultiLineString, OGRMultiLineString,
            wkbMultiLineString, LineString>::Geometries;
  MultiLineString();
  explicit MultiLineString(const OGRGeometry* geom);
  explicit MultiLineString(const LineString& line);
  explicit MultiLineString(const std::initializer_list<LineString>& ls);

  size_t size() const;

  double length() const;

  void operator*=(double b);

  void getGeometry(size_t i, LineString& line);

  void getGeometry(size_t i, LineString& line) const;

  LineString getGeometry(size_t i);

  const LineString getGeometry(size_t i) const;

  void setGeometry(size_t i, const LineString& line);

  void append(const OGRGeometry* geom);

  void addGeometry(const LineString& line);
  void addGeometry(const MultiLineString& lines);

  static MultiLineString getLineSegments(const LineString& line);
  static MultiLineString getLineSegments(const LinearRing& line);

  template <class T, OGRwkbGeometryType R>
  MultiLineString intersection(const Geometry<T, R>& g) const;

  template <class T, OGRwkbGeometryType R>
  static MultiLineString intersection(
      const LineString& line, const Geometry<T, R>& g);
};


template <class T, OGRwkbGeometryType R>
MultiLineString MultiLineString::intersection(const Geometry<T, R>& g) const {
  auto inter = this->data_->Intersection(g.get());
  f2c::types::MultiLineString lines(inter);
  OGRGeometryFactory::destroyGeometry(inter);
  return lines;
}


template <class T, OGRwkbGeometryType R>
MultiLineString MultiLineString::intersection(
    const LineString& line, const Geometry<T, R>& g) {
  auto inter = line->Intersection(g.get());
  f2c::types::MultiLineString lines(inter);
  OGRGeometryFactory::destroyGeometry(inter);
  return lines;
}


}  // namespace f2c::types

#endif  // FIELDS2COVER_TYPES_MULTILINESTRING_H_