PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgis + boost::geometry + C++

Wątpię, czy potrzebujesz PostGIS do tej operacji.

Wątpię też, czy istnieje sposób na „zapewnienie ważności”. Ponieważ wielokąt ma wyraźne samo przecięcie:

Oto jak przeprowadzasz walidację i korektę w samej geometrii Boost:

Na żywo w 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;
        }
    }
}

I zwróć uwagę na wynik:

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

Jeśli Twoje źródło faktycznie zawiera takie samoprzecięcia, trudno powiedzieć, co chcesz. Być może chcesz spojrzeć na




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem z wyrażeniem regularnym Postgres

  2. Jak wyodrębnić numer tygodnia z daty w PostgreSQL?

  3. Importowanie zrzutu postgresql do Heroku

  4. Jak zmapować nazwy stref czasowych Railsów na PostgreSQL?

  5. jak sprawdzić typ wartości w postgresie