4 gdal项目实战教程-求多边形的并集

多边形的并集使用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 );
    }

项目介绍 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值