20 #include <tbb/atomic.h>
22 namespace MAKVRinTerra
24 template <
typename FS,
typename S =
typename FS::Sink>
27 ,
public boost::enable_shared_from_this<DtIndexingFeatureSet<FS,S> >
30 typedef boost::shared_ptr<DtIndexingFeatureSet>
Ptr;
31 typedef boost::shared_ptr<const DtIndexingFeatureSet>
CPtr;
32 typedef boost::weak_ptr<DtIndexingFeatureSet>
WPtr;
46 typedef boost::shared_ptr<Config>
Ptr;
83 return Make(boost::shared_ptr<Config>(cfg), bounds);
101 return FS::Wrap(this->shared_from_this());
106 return myConfig->inputSink->label() +
" index level "
107 + boost::lexical_cast<std::string>(
myLevel);
137 const boost::optional<DtFeatureGeometry>& geometry,
142 return myFeatures->filter(query, boost::none_t(), load);
146 return myFeatures->filter(query, geometry, load);
148 bool covers[4] = {
false,
false,
false,
false };
149 bool intersections[4] = {
false,
false,
false,
false };
150 size_t lastIntersection = 0;
151 unsigned numIntersects = 0;
155 switch (geometry->type())
158 for (
unsigned i=0; i != 4; ++i)
160 if (!geometry->intersects(this->getSubtile(i).geometry()))
163 intersections[i] =
true;
165 lastIntersection = i;
172 for (
unsigned i=0; i != 4; ++i)
174 if (!geometry->intersects(this->getSubtile(i).geometry()))
177 intersections[i] =
true;
179 lastIntersection = i;
185 for (
unsigned i=0; i != 4; ++i)
187 std::auto_ptr<DtFeatureGeometry::RelationshipMatrix> matrix
188 = geometry->relate(this->
getSubtile(i).geometry());
190 if (!matrix->intersects())
194 if (matrix->touches())
197 intersections[i] =
true;
199 lastIntersection = i;
202 if (matrix->covers())
206 if (matrix->coveredBy())
213 switch (numIntersects)
218 !covers[lastIntersection] ? geometry : boost::none_t(),
224 for (
size_t i=0; i != 4; ++i)
226 if (!intersections[i])
231 !covers[i] ? geometry : boost::none_t(),
235 return list.release();
268 const boost::shared_ptr<Config>& cfg,
294 DtTHROW_NEW(
DtException,
"Tile index out of bounds");
300 Ptr This(this->shared_from_this());
318 Ptr This(this->shared_from_this());
332 DtWarn <<
"Error activating subtile" << std::endl;
370 :
myBounds(pbounds.makeSubBounds(i,2,2))
378 Caller caller(parent, *
this);
379 mySink->addLoadedCallback(caller);
407 size_t c =
mySink->numberOfFeatures();
412 if (pc <= parent.myConfig->minFeaturesToIndexTile)
417 if (pc/(
double)c >= parent.
myConfig->featuresIndexRatio)
432 :
set(
set), subtile(subtile)