Subject: Re: [geometry] Using Boost.Geometry with a legacy class hierarchy
From: Mats Taraldsvik (mats.taraldsvik_at_[hidden])
Date: 2012-02-17 06:10:29
With the help of boost::iterator_facade and stackoverflow.com , I've
almost managed to adapt the Ring concept to my legacy objects, but I got
a compile time error which I don't understand. As you can see from the
code, the iterator exposes QPoint* objects directly, so that should work
The cpp files and the errors from the build log is here .
On 02/12/2012 05:11 PM, Barend Gehrels wrote:
> Hi Mats,
>>>> I think I've managed to adapt QPoint and QLineString, because the
>>>> result of the program is a correct WKT. However, if there are
>>>> better ways of defining a boost range for this purpose, I would
>>>> love to hear about it. (None of my functions are named
>>>> "range_value", and since the documentation states "The type defined
>>>> by the metafunction |range_value<...>::type| must fulfill the Point
>>>> I guess there is a better way...?)
>>> OK I see. Notice also
>>> ...\libs\geometry\example\with_external_libs\x06_qt_world_mapper.cpp and
>>> x01_qt_example.cpp in the same folder, but maybe you did already.
>>> As far as I can see this is correct. I did not compile it but you
>>> have done.
>>> The range_value meta-function is (AFAIK) automatically provided, as
>>> long as you adapt it properly to the range concept, and so to see
>>> you did. Maybe we should include that in the docs.
>> I see. :) Perhaps provide a link in the Boost.Geometry docs to e.g.
>> the example I used in the Boost.Range docs as well?
> A link to the page in Boost.Range is added.
> Note that the range_value statement is correct in the docs. It states
> that the type defined by range_value should fulfill the point concept.
> It does not state that range_value has to be provided.
> I can add your sample but as it is it is already in an example, in
> another way. That might be confusing. So for the moment (deadline
> happens to be tomorrow) I'll wait with that. Thanks.
>>>> The next step is to adapt the QRing class. I need to create a
>>>> single iterator sequence that loops all of the linestrings
>>>> contained in the QRing::lines directly, but -- especially since I'm
>>>> not sure if the boost.range part of QLineString is done correctly
>>>> -- I don't know the right way to do it. Could you give me any pointers?
>>> So the linestring is done correctly, and the ring gets, in general,
>>> an equal implementation because they are similar w.r.t. ranges etc.
>>> What I don't understand is looping over linestrings contain in
>>> QRing::lines. But maybe I don't understand QRing::lines well.
>>> Basically Boost.Geometry's ring is a vector of points, which happen
>>> to form a closed polygon (without holes). So it is similar to a
>> You are correct -- my legacy class hierarchy is laid out to maintain
>> the topology/shared geometry, which does not fit seamlessly into the
>> Boost.Geometry model. (You might recall discussion on this list a
>> while back.) Therefore, I will need to create an iterator that loops
>> over every linestring (and the linestring's points) in QRing::lines,
>> that masks as a single collection of points. Do you know how (and if)
>> I could achieve that somehow?
> Ah, now I remember, sorry. Yest that must be possible, but I've never
> tried this. So I currently cannot give you links how to do this. The
> challenge is to make an iterator properly walking over the various
> Regards, Barend
> Geometry mailing list
Geometry list run by mateusz at loskot.net