/// Converts quadkey to bounding box static BoundingBox quadKeyToBoundingBox(const QuadKey &quadKey) { GeoCoordinate minPoint, maxPoint; int levelOfDetail = quadKey.levelOfDetail; minPoint.latitude = tileYToLat(quadKey.tileY + 1, levelOfDetail); maxPoint.latitude = tileYToLat(quadKey.tileY, levelOfDetail); minPoint.longitude = tileXToLon(quadKey.tileX, levelOfDetail); maxPoint.longitude = tileXToLon(quadKey.tileX + 1, levelOfDetail); return BoundingBox(minPoint, maxPoint); }
void OSMTileLayer::RefreshTiles() { if (tileServer && renderSurface && camera && fort14) { int newZoom = CalculateZoomLevel(surfaceDimension, 1.2); if (newZoom != zoom) { renderSurface->ClearTextures(); } zoom = newZoom; // Convert screen coordinates to normalized coordinates float normX, normY; camera->GetUnprojectedPoint(0, 0, &normX, &normY); // Convert normalized coordiantes to lat/long float geoX = fort14->GetUnprojectedX(normX); float geoY = fort14->GetUnprojectedY(normY); // Get the x, y tile coordinates int newX = lonToTileX(geoX, zoom); int newY = latToTileY(geoY, zoom); if (newX != x || newY != y) { // Convert tile coordinates to lat/long float geoXnew = tileXToLon(newX, zoom); float geoYnew = tileYToLat(newY, zoom); float geoXnewNext = tileXToLon(newX + 1, zoom); float geoYnewNext = tileYToLat(newY + 1, zoom); // Convert lat/long to normalized coordinates float normXnew = fort14->GetNormalizedX(geoXnew); float normYnew = fort14->GetNormalizedY(geoYnew); float normXnewNext = fort14->GetNormalizedX(geoXnewNext); float normYnewNext = fort14->GetNormalizedY(geoYnewNext); // Calculate the width and height float width = normXnewNext - normXnew; float height = normYnewNext - normYnew; renderSurface->UpdateSurfacePosition(normXnew, normYnew, width, height); // std::cout << "Old Coords: (" << x << ", " << y << ")\t" << // "New Coords: (" << newX << ", " << newY << ")" << std::endl; x = newX; y = newY; } if (currentType == SatelliteMap) tileServer->setBoundingBox(SatelliteTile, x, y, zoom); else if (currentType == StreetMap) tileServer->setBoundingBox(StreetTile, x, y, zoom); else if (currentType == TerrainMap) tileServer->setBoundingBox(TerrainTile, x, y, zoom); } }