mirror of https://github.com/CGAL/cgal
101 lines
2.1 KiB
C++
101 lines
2.1 KiB
C++
|
|
#ifndef KML_READER_H
|
|
#define KML_READER_H
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <qvector3d.h>
|
|
|
|
|
|
class Kml
|
|
{
|
|
public:
|
|
// double precision 3D-point (QVector3D has float coordinates)
|
|
struct Vec3d
|
|
{
|
|
double x, y, z;
|
|
|
|
friend std::ostream& operator << (std::ostream& os, const Vec3d& v)
|
|
{
|
|
os << v.x << ", " << v.y << ", " << v.z;
|
|
return os;
|
|
}
|
|
};
|
|
|
|
struct Node
|
|
{
|
|
double lon, lat;
|
|
|
|
Node() : lon(-1111), lat(-1111) {};
|
|
Node(double longitude, double latitude) : lon(longitude), lat(latitude) {};
|
|
|
|
double distance_to(const Node& r) const;
|
|
|
|
bool operator == (const Node& r) const;
|
|
Vec3d get_coords_3d(const double r = 1.0) const;
|
|
QVector3D get_coords_3f(const double r=1.0) const;
|
|
friend std::ostream& operator << (std::ostream& os, const Node& n);
|
|
};
|
|
using Nodes = std::vector<Node>;
|
|
|
|
struct Arc
|
|
{
|
|
Node from, to;
|
|
};
|
|
using Arcs = std::vector<Arc>;
|
|
|
|
struct LinearRing
|
|
{
|
|
std::vector<Node> nodes;
|
|
std::vector<int> ids;
|
|
|
|
Arcs get_arcs() const;
|
|
void get_arcs(Arcs& arcs) const;
|
|
};
|
|
using LinearRings = std::vector<LinearRing>;
|
|
|
|
|
|
struct Polygon
|
|
{
|
|
LinearRing outer_boundary;
|
|
LinearRings inner_boundaries;
|
|
|
|
// when collecting nodes start from the outer boundary and then get nodes
|
|
// from individual inner boundaries in the order
|
|
Nodes get_all_nodes() const;
|
|
|
|
std::vector<LinearRing*> get_all_boundaries();
|
|
};
|
|
|
|
|
|
struct Placemark
|
|
{
|
|
std::vector<Polygon> polygons;
|
|
std::string name;
|
|
|
|
// collects all nodes from all polygons
|
|
Nodes get_all_nodes() const;
|
|
|
|
Arcs get_all_arcs() const;
|
|
};
|
|
using Placemarks = std::vector<Placemark>;
|
|
|
|
|
|
static Placemarks read(const std::string& file_name);
|
|
|
|
static Nodes get_duplicates(const Placemarks& placemarks);
|
|
|
|
|
|
// Outputs all used nodes without duplications!
|
|
// NOTE: this function modifies Placemarks data-structure!
|
|
static Nodes generate_ids(Placemarks& placemarks);
|
|
|
|
// same as above but by collapsing close-by nodes based on distance bound
|
|
static Nodes generate_ids_approx(Placemarks& placemarks, const double eps);
|
|
};
|
|
|
|
|
|
#endif
|