sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgis + boost::geometry + C++

Jeg tvivler på, at du har brug for PostGIS til denne operation.

Jeg tvivler også på, at der er en måde at "gøre det gyldigt". Fordi polygonen har en klar selvskæring:

Sådan laver du valideringen og korrektionen i selve Boost Geometry:

Live On Coliru

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/io/io.hpp>
#include <boost/geometry/algorithms/equals.hpp>
#include <iostream>

namespace bg = boost::geometry;
namespace bgm = boost::geometry::model;

template<typename G>
bool check(G const& g) {
    std::string reason;
    bool valid = bg::is_valid(g, reason);

    if (valid) std::cout << "Valid (dsv): " << bg::dsv(g) << "\n";
    else       std::cout << "Invalid: " << reason << "\n";

    return valid;
}

int main() {
    using pt = bgm::d2::point_xy<double>;
    using poly = bgm::polygon<pt>;

    poly p;
    bg::read_wkt("POLYGON((0 0, 10 0, 10 11, 11 10, 0 10))", p);

    while (!check(p)) {
        auto same = p;
        bg::correct(p);

        if (bg::equals(p, same)) {
            std::cout << "Out of ideas\n";
            break;
        }
    }
}

Og bemærk outputtet:

Invalid: Geometry is defined as closed but is open
Invalid: Geometry has invalid self-intersections. A self-intersection point was found at (10, 10); method: i; operations: u/i; segment IDs {source, multi, ring, segment}: {0, -1, -1, 1}/{0, -1, -1, 3}
Out of ideas

Hvis din kilde faktisk indeholder sådanne selvkryds, er det svært at sige, hvad du gerne vil have. Måske vil du se på




  1. Indsæt forespørgsel for at indsætte rækker i MySQL

  2. Hvad er forskellene mellem et klynget og et ikke-klynget indeks?

  3. hvad er den egentlige årsag til mysql fejl 1442?

  4. SqlFunction kan ikke åbne kontekstforbindelse på trods af DataAccessKind.Read tilstede