sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgis + boost::geometry + C++

Jag tvivlar på att du behöver PostGIS för denna operation.

Jag tvivlar också på att det finns ett sätt att "göra det giltigt". Eftersom polygonen har en tydlig självskärning:

Så här gör du valideringen och korrigeringen i själva 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;
        }
    }
}

Och notera resultatet:

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

Om din källa faktiskt innehåller sådana självkorsningar är det svårt att säga vad du vill. Du kanske vill titta på




  1. Jag förstår inte Collation? (Mysql, RDBMS, teckenuppsättningar)

  2. Postgres pl/pgsql FEL:kolumn kolumnnamn finns inte

  3. Behöver hjälp med att konvertera date i formatet 20120130 till Date data type oracle sql

  4. MySQL-betyg med vikt