多边形的并集使用Union函数实现。
例如有如下的两个多边形:
如此求并:
void printRing( OGRLinearRing* r ) {
std::cout << "---------------------------" << std::endl;
for ( int i = 0; i < r->getNumPoints(); i++ ) {
OGRPoint point;
r->getPoint( i, &point );
std::cout << point.getX() << " " << point.getY() << std::endl;
}
std::cout << "**************************" << std::endl;
}
void test0() {
OGRLinearRing ring1;
ring1.addPoint( 0, 0 );
ring1.addPoint( 0, 10 );
ring1.addPoint( 10, 10 );
ring1.addPoint( 10, 0 );
ring1.closeRings();
OGRLinearRing ring2;
ring2.addPoint( 5, 5 );
ring2.addPoint( 15, 5 );
ring2.addPoint( 15, 15 );
ring2.addPoint( 5, 15 );
ring2.closeRings();
OGRPolygon* polygon1 = dynamic_cast< OGRPolygon* >( OGRGeometryFactory::createGeometry( wkbPolygon ) );
OGRPolygon* polygon2 = dynamic_cast< OGRPolygon* >( OGRGeometryFactory::createGeometry( wkbPolygon ) );
polygon1->addRing( &ring1 );
polygon2->addRing( &ring2 );
OGRGeometry* geometry = polygon1->Union( polygon2 );
OGRPolygon* unionPolygon = dynamic_cast< OGRPolygon* >( geometry );
auto r = unionPolygon->getExteriorRing();
printRing( r );
}
输出:
也就是这样的图形:
这是我们所期待的。
问题1:如果是下面这样的两个图形,合并后会是什么样子呢?
OGRLinearRing ring1;
ring1.addPoint( 0, 0 );
ring1.addPoint( 0, 10 );
ring1.addPoint( 10, 10 );
ring1.addPoint( 10, 0 );
ring1.closeRings();
OGRLinearRing ring2;
ring2.addPoint( 0, 2 );
ring2.addPoint( 14, 2 );
ring2.addPoint( 14, 4 );
ring2.addPoint( 0, 4 );
ring2.closeRings();
OGRPolygon* polygon1 = dynamic_cast< OGRPolygon* >( OGRGeometryFactory::createGeometry( wkbPolygon ) );
OGRPolygon* polygon2 = dynamic_cast< OGRPolygon* >( OGRGeometryFactory::createGeometry( wkbPolygon ) );
polygon1->addRing( &ring1 );
polygon2->addRing( &ring2 );
OGRGeometry* geometry = polygon1->Union( polygon2 );
OGRPolygon* unionPolygon = dynamic_cast< OGRPolygon* >( geometry );
auto r = unionPolygon->getExteriorRing();
printRing( r );
输出:
也就是这样的图形:
跟我们期待的一样,但是注意它的节点:
也就是他会有这种冗余的节点。要么对生成的几何,使用Simplify函数优化下。
问题2:如果两个多边形相离会怎样?
OGRLinearRing ring1;
ring1.addPoint( 0, 0 );
ring1.addPoint( 0, 10 );
ring1.addPoint( 10, 10 );
ring1.addPoint( 10, 0 );
ring1.closeRings();
OGRLinearRing ring2;
ring2.addPoint( 20, 0 );
ring2.addPoint( 30, 0 );
ring2.addPoint( 30, 10 );
ring2.addPoint( 20, 10 );
ring2.closeRings();
OGRPolygon* polygon1 = dynamic_cast< OGRPolygon* >( OGRGeometryFactory::createGeometry( wkbPolygon ) );
OGRPolygon* polygon2 = dynamic_cast< OGRPolygon* >( OGRGeometryFactory::createGeometry( wkbPolygon ) );
polygon1->addRing( &ring1 );
polygon2->addRing( &ring2 );
OGRGeometry* geometry = polygon1->Union( polygon2 );
这里union后的几何就不再是OGRPolygon了,而是OGRMultiPolygon。
OGRGeometry* geometry = polygon1->Union( polygon2 );
std::cout << OGRGeometryTypeToName( geometry->getGeometryType() ) << std::endl;
OGRMultiPolygon* mPolygon = dynamic_cast< OGRMultiPolygon* >( geometry );
for ( int i = 0; i < mPolygon->getNumGeometries();i++) {
OGRPolygon* polygon = dynamic_cast< OGRPolygon* >( mPolygon->getGeometryRef( i ) );
auto r = polygon->getExteriorRing();
printRing( r );
}