提交 1cb0d52214b4191c63a49ea670fa3b4fde40957f

作者 LJH 李佳桓
1 个父辈 0ef2c7e2

add

  1 +/**************************************************************************
  2 +* file: dmpesribundlev2provider.cpp
  3 +
  4 +* Author: wanzhongping
  5 +* Date: 2021-06-02 11:29:16
  6 +* Email: zhongpingw@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#include "dmpesribundlev2provider.h"
  10 +#include "dmpwmtsutils.h"
  11 +
  12 +namespace DmpWmts
  13 +{
  14 + DmpEsriBundleV2Provider::DmpEsriBundleV2Provider()
  15 + {
  16 + _rootPath ="/mnt/d/Data/SDZT_DIANZDT_2016_FS2K/Layers/_alllayers";
  17 + }
  18 + void DmpEsriBundleV2Provider::WriteTile(const int row, const int col, const int level, const std::string& format, DmpServerResponse& response)
  19 + {
  20 + int packSize = _packetSize;
  21 + int rGroup = (int)row/packSize;
  22 + rGroup = rGroup * packSize;
  23 + int cGroup = (int)col/packSize;
  24 + cGroup = cGroup*packSize;
  25 +
  26 + std::string bundleBase = GetBundlePath(level,rGroup,cGroup);
  27 + std::string bundleFilePath = bundleBase + ".bundle";
  28 +
  29 + int index = packSize * (row - rGroup) + (col - cGroup);
  30 +
  31 + //读取bundle文件,计算偏移量
  32 + std::ifstream fread(bundleFilePath, std::ifstream::binary);
  33 + if(!fread)
  34 + {
  35 + response.SendError(500, "找不到瓦片:(");
  36 + }
  37 + fread.seekg(64 + 8 * index, fread.beg);
  38 + char* buffer = new char[4];
  39 + fread.read(buffer,4);
  40 + long offset = (long)(buffer[0]&0xff)
  41 + + (long)(buffer[1]&0xff) * 256
  42 + + (long)(buffer[2]&0xff) * 65536
  43 + + (long)(buffer[3]&0xff) * 16777216
  44 + -4;
  45 + delete [] buffer;
  46 +
  47 + //读取bundle文件获取切片
  48 + fread.seekg(offset, fread.beg);
  49 + char* buff = new char[4];
  50 + fread.read(buff, 4);
  51 + long len = (long)(buff[0]&0xff)
  52 + + (long)(buff[1]&0xff) * 256
  53 + + (long)(buff[2]&0xff) * 65536
  54 + + (long)(buff[3]&0xff) * 16777216;
  55 + delete[] buff;
  56 + char* imgBuffer = new char[len];
  57 + fread.read(imgBuffer, len);
  58 + fread.close();
  59 + if(len > 0)
  60 + {
  61 + response.RemoveHeader("Content-Type");
  62 + std::string f = (format == "jpg") ? "image/jpg" : "image/png";
  63 + response.SetHeader("Content-Type", f);
  64 + response.WriteContent(imgBuffer, len);
  65 + }
  66 + else
  67 + {
  68 + response.SendError(500, "找不到瓦片:(");
  69 + }
  70 + delete[] imgBuffer;
  71 + }
  72 +}
注册登录 后发表评论