void GetIntersection(FeatureType & f, FeatureIntersector<DEPTH_LEVELS> & fIsect) { // We need to cover feature for the best geometry, because it's indexed once for the // first top level scale. Do reset current cached geometry first. f.ResetGeometry(); int const scale = FeatureType::BEST_GEOMETRY; f.ForEachPoint(fIsect, scale); f.ForEachTriangle(fIsect, scale); CHECK(!(fIsect.m_trg.empty() && fIsect.m_polyline.empty()) && f.GetLimitRect(scale).IsValid(), (f.DebugString(scale))); }
void StreetVicinityLoader::LoadStreet(uint32_t featureId, Street & street) { FeatureType feature; if (!m_context->GetFeature(featureId, feature)) return; if (feature.GetFeatureType() != feature::GEOM_LINE) return; vector<m2::PointD> points; feature.ForEachPoint(MakeBackInsertFunctor(points), FeatureType::BEST_GEOMETRY); ASSERT(!points.empty(), ()); for (auto const & point : points) street.m_rect.Add(MercatorBounds::RectByCenterXYAndSizeInMeters(point, m_offsetMeters)); covering::CoveringGetter coveringGetter(street.m_rect, covering::ViewportWithLowLevels); auto const & intervals = coveringGetter.Get(m_scale); m_context->ForEachIndex(intervals, m_scale, MakeBackInsertFunctor(street.m_features)); street.m_calculator = make_unique<ProjectionOnStreetCalculator>(points); }