|
|
@ -46,6 +46,12 @@ Imagery::Imagery() |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Imagery::ImageryType |
|
|
|
|
|
|
|
Imagery::getImageryType(void) const |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return currentImageryType; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
Imagery::setImageryType(ImageryType type) |
|
|
|
Imagery::setImageryType(ImageryType type) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -62,7 +68,6 @@ Imagery::setOffset(double xOffset, double yOffset) |
|
|
|
void |
|
|
|
void |
|
|
|
Imagery::prefetch2D(double windowWidth, double windowHeight, |
|
|
|
Imagery::prefetch2D(double windowWidth, double windowHeight, |
|
|
|
double zoom, double xOrigin, double yOrigin, |
|
|
|
double zoom, double xOrigin, double yOrigin, |
|
|
|
double viewXOffset, double viewYOffset, |
|
|
|
|
|
|
|
const QString& utmZone) |
|
|
|
const QString& utmZone) |
|
|
|
{ |
|
|
|
{ |
|
|
|
double tileResolution; |
|
|
|
double tileResolution; |
|
|
@ -88,10 +93,10 @@ Imagery::prefetch2D(double windowWidth, double windowHeight, |
|
|
|
int zoomLevel; |
|
|
|
int zoomLevel; |
|
|
|
|
|
|
|
|
|
|
|
tileBounds(tileResolution, |
|
|
|
tileBounds(tileResolution, |
|
|
|
xOrigin + viewXOffset - windowWidth / 2.0 / zoom, |
|
|
|
xOrigin - windowWidth / 2.0 / zoom * 1.5, |
|
|
|
yOrigin + viewYOffset - windowHeight / 2.0 / zoom, |
|
|
|
yOrigin - windowHeight / 2.0 / zoom * 1.5, |
|
|
|
xOrigin + viewXOffset + windowWidth / 2.0 / zoom, |
|
|
|
xOrigin + windowWidth / 2.0 / zoom * 1.5, |
|
|
|
yOrigin + viewYOffset + windowHeight / 2.0 / zoom, utmZone, |
|
|
|
yOrigin + windowHeight / 2.0 / zoom * 1.5, utmZone, |
|
|
|
minTileX, minTileY, maxTileX, maxTileY, zoomLevel); |
|
|
|
minTileX, minTileY, maxTileX, maxTileY, zoomLevel); |
|
|
|
|
|
|
|
|
|
|
|
for (int r = minTileY; r <= maxTileY; ++r) |
|
|
|
for (int r = minTileY; r <= maxTileY; ++r) |
|
|
@ -108,7 +113,6 @@ Imagery::prefetch2D(double windowWidth, double windowHeight, |
|
|
|
void |
|
|
|
void |
|
|
|
Imagery::draw2D(double windowWidth, double windowHeight, |
|
|
|
Imagery::draw2D(double windowWidth, double windowHeight, |
|
|
|
double zoom, double xOrigin, double yOrigin, |
|
|
|
double zoom, double xOrigin, double yOrigin, |
|
|
|
double viewXOffset, double viewYOffset, |
|
|
|
|
|
|
|
const QString& utmZone) |
|
|
|
const QString& utmZone) |
|
|
|
{ |
|
|
|
{ |
|
|
|
double tileResolution; |
|
|
|
double tileResolution; |
|
|
@ -134,12 +138,17 @@ Imagery::draw2D(double windowWidth, double windowHeight, |
|
|
|
int zoomLevel; |
|
|
|
int zoomLevel; |
|
|
|
|
|
|
|
|
|
|
|
tileBounds(tileResolution, |
|
|
|
tileBounds(tileResolution, |
|
|
|
xOrigin + viewXOffset - windowWidth / 2.0 / zoom * 1.5, |
|
|
|
xOrigin - windowWidth / 2.0 / zoom * 1.5, |
|
|
|
yOrigin + viewYOffset - windowHeight / 2.0 / zoom * 1.5, |
|
|
|
yOrigin - windowHeight / 2.0 / zoom * 1.5, |
|
|
|
xOrigin + viewXOffset + windowWidth / 2.0 / zoom * 1.5, |
|
|
|
xOrigin + windowWidth / 2.0 / zoom * 1.5, |
|
|
|
yOrigin + viewYOffset + windowHeight / 2.0 / zoom * 1.5, utmZone, |
|
|
|
yOrigin + windowHeight / 2.0 / zoom * 1.5, utmZone, |
|
|
|
minTileX, minTileY, maxTileX, maxTileY, zoomLevel); |
|
|
|
minTileX, minTileY, maxTileX, maxTileY, zoomLevel); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (getNumDrawables() > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
removeDrawables(0, getNumDrawables()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (int r = minTileY; r <= maxTileY; ++r) |
|
|
|
for (int r = minTileY; r <= maxTileY; ++r) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (int c = minTileX; c <= maxTileX; ++c) |
|
|
|
for (int c = minTileX; c <= maxTileX; ++c) |
|
|
@ -152,10 +161,11 @@ Imagery::draw2D(double windowWidth, double windowHeight, |
|
|
|
TexturePtr t = textureCache->get(tileURL); |
|
|
|
TexturePtr t = textureCache->get(tileURL); |
|
|
|
if (!t.isNull()) |
|
|
|
if (!t.isNull()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
t->draw(x1 - xOrigin, y1 - yOrigin, |
|
|
|
addDrawable(t->draw(y1 - yOrigin, x1 - xOrigin, |
|
|
|
x2 - xOrigin, y2 - yOrigin, |
|
|
|
y2 - yOrigin, x2 - xOrigin, |
|
|
|
x3 - xOrigin, y3 - yOrigin, |
|
|
|
y3 - yOrigin, x3 - xOrigin, |
|
|
|
x4 - xOrigin, y4 - yOrigin, true); |
|
|
|
y4 - yOrigin, x4 - xOrigin, |
|
|
|
|
|
|
|
true)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -164,17 +174,14 @@ Imagery::draw2D(double windowWidth, double windowHeight, |
|
|
|
void |
|
|
|
void |
|
|
|
Imagery::prefetch3D(double radius, double tileResolution, |
|
|
|
Imagery::prefetch3D(double radius, double tileResolution, |
|
|
|
double xOrigin, double yOrigin, |
|
|
|
double xOrigin, double yOrigin, |
|
|
|
double viewXOffset, double viewYOffset, |
|
|
|
const QString& utmZone) |
|
|
|
const QString& utmZone, bool useHeightModel) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
int minTileX, minTileY, maxTileX, maxTileY; |
|
|
|
int minTileX, minTileY, maxTileX, maxTileY; |
|
|
|
int zoomLevel; |
|
|
|
int zoomLevel; |
|
|
|
|
|
|
|
|
|
|
|
tileBounds(tileResolution, |
|
|
|
tileBounds(tileResolution, |
|
|
|
xOrigin + viewXOffset - radius, |
|
|
|
xOrigin - radius, yOrigin - radius, |
|
|
|
yOrigin + viewYOffset - radius, |
|
|
|
xOrigin + radius, yOrigin + radius, utmZone, |
|
|
|
xOrigin + viewXOffset + radius, |
|
|
|
|
|
|
|
yOrigin + viewYOffset + radius, utmZone, |
|
|
|
|
|
|
|
minTileX, minTileY, maxTileX, maxTileY, zoomLevel); |
|
|
|
minTileX, minTileY, maxTileX, maxTileY, zoomLevel); |
|
|
|
|
|
|
|
|
|
|
|
for (int r = minTileY; r <= maxTileY; ++r) |
|
|
|
for (int r = minTileY; r <= maxTileY; ++r) |
|
|
@ -183,7 +190,7 @@ Imagery::prefetch3D(double radius, double tileResolution, |
|
|
|
{ |
|
|
|
{ |
|
|
|
QString url = getTileLocation(c, r, zoomLevel, tileResolution); |
|
|
|
QString url = getTileLocation(c, r, zoomLevel, tileResolution); |
|
|
|
|
|
|
|
|
|
|
|
TexturePtr t = textureCache->get(url, useHeightModel); |
|
|
|
TexturePtr t = textureCache->get(url); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -191,19 +198,21 @@ Imagery::prefetch3D(double radius, double tileResolution, |
|
|
|
void |
|
|
|
void |
|
|
|
Imagery::draw3D(double radius, double tileResolution, |
|
|
|
Imagery::draw3D(double radius, double tileResolution, |
|
|
|
double xOrigin, double yOrigin, |
|
|
|
double xOrigin, double yOrigin, |
|
|
|
double viewXOffset, double viewYOffset, |
|
|
|
const QString& utmZone) |
|
|
|
const QString& utmZone, bool useHeightModel) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
int minTileX, minTileY, maxTileX, maxTileY; |
|
|
|
int minTileX, minTileY, maxTileX, maxTileY; |
|
|
|
int zoomLevel; |
|
|
|
int zoomLevel; |
|
|
|
|
|
|
|
|
|
|
|
tileBounds(tileResolution, |
|
|
|
tileBounds(tileResolution, |
|
|
|
xOrigin + viewXOffset - radius, |
|
|
|
xOrigin - radius, yOrigin - radius, |
|
|
|
yOrigin + viewYOffset - radius, |
|
|
|
xOrigin + radius, yOrigin + radius, utmZone, |
|
|
|
xOrigin + viewXOffset + radius, |
|
|
|
|
|
|
|
yOrigin + viewYOffset + radius, utmZone, |
|
|
|
|
|
|
|
minTileX, minTileY, maxTileX, maxTileY, zoomLevel); |
|
|
|
minTileX, minTileY, maxTileX, maxTileY, zoomLevel); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (getNumDrawables() > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
removeDrawables(0, getNumDrawables()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (int r = minTileY; r <= maxTileY; ++r) |
|
|
|
for (int r = minTileY; r <= maxTileY; ++r) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (int c = minTileX; c <= maxTileX; ++c) |
|
|
|
for (int c = minTileX; c <= maxTileX; ++c) |
|
|
@ -213,14 +222,15 @@ Imagery::draw3D(double radius, double tileResolution, |
|
|
|
double x1, y1, x2, y2, x3, y3, x4, y4; |
|
|
|
double x1, y1, x2, y2, x3, y3, x4, y4; |
|
|
|
imageBounds(c, r, tileResolution, x1, y1, x2, y2, x3, y3, x4, y4); |
|
|
|
imageBounds(c, r, tileResolution, x1, y1, x2, y2, x3, y3, x4, y4); |
|
|
|
|
|
|
|
|
|
|
|
TexturePtr t = textureCache->get(tileURL, useHeightModel); |
|
|
|
TexturePtr t = textureCache->get(tileURL); |
|
|
|
|
|
|
|
|
|
|
|
if (!t.isNull()) |
|
|
|
if (!t.isNull()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
t->draw(x1 - xOrigin, y1 - yOrigin, |
|
|
|
addDrawable(t->draw(y1 - yOrigin, x1 - xOrigin, |
|
|
|
x2 - xOrigin, y2 - yOrigin, |
|
|
|
y2 - yOrigin, x2 - xOrigin, |
|
|
|
x3 - xOrigin, y3 - yOrigin, |
|
|
|
y3 - yOrigin, x3 - xOrigin, |
|
|
|
x4 - xOrigin, y4 - yOrigin, true); |
|
|
|
y4 - yOrigin, x4 - xOrigin, |
|
|
|
|
|
|
|
true)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -257,8 +267,7 @@ Imagery::imageBounds(int tileX, int tileY, double tileResolution, |
|
|
|
LLtoUTM(lat2, lon2, x3, y3, utmZone); |
|
|
|
LLtoUTM(lat2, lon2, x3, y3, utmZone); |
|
|
|
LLtoUTM(lat2, lon1, x4, y4, utmZone); |
|
|
|
LLtoUTM(lat2, lon1, x4, y4, utmZone); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (currentImageryType == SWISSTOPO_SATELLITE || |
|
|
|
else if (currentImageryType == SWISSTOPO_SATELLITE) |
|
|
|
currentImageryType == SWISSTOPO_SATELLITE_3D) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
double utmMultiplier = tileResolution * 200.0; |
|
|
|
double utmMultiplier = tileResolution * 200.0; |
|
|
|
double minX = tileX * utmMultiplier; |
|
|
|
double minX = tileX * utmMultiplier; |
|
|
@ -295,8 +304,7 @@ Imagery::tileBounds(double tileResolution, |
|
|
|
UTMtoTile(maxUtmX, maxUtmY, utmZone, tileResolution, |
|
|
|
UTMtoTile(maxUtmX, maxUtmY, utmZone, tileResolution, |
|
|
|
maxTileX, minTileY, zoomLevel); |
|
|
|
maxTileX, minTileY, zoomLevel); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (currentImageryType == SWISSTOPO_SATELLITE || |
|
|
|
else if (currentImageryType == SWISSTOPO_SATELLITE) |
|
|
|
currentImageryType == SWISSTOPO_SATELLITE_3D) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
double utmMultiplier = tileResolution * 200; |
|
|
|
double utmMultiplier = tileResolution * 200; |
|
|
|
|
|
|
|
|
|
|
@ -555,7 +563,7 @@ Imagery::UTMtoLL(double utmNorthing, double utmEasting, const QString& utmZone, |
|
|
|
* D * D * D * D * D / 120.0) / cos(phi1Rad); |
|
|
|
* D * D * D * D * D / 120.0) / cos(phi1Rad); |
|
|
|
longitude = LongOrigin + longitude / M_PI * 180.0; |
|
|
|
longitude = LongOrigin + longitude / M_PI * 180.0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#include <QDebug> |
|
|
|
QString |
|
|
|
QString |
|
|
|
Imagery::getTileLocation(int tileX, int tileY, int zoomLevel, |
|
|
|
Imagery::getTileLocation(int tileX, int tileY, int zoomLevel, |
|
|
|
double tileResolution) const |
|
|
|
double tileResolution) const |
|
|
@ -572,7 +580,7 @@ Imagery::getTileLocation(int tileX, int tileY, int zoomLevel, |
|
|
|
oss << "http://khm.google.com/vt/lbw/lyrs=y&x=" << tileX |
|
|
|
oss << "http://khm.google.com/vt/lbw/lyrs=y&x=" << tileX |
|
|
|
<< "&y=" << tileY << "&z=" << zoomLevel; |
|
|
|
<< "&y=" << tileY << "&z=" << zoomLevel; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case SWISSTOPO_SATELLITE: case SWISSTOPO_SATELLITE_3D: |
|
|
|
case SWISSTOPO_SATELLITE: |
|
|
|
oss << "../map/eth_zurich_swissimage_025/200/color/" << tileY |
|
|
|
oss << "../map/eth_zurich_swissimage_025/200/color/" << tileY |
|
|
|
<< "/tile-"; |
|
|
|
<< "/tile-"; |
|
|
|
if (tileResolution < 1.0) |
|
|
|
if (tileResolution < 1.0) |
|
|
|