मुझे संदेह है कि इस ऑपरेशन के लिए आपको PostGIS की आवश्यकता है।
मुझे यह भी संदेह है कि "इसे वैध बनाने" का एक तरीका है। क्योंकि बहुभुज में एक स्पष्ट आत्म प्रतिच्छेदन होता है:
यहां बताया गया है कि आप बूस्ट ज्योमेट्री में ही सत्यापन और सुधार कैसे करते हैं:
#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;
}
}
}
और आउटपुट नोट करें:
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
यदि आपके स्रोत में वास्तव में इस तरह के आत्म-चौराहे हैं, तो यह बताना कठिन है कि आप क्या चाहते हैं। शायद आप देखना चाहते हैं
- सेल्फ इंटरसेक्टिंग पॉलीगॉन को नॉन सेल्फ इंटरसेक्टिंग पॉलीगॉन में विभाजित करें
- सेल्फ इंटरसेक्टिंग पॉलीगॉन का क्षेत्रफलए>