C++ (Qt)while(!asleep()) sheep++;
void CThreadLoadMap::load(){ QImage tmpImage; QImage tmpIm; QString fullPathFile; double lat_rad = latitude * M_PI/180; double lon_rad = longitude * M_PI/180; double scrRes; // разрешение экрана double scaleK; // масштабный коэффициент int startX; int startY; int tileNewSize; int numTilesX; int numTilesY; int Z; int BM0; int Xp; int Yp; int numX; int numY; int dx; int dy; int R0; int WW; // длина окружности на данной широте double XYRes; int w = szWinDraw.width(), h = szWinDraw.height(); int sizeN = w*h*4; char *buf2N = new char[sizeN*8]; bool fileExist = false; int index = 0; //10-20=4;30-50=3;60-100=2;110-200=1;210-400=0 int curScale = currentScale; if(curScale > 200) index = 0;else if(curScale > 100) index = 1;else if(curScale > 50) index = 2;else if(curScale > 20) index = 3;else index = 4; Z = 8 + index; BM0 = pow(2,(Z-1+8))/2; // центр мира в пикселях для данного уровня R0 = 6378137 * // радиус большой полуоси эллипсоида cos(lat_rad); WW = 2*M_PI*R0; // длина окружности планеты на lat широте XYRes = WW/(pow(2,(Z-1))*256); scrRes = currentScale*1000.*2/(szWinDraw.height() - 2*PaddingWinDraw); scaleK = (XYRes / scrRes); // координаты на растровом массиве данного уровня в пикселах, от верхнего левого угла массива Xp = BM0*(1+lon_rad/M_PI); Yp = BM0*(1 - 0.5*log((1+sin(lat_rad))/(1-sin(lat_rad)))/M_PI); // номера блоков в тайловом массиве numX = (Xp/256); numY = (Yp/256); // смещение внутри тайла в пикселях dx = (Xp - numX*256); dy = (Yp - numY*256); tileNewSize = floor(256*scaleK); numTilesX = 2*round(0.5+0.5*w/tileNewSize); numTilesY = 2*round(0.5+0.5*h/tileNewSize); startX = numX - (numTilesX/2); startY = numY - (numTilesY/2); dx = dx*scaleK + abs(w - numTilesX*tileNewSize)/2; dy = dy*scaleK + abs(h - numTilesY*tileNewSize)/2; int* dest = (int*)buf2N; static int numb = 0; for(int x = startX; x < (startX+numTilesX+1); x++) { for(int y = startY; y < (startY+numTilesY+1); y++) { fullPathFile = ""; fullPathFile = patchToMap + QString("/z%1/%2/x%3/%4/y%5.jpg") .arg(Z ) .arg(x/1024) .arg(x) .arg(y/1024) .arg(y); fileExist = tmpImage.load(fullPathFile); if(!fileExist) { QString nameFileMap = QString("/z%1/%2/x%3/%4/y%5.png") .arg(Z) .arg(x/1024) .arg(x) .arg(y/1024) .arg(y); fullPathFile = patchToMap + nameFileMap; fileExist = tmpImage.load(fullPathFile); } int width = 2*w; if(fileExist) { tmpIm = tmpImage.scaled(tileNewSize,tileNewSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); numb++; for(int yy = 0; yy < tmpIm.height(); yy++) for(int xx = 0; xx < tmpIm.width(); xx++) { dest[ ((yy)*width+xx) +((x-startX)*tileNewSize+(y-startY)*tileNewSize*width) ] = (int)tmpIm.pixel(xx,yy); } } } // end for(;;) - y } // end for(;;) - x int* src = (int*)buf2N; for(int y = 0; y < h; y++) for(int x = 0; x < w; x++) if(layerMap->valid(x,y)) layerMap->setPixel(x,y,src[((x+dx) + (y+dy)*w*2)]); delete [] buf2N;}
C++ (Qt)QPointF tileForCoordinate(qreal lat, qreal lng, int zoom){ qreal zn = static_cast<qreal>(1 << zoom); qreal tx = (lng + 180.0) / 360.0; qreal ty = (1.0 - log(tan(lat * pi / 180.0) + 1.0 / cos(lat * pi / 180.0)) / pi) / 2.0; return QPointF(tx * zn, ty * zn);}
C++ (Qt)qreal longitudeFromTile(qreal tx, int zoom){ qreal zn = static_cast<qreal>(1 << zoom); qreal lat = tx / zn * 360.0 - 180.0; return lat;} qreal latitudeFromTile(qreal ty, int zoom){ qreal zn = static_cast<qreal>(1 << zoom); qreal n = pi - 2 * pi * ty / zn; qreal lng = 180.0 / pi * atan(0.5 * (exp(n) - exp(-n))); return lng;}
int sizeN = w*h*4;char *buf2N = new char[sizeN*8];
//10-20=4;30-50=3;60-100=2;110-200=1;210-400=0int curScale = currentScale;if(curScale > 200) index = 0;elseif(curScale > 100) index = 1;elseif(curScale > 50) index = 2;elseif(curScale > 20) index = 3;else index = 4;
Zoom = 8 + index; BM0 = pow(2,(Zoom-1+8))/2; // центр мира в пикселях для данного уровня R0 = 6378137 * cos(lat_rad); // радиус большой полуоси эллипсоида WW = 2*M_PI*R0; // длина окружности планеты на lat широте XYRes = WW/(pow(2,(Zoom-1))*256); scrRes = currentScale*1000.*2/(szWinDraw.height() - 2*PaddingWinDraw); scaleK = (XYRes / scrRes);
// координаты на растровом массиве данного уровня в пикселах, от верхнего левого угла массива Xp = BM0*(1+lon_rad/M_PI); Yp = BM0*(1 - 0.5*log((1+sin(lat_rad))/(1-sin(lat_rad)))/M_PI); // номера блоков в тайловом массиве numX = (Xp/256); numY = (Yp/256); // смещение внутри тайла в пикселях dx = (Xp - numX*256); dy = (Yp - numY*256); tileNewSize = floor(256*scaleK); numTilesX = 2*round(0.5+0.5*w/tileNewSize); numTilesY = 2*round(0.5+0.5*h/tileNewSize); startX = numX - (numTilesX/2); startY = numY - (numTilesY/2); dx = dx*scaleK + abs(w - numTilesX*tileNewSize)/2; dy = dy*scaleK + abs(h - numTilesY*tileNewSize)/2;
int* dest = (int*)buf2N; static int numb = 0; for(int x = startX; x < (startX+numTilesX+1); x++) { for(int y = startY; y < (startY+numTilesY+1); y++) { fullPathFile = ""; fullPathFile = patchToMap + QString("/z%1/%2/x%3/%4/y%5.jpg") .arg(Zoom ) .arg(x/1024) .arg(x) .arg(y/1024) .arg(y); fileExist = tmpImage.load(fullPathFile); if(!fileExist) { QString nameFileMap = QString("/z%1/%2/x%3/%4/y%5.png") .arg(Zoom) .arg(x/1024) .arg(x) .arg(y/1024) .arg(y); fullPathFile = patchToMap + nameFileMap; fileExist = tmpImage.load(fullPathFile); } int width = 2*w; if(fileExist) { tmpIm = tmpImage.scaled(tileNewSize,tileNewSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); numb++; for(int yy = 0; yy < tmpIm.height(); yy++) for(int xx = 0; xx < tmpIm.width(); xx++) { dest[ ((yy)*width+xx) +((x-startX)*tileNewSize+(y-startY)*tileNewSize*width) ] = (int)tmpIm.pixel(xx,yy); } } } // end for(;;) - y } // end for(;;) - x
for(int y = 0; y < h; y++) for(int x = 0; x < w; x++) if(layerMap->valid(x,y)) layerMap->setPixel(x,y,src[((x+dx) + (y+dy)*w*2)]);