Exemplo n.º 1
0
TEST( KMLMultiGeometry , twoGeometries )
{
    MultiGeometry mg;
    mg.add( TestingPoint( 10.0 , 10.0 ) );
    mg.add( TestingPoint( 20.0 , 20.0 ) );

    string cmp = 
        "<MultiGeometry>\n"
        "  <Point>\n"
        "    <coordinates>\n"
        "      10,10,0 \n"
        "    </coordinates>\n"
        "  </Point>\n"
        "  <Point>\n"
        "    <coordinates>\n"
        "      20,20,0 \n"
        "    </coordinates>\n"
        "  </Point>\n"
        "</MultiGeometry>\n";

    ostringstream str;
    Geometry e( mg );
    e.write( str , 0 );
    EXPECT_EQ( cmp , str.str() );
}
Exemplo n.º 2
0
void
GeometryIterator::fetchNext()
{
    _next = 0L;
    if ( _stack.size() == 0 )
        return;

    Geometry* current = _stack.top();
    _stack.pop();

    if ( current->getType() == Geometry::TYPE_MULTI && _traverseMulti )
    {
        MultiGeometry* m = static_cast<MultiGeometry*>(current);
        for( GeometryCollection::const_iterator i = m->getComponents().begin(); i != m->getComponents().end(); ++i )
            _stack.push( i->get() );
        fetchNext();
    }
    else if ( current->getType() == Geometry::TYPE_POLYGON && _traversePolyHoles )
    {
        Polygon* p = static_cast<Polygon*>(current);
        for( RingCollection::const_iterator i = p->getHoles().begin(); i != p->getHoles().end(); ++i )
            _stack.push( i->get() );
        _next = current;
    }
    else
    {
        _next = current;
    }    
}
Exemplo n.º 3
0
    static inline void apply(std::string const& wkt, MultiGeometry& geometry)
    {
        geometry.clear();

        tokenizer tokens(wkt, boost::char_separator<char>(" ", ",()"));
        tokenizer::iterator it;
        if (initialize<MultiGeometry>(tokens, PrefixPolicy::apply(), wkt, it))
        {
            handle_open_parenthesis(it, tokens.end(), wkt);

            // Parse sub-geometries
            while(it != tokens.end() && *it != ")")
            {
                geometry.resize(geometry.size() + 1);
                Parser
                    <
                        typename boost::range_value<MultiGeometry>::type
                    >::apply(it, tokens.end(), wkt, geometry.back());
                if (it != tokens.end() && *it == ",")
                {
                    // Skip "," after multi-element is parsed
                    ++it;
                }
            }

            handle_close_parenthesis(it, tokens.end(), wkt);
        }
    }
Exemplo n.º 4
0
Geometry*
MultiGeometry::cloneAs( const Geometry::Type& newType ) const
{
    MultiGeometry* multi = new MultiGeometry();
    for( GeometryCollection::const_iterator i = _parts.begin(); i != _parts.end(); ++i )
    {
        Geometry* part = i->get()->cloneAs( i->get()->getType() );
        if ( part ) multi->getComponents().push_back( part );
    }
    return multi;
}
Exemplo n.º 5
0
Arquivo: read.hpp Projeto: PAV38/PDAL
    static inline void apply(std::string const& wkt, MultiGeometry& geometry)
    {
        traits::clear<MultiGeometry>::apply(geometry);

        tokenizer tokens(wkt, pdalboost::char_separator<char>(" ", ",()"));
        tokenizer::iterator it;

        if (initialize<MultiGeometry>(tokens, PrefixPolicy::apply(), wkt, it))
        {
            handle_open_parenthesis(it, tokens.end(), wkt);

            // If first point definition starts with "(" then parse points as (x y)
            // otherwise as "x y"
            bool using_brackets = (it != tokens.end() && *it == "(");
            
            while(it != tokens.end() && *it != ")")
            {
                traits::resize<MultiGeometry>::apply(geometry, pdalboost::size(geometry) + 1);
                
                if (using_brackets)
                {
                    point_parser
                        <
                            typename pdalboost::range_value<MultiGeometry>::type
                        >::apply(it, tokens.end(), wkt, geometry.back());
                }
                else
                {
                    noparenthesis_point_parser
                        <
                            typename pdalboost::range_value<MultiGeometry>::type
                        >::apply(it, tokens.end(), wkt, geometry.back());
                }
                    
                if (it != tokens.end() && *it == ",")
                {
                    // Skip "," after point is parsed
                    ++it;
                }
            }
            
            handle_close_parenthesis(it, tokens.end(), wkt);
        }
        
        check_end(it, tokens.end(), wkt);
    }
Exemplo n.º 6
0
TEST( KMLMultiGeometry , copyConstruction )
{
    MultiGeometry mg;
    mg.add( TestingPoint( 10.0 , 10.0 ) );

    MultiGeometry mg2( mg );
    Geometry e( mg2 );
	
    string cmp = 
        "<MultiGeometry>\n"
        "  <Point>\n"
        "    <coordinates>\n"
        "      10,10,0 \n"
        "    </coordinates>\n"
        "  </Point>\n"
        "</MultiGeometry>\n";

    ostringstream str;
    e.write( str , 0 );
    EXPECT_EQ( cmp , str.str() );
}
    static inline void apply(MultiGeometry const& multi_in, ring_identifier id,
                MultiGeometry& multi_out, MarkMap const& mark_map)
    {
        id.multi_index = 0;

        multi_out.resize(boost::size(multi_in));

        typename boost::range_iterator<MultiGeometry>::type out = boost::begin(multi_out);
        for (typename boost::range_iterator<MultiGeometry const>::type
                it = boost::begin(multi_in);
            it != boost::end(multi_in);
            ++it, ++out)
        {
            SinglePolicy::apply(*it, id, *out, mark_map);
            id.multi_index++;
        }
    }
Exemplo n.º 8
0
TEST( KMLMultiGeometry , add )
{
    MultiGeometry mg;
    mg.add( TestingPoint( 1.0 , 1.0 ) );
}