sql >> Databáze >  >> RDS >> PostgreSQL

Postgis + boost::geometry + C++

Pochybuji, že pro tuto operaci potřebujete PostGIS.

Pochybuji také, že existuje způsob, jak to "uplatnit". Protože polygon má jasný průsečík:

Zde je návod, jak provést ověření a opravu v samotné geometrii Boost:

Žít na 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;
        }
    }
}

A poznamenejte si výstup:

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

Pokud váš zdroj skutečně obsahuje takové sebeprůniky, je těžké říct, co byste chtěli. Možná se chcete podívat na




  1. tabulky mysqldump bez vyprázdnění primárního klíče

  2. Při objednávání podle data desc, použití dočasného zpomaluje dotaz

  3. SQL Server:DELETE vs TRUNCATE

  4. Konfigurace skupin dostupnosti AlwaysOn – část 2