sql >> Database >  >> RDS >> PostgreSQL

Postgis + boost::geometrie + C++

Ik betwijfel of je PostGIS nodig hebt voor deze operatie.

Ik betwijfel ook of er een manier is om het "geldig te maken". Omdat de polygoon een duidelijke zelfdoorsnijding heeft:

Zo doet u de validatie en correctie in Boost Geometry zelf:

Live op 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;
        }
    }
}

En let op de output:

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

Als je bron daadwerkelijk zulke zelf-kruisingen bevat, is het moeilijk te zeggen wat je zou willen. Misschien wil je kijken naar




  1. pt-query-digest Alternatieven - MySQL Query Management &Monitoring met ClusterControl

  2. MySQL-opdracht in Objective-C

  3. LIMIET dan RAND in plaats van RAND dan LIMIT

  4. Hoe REST-service te lezen die JSON-object retourneert en hetzelfde op te slaan in PostgreSQL met behulp van Mule ESB, Mule Studio