1#include "RasterLevel.h"
5#include "RasterSource.h"
7Cogs::RasterLevel::RasterLevel(RasterSource * source,
13 int longitudePostsPerTile,
14 int latitudePostsPerTile,
15 double postDeltaLongitude,
16 double postDeltaLatitude) :
21 longitudePosts(longitudePosts),
22 latitudePosts(latitudePosts),
23 longitudePostsPerTile(longitudePostsPerTile),
24 latitudePostsPerTile(latitudePostsPerTile),
25 postDeltaLongitude(postDeltaLongitude),
26 postDeltaLatitude(postDeltaLatitude)
28 indexExtent = Extent{ 0, 0, longitudePosts - 1, latitudePosts - 1 };
31double Cogs::RasterLevel::longitudeToIndex(
double longitude)
const
33 return (longitude - extent.getWest()) / postDeltaLongitude;
36double Cogs::RasterLevel::latitudeToIndex(
double latitude)
const
38 return (latitude - extent.getSouth()) / postDeltaLatitude;
41double Cogs::RasterLevel::indexToLongitude(
int longitudeIndex)
const
43 return extent.getWest() + longitudeIndex * postDeltaLongitude;
46double Cogs::RasterLevel::indexToLatitude(
int latitudeIndex)
const
48 return extent.getSouth() + latitudeIndex * postDeltaLatitude;
51void Cogs::RasterLevel::getTilesInExtent(
const Extent & extent, std::vector<RasterTileRegion> & results)
const
53 static std::vector<Extent> extents;
54 static std::vector<RasterTileIdentifier> ids;
59 getTilesInExtent(extent, ids, extents);
61 ReadLock lock(*source);
63 for (
size_t i = 0; i < ids.size(); ++i) {
64 auto tile = source->getTile(ids[i]);
67 results.emplace_back(RasterTileRegion{ tile, extents[i] });
72void Cogs::RasterLevel::getTilesInExtent(
const Extent & extent, std::vector<RasterTileIdentifier> & ids, std::vector<Extent> & extents)
const
74 int tileXStart = extent.west / longitudePostsPerTile;
75 int tileXStop = extent.east / longitudePostsPerTile;
77 if (extent.west < 0) {
81 if (extent.east < 0) {
85 int tileYStart = extent.south / latitudePostsPerTile;
86 int tileYStop = extent.north / latitudePostsPerTile;
88 if (extent.south < 0) {
92 if (extent.north < 0) {
97 const int maxTileX = longitudePosts / longitudePostsPerTile + ((longitudePosts % longitudePostsPerTile) ? 1 : 0) - 1;
98 const int maxTileY = latitudePosts / latitudePostsPerTile + ((latitudePosts % latitudePostsPerTile) ? 1 : 0) - 1;
100 for (
int tileY = tileYStart; tileY <= tileYStop; ++tileY) {
101 const int tileYOrigin = tileY * latitudePostsPerTile;
103 const int currentTileSouth = std::max(extent.south - tileYOrigin, 0);
104 const int currentTileNorth = std::min(extent.north - tileYOrigin, latitudePostsPerTile - 1);
106 for (
int tileX = tileXStart; tileX <= tileXStop; ++tileX) {
107 const int tileXOrigin = tileX * longitudePostsPerTile;
109 const int currentTileWest = std::max(extent.west - tileXOrigin, 0);
110 const int currentTileEast = std::min(extent.east - tileXOrigin, longitudePostsPerTile - 1);
113 if (tileX >= 0 && tileX <= maxTileX && tileY >= 0 && tileY <= maxTileY) {
114 ids.emplace_back(RasterTileIdentifier { level, tileX, tileY });
116 extents.emplace_back(Extent{ currentTileWest, currentTileSouth, currentTileEast, currentTileNorth });