/*! \file */ #ifndef _TILE_DATA_H #define _TILE_DATA_H #include #include #include #include #include "output_object.h" typedef std::vector::const_iterator OutputObjectsConstIt; typedef std::pair OutputObjectsConstItPair; typedef std::map, TileCoordinatesCompare> TileIndex; typedef std::set TileCoordinatesSet; class TileDataSource { protected: std::mutex mutex; TileIndex tileIndex; std::deque objects; // rtree index of large objects using oo_rtree_param_type = boost::geometry::index::quadratic<128>; boost::geometry::index::rtree< std::pair, oo_rtree_param_type> box_rtree; unsigned int baseZoom; public: TileDataSource(unsigned int baseZoom) : baseZoom(baseZoom) { } ///This must be thread safe! void MergeTileCoordsAtZoom(uint zoom, TileCoordinatesSet &dstCoords) { MergeTileCoordsAtZoom(zoom, baseZoom, tileIndex, dstCoords); } void MergeLargeCoordsAtZoom(uint zoom, TileCoordinatesSet &dstCoords); ///This must be thread safe! void MergeSingleTileDataAtZoom(TileCoordinates dstIndex, uint zoom, std::vector &dstTile) { MergeSingleTileDataAtZoom(dstIndex, zoom, baseZoom, tileIndex, dstTile); } OutputObjectRef CreateObject(OutputObject const &oo) { std::lock_guard lock(mutex); objects.push_back(oo); return &objects.back(); } void AddObject(TileCoordinates const &index, OutputObjectRef const &oo) { std::lock_guard lock(mutex); tileIndex[index].push_back(oo); } void AddObjectToLargeIndex(Box const &envelope, OutputObjectRef const &oo) { std::lock_guard lock(mutex); box_rtree.insert(std::make_pair(envelope, oo)); } void MergeLargeObjects(TileCoordinates dstIndex, uint zoom, std::vector &dstTile); private: static void MergeTileCoordsAtZoom(uint zoom, uint baseZoom, const TileIndex &srcTiles, TileCoordinatesSet &dstCoords); static void MergeSingleTileDataAtZoom(TileCoordinates dstIndex, uint zoom, uint baseZoom, const TileIndex &srcTiles, std::vector &dstTile); }; TileCoordinatesSet GetTileCoordinates(std::vector const &sources, unsigned int zoom); std::vector GetTileData(std::vector const &sources, std::vector const &sortOrders, TileCoordinates coordinates, unsigned int zoom); OutputObjectsConstItPair GetObjectsAtSubLayer(std::vector const &data, uint_least8_t layerNum); #endif //_TILE_DATA_H