正在显示
1 个修改的文件
包含
81 行增加
和
0 行删除
1 | +/************************************************************************** | ||
2 | +* file: dmpesribundlev1provider.cpp | ||
3 | + | ||
4 | +* Author: wanzhongping | ||
5 | +* Date: 2021-05-31 10:55:51 | ||
6 | +* Email: zhongpingw@chinadci.com | ||
7 | +* copyright: 广州城市信息研究所有限公司 | ||
8 | +***************************************************************************/ | ||
9 | +#include "dmpwmtsutils.h" | ||
10 | +#include "dmpesribundlev1provider.h" | ||
11 | +#include <iostream> | ||
12 | +namespace DmpWmts | ||
13 | +{ | ||
14 | + DmpEsriBundleV1Provider::DmpEsriBundleV1Provider() | ||
15 | + { | ||
16 | + _rootPath ="/mnt/d/Data/tile/GDMap/_alllayers"; | ||
17 | + } | ||
18 | + void DmpEsriBundleV1Provider::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 | + std::string bundlxFilePath = bundleBase + ".bundlx"; | ||
29 | + | ||
30 | + int index = packSize * (col - cGroup) + (row - rGroup); | ||
31 | + | ||
32 | + //读取bundlx文件存储该切片的位置,计算偏移量 | ||
33 | + std::ifstream freadx(bundlxFilePath, std::ifstream::binary); | ||
34 | + if(!freadx) | ||
35 | + { | ||
36 | + response.SendError(500, "找不到瓦片:("); | ||
37 | + return; | ||
38 | + } | ||
39 | + freadx.seekg(16+5*index, freadx.beg); | ||
40 | + char* buffer = new char[5]; | ||
41 | + freadx.read(buffer,5); | ||
42 | + freadx.close(); | ||
43 | + long offset = (long)(buffer[0]&0xff) | ||
44 | + + (long)(buffer[1]&0xff) * 256 | ||
45 | + + (long)(buffer[2]&0xff) * 65536 | ||
46 | + + (long)(buffer[3]&0xff) * 16777216 | ||
47 | + + (long)(buffer[4]&0xff) * 4294967296L; | ||
48 | + delete [] buffer; | ||
49 | + | ||
50 | + //读取bundle文件获取切片 | ||
51 | + std::ifstream fread(bundleFilePath, std::ifstream::binary); | ||
52 | + if(!fread) | ||
53 | + { | ||
54 | + response.SendError(500, "找不到瓦片:("); | ||
55 | + return; | ||
56 | + } | ||
57 | + fread.seekg(offset, fread.beg); | ||
58 | + char* buff = new char[4]; | ||
59 | + fread.read(buff, 4); | ||
60 | + long len = (long)(buff[0]&0xff) | ||
61 | + + (long)(buff[1]&0xff) * 256 | ||
62 | + + (long)(buff[2]&0xff) * 65536 | ||
63 | + + (long)(buff[3]&0xff) * 16777216; | ||
64 | + delete[] buff; | ||
65 | + char* imgBuffer = new char[len]; | ||
66 | + fread.read(imgBuffer, len); | ||
67 | + fread.close(); | ||
68 | + if(len > 0) | ||
69 | + { | ||
70 | + response.RemoveHeader("Content-Type"); | ||
71 | + std::string f = (format == "jpg") ? "image/jpg" : "image/png"; | ||
72 | + response.SetHeader("Content-Type", f); | ||
73 | + response.WriteContent(imgBuffer, len); | ||
74 | + } | ||
75 | + else | ||
76 | + { | ||
77 | + response.SendError(500, "找不到瓦片:("); | ||
78 | + } | ||
79 | + delete[] imgBuffer; | ||
80 | + } | ||
81 | +} |
请
注册
或
登录
后发表评论