You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
4.9 KiB
C++

/***************************************************************************
* Copyright (C) gempa GmbH *
* All rights reserved. *
* Contact: gempa GmbH (seiscomp-dev@gempa.de) *
* *
* GNU Affero General Public License Usage *
* This file may be used under the terms of the GNU Affero *
* Public License version 3.0 as published by the Free Software Foundation *
* and appearing in the file LICENSE included in the packaging of this *
* file. Please review the following information to ensure the GNU Affero *
* Public License version 3.0 requirements will be met: *
* https://www.gnu.org/licenses/agpl-3.0.html. *
* *
* Other Usage *
* Alternatively, this file may be used in accordance with the terms and *
* conditions contained in a signed written agreement between you and *
* gempa GmbH. *
***************************************************************************/
#ifndef SEISCOMP_GEO_FEATURE_H
#define SEISCOMP_GEO_FEATURE_H
#include <seiscomp/core/baseobject.h>
#include <seiscomp/geo/coordinate.h>
#include <seiscomp/geo/boundingbox.h>
#include <map>
namespace Seiscomp {
namespace Geo {
DEFINE_SMARTPOINTER(Category);
DEFINE_SMARTPOINTER(GeoFeature);
struct SC_SYSTEM_CORE_API Category {
unsigned int id;
std::string name;
std::string localName;
const Category* parent;
std::string dataDir;
Category(unsigned int id, std::string name = "",
const Category* parent = nullptr) :
id(id), name(name), parent(parent) {}
};
class SC_SYSTEM_CORE_API GeoFeature : public Core::BaseObject {
public:
typedef std::map<std::string, std::string> Attributes;
GeoFeature(const Category* category = nullptr, unsigned int rank = 1);
GeoFeature(const std::string& name, const Category* category,
unsigned int rank);
GeoFeature(const std::string& name, const Category* category,
unsigned int rank, const Attributes& attributes);
virtual ~GeoFeature();
public:
void setName(const std::string &name) { _name = name; }
const std::string &name() const { return _name; }
const Category *category() const { return _category; }
void setRank(unsigned int rank);
unsigned int rank() const { return _rank; }
void setAttribute(const std::string &name, const std::string &value);
const Attributes &attributes() const { return _attributes; }
/** Adds a vertex to the GeoFeature and changes the BBox if
* applicable. If newSubFeature is set to true */
void addVertex(const GeoCoordinate &vertex, bool newSubFeature = false);
void addVertex(float lat, float lon, bool newSubFeature = false) {
addVertex(GeoCoordinate(lat, lon), newSubFeature);
}
bool closedPolygon() const { return _closedPolygon; }
void setClosedPolygon(bool closed) { _closedPolygon = closed; }
void updateBoundingBox();
// Inverts the point order from counter-clockwise to clockwise or
// vice versa.
void invertOrder();
/**
* @brief Sorts all subfeatures according to their area and containment
* from largest to smallest.
*/
void sort();
/**
* @brief Sets an arbitrary pointer for user data. It is not touched
* and/or utilized by the geo library.
*/
void setUserData(void*);
void *userData() const;
const std::vector<GeoCoordinate> &vertices() const { return _vertices; }
const GeoBoundingBox &bbox() const { return _bbox; }
const std::vector<size_t> &subFeatures() const { return _subFeatures; }
bool contains(const GeoCoordinate &v) const;
double area() const;
/**
* @deprecated This method is deprecated and will be removed in future
* releases. Use Seiscomp::Geo::area instead.
*/
static double area(const GeoCoordinate *polygon, size_t sides) __attribute__((deprecated));
private:
typedef std::vector<GeoCoordinate> GeoCoordinates;
std::string _name;
const Category *_category;
void *_userData;
unsigned int _rank;
GeoFeature::Attributes _attributes;
GeoCoordinates _vertices;
bool _closedPolygon;
GeoBoundingBox _bbox;
/** Index of verticies marking the start of a sub feature.
* E.g. if the GeoFeature defines a main area and a group of
* islands this vector would contain the indices of the start
* point of each island */
std::vector<size_t> _subFeatures;
};
inline void *GeoFeature::userData() const {
return _userData;
}
} // of ns Geo
} // of ns Seiscomp
#endif // SEISCOMP_GEO_GEOFEATURE_H__