提交 5a6b15664a91661e827fe4ffc7d0f3d59d294f6f

作者 LJH 李佳桓
1 个父辈 ad11423e

--no commit message

@@ -37,8 +37,13 @@ SET (DMAP_SERVER_SRCS @@ -37,8 +37,13 @@ SET (DMAP_SERVER_SRCS
37 dmpserverregistry.cpp 37 dmpserverregistry.cpp
38 python/dmppythonutils.cpp 38 python/dmppythonutils.cpp
39 python/dmpserverwrapper.cpp 39 python/dmpserverwrapper.cpp
  40 +<<<<<<< Updated upstream
  41 +=======
  42 + #dmppgsqlutils.cpp
  43 +>>>>>>> Stashed changes
40 dmphttpbase.cpp 44 dmphttpbase.cpp
41 dmphttputils.cpp 45 dmphttputils.cpp
  46 + dmptilethumbnail.cpp
42 ) 47 )
43 48
44 SET (DMAP_SERVER_HDRS 49 SET (DMAP_SERVER_HDRS
@@ -70,6 +75,7 @@ SET (DMAP_SERVER_HDRS @@ -70,6 +75,7 @@ SET (DMAP_SERVER_HDRS
70 python/dmppythonutils.h 75 python/dmppythonutils.h
71 dmphttpbase.h 76 dmphttpbase.h
72 dmphttputils.h 77 dmphttputils.h
  78 + dmptilethumbnail.h
73 ) 79 )
74 80
75 ############################################################# 81 #############################################################
@@ -54,25 +54,25 @@ if (temp_data.find(http_) == 0) { @@ -54,25 +54,25 @@ if (temp_data.find(http_) == 0) {
54 int DmpHttp::DmpHttpBase::buildPostRequest(const std::string& server, const std::string& path, 54 int DmpHttp::DmpHttpBase::buildPostRequest(const std::string& server, const std::string& path,
55 std::ostream& out_request) { 55 std::ostream& out_request) {
56 // 分割path中的json数据 56 // 分割path中的json数据
57 - std::string temp_path(path), temp_json;  
58 - int json_pos_begin = temp_path.find(HTTP_JSON_BEGIN) + 1;  
59 - int json_pos_end = temp_path.find(HTTP_JSON_END);  
60 - if (json_pos_begin != std::string::npos) {  
61 - // 计算json的长度  
62 - int temp_json_lenth = std::string::npos;  
63 - if (json_pos_end != temp_json_lenth) {  
64 - temp_json_lenth = (json_pos_end - json_pos_begin);  
65 - }  
66 - temp_json = temp_path.substr(json_pos_begin, temp_json_lenth);  
67 - temp_path = temp_path.substr(0, (json_pos_begin - 1));  
68 - }  
69 - out_request << "POST " << temp_path.c_str() << " HTTP/1.0\r\n";  
70 - out_request << "Host: " << server.c_str() << "\r\n";  
71 - out_request << "Content-Length: " << temp_json.length() << "\r\n";  
72 - out_request << "Content-Type: application/x-www-form-urlencoded\r\n";  
73 - out_request << "Accept: */*\r\n";  
74 - out_request << "Connection: close\r\n\r\n";  
75 - out_request << temp_json.c_str(); 57 + // std::string temp_path(path), temp_json;
  58 + // int json_pos_begin = temp_path.find(HTTP_JSON_BEGIN) + 1;
  59 + // int json_pos_end = temp_path.find(HTTP_JSON_END);
  60 + // if (json_pos_begin != std::string::npos) {
  61 + // // 计算json的长度
  62 + // int temp_json_lenth = std::string::npos;
  63 + // if (json_pos_end != temp_json_lenth) {
  64 + // temp_json_lenth = (json_pos_end - json_pos_begin);
  65 + // }
  66 + // temp_json = temp_path.substr(json_pos_begin, temp_json_lenth);
  67 + // temp_path = temp_path.substr(0, (json_pos_begin - 1));
  68 + // }
  69 + // out_request << "POST " << temp_path.c_str() << " HTTP/1.0\r\n";
  70 + // out_request << "Host: " << server.c_str() << "\r\n";
  71 + // out_request << "Content-Length: " << temp_json.length() << "\r\n";
  72 + // out_request << "Content-Type: application/x-www-form-urlencoded\r\n";
  73 + // out_request << "Accept: */*\r\n";
  74 + // out_request << "Connection: close\r\n\r\n";
  75 + // out_request << temp_json.c_str();
76 return HTTP_SUCCESS; 76 return HTTP_SUCCESS;
77 } 77 }
78 78
@@ -15,15 +15,15 @@ DmpHttp::DmpHttpUtils::~DmpHttpUtils() {} @@ -15,15 +15,15 @@ DmpHttp::DmpHttpUtils::~DmpHttpUtils() {}
15 15
16 int DmpHttp::DmpHttpUtils::post(const std::string& url) 16 int DmpHttp::DmpHttpUtils::post(const std::string& url)
17 { 17 {
18 - handle_request_resolve(url, DmpHttpBase::buildPostRequest); 18 + handleRequestResolve(url, DmpHttpBase::buildPostRequest);
19 return HTTP_SUCCESS; 19 return HTTP_SUCCESS;
20 } 20 }
21 int DmpHttp::DmpHttpUtils::get(const std::string& url) 21 int DmpHttp::DmpHttpUtils::get(const std::string& url)
22 { 22 {
23 - handle_request_resolve(url, DmpHttpBase::buildGetRequest); 23 + handleRequestResolve(url, DmpHttpBase::buildGetRequest);
24 return HTTP_SUCCESS; 24 return HTTP_SUCCESS;
25 } 25 }
26 -void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuildRequest func) { 26 +void DmpHttp::DmpHttpUtils::handleRequestResolve(const std::string& url, pBuildRequest func) {
27 try { 27 try {
28 responseData_.clear(); 28 responseData_.clear();
29 // 解析URL 29 // 解析URL
@@ -37,7 +37,7 @@ void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuil @@ -37,7 +37,7 @@ void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuil
37 // 解析服务地址\端口 37 // 解析服务地址\端口
38 boost::asio::ip::tcp::resolver::query query(server, port); 38 boost::asio::ip::tcp::resolver::query query(server, port);
39 resolver_.async_resolve(query, 39 resolver_.async_resolve(query,
40 - boost::bind(&DmpHttpUtils::handle_resolve, this, 40 + boost::bind(&DmpHttpUtils::handleResolve, this,
41 boost::asio::placeholders::error, 41 boost::asio::placeholders::error,
42 boost::asio::placeholders::iterator)); 42 boost::asio::placeholders::iterator));
43 } 43 }
@@ -47,7 +47,7 @@ void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuil @@ -47,7 +47,7 @@ void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuil
47 } 47 }
48 return; 48 return;
49 } 49 }
50 -void DmpHttp::DmpHttpUtils::handle_resolve(const boost::system::error_code& err, 50 +void DmpHttp::DmpHttpUtils::handleResolve(const boost::system::error_code& err,
51 boost::asio::ip::tcp::resolver::iterator endpoint_iterator) { 51 boost::asio::ip::tcp::resolver::iterator endpoint_iterator) {
52 if (err) { 52 if (err) {
53 std::cout << "Error: " << err << "\n"; 53 std::cout << "Error: " << err << "\n";
@@ -55,30 +55,30 @@ void DmpHttp::DmpHttpUtils::handle_resolve(const boost::system::error_code& err, @@ -55,30 +55,30 @@ void DmpHttp::DmpHttpUtils::handle_resolve(const boost::system::error_code& err,
55 } 55 }
56 // 尝试连接 56 // 尝试连接
57 boost::asio::async_connect(socket_, endpoint_iterator, 57 boost::asio::async_connect(socket_, endpoint_iterator,
58 - boost::bind(&DmpHttpUtils::handle_connect, this, 58 + boost::bind(&DmpHttpUtils::handleConnect, this,
59 boost::asio::placeholders::error)); 59 boost::asio::placeholders::error));
60 } 60 }
61 -void DmpHttp::DmpHttpUtils::handle_connect(const boost::system::error_code& err) { 61 +void DmpHttp::DmpHttpUtils::handleConnect(const boost::system::error_code& err) {
62 if (err) { 62 if (err) {
63 std::cout << "Error: " << err << "\n"; 63 std::cout << "Error: " << err << "\n";
64 return; 64 return;
65 } 65 }
66 // 发送request请求 66 // 发送request请求
67 boost::asio::async_write(socket_, request_, 67 boost::asio::async_write(socket_, request_,
68 - boost::bind(&DmpHttpUtils::handle_write_request, this, 68 + boost::bind(&DmpHttpUtils::handleWriteRequest, this,
69 boost::asio::placeholders::error)); 69 boost::asio::placeholders::error));
70 } 70 }
71 -void DmpHttp::DmpHttpUtils::handle_write_request(const boost::system::error_code& err) { 71 +void DmpHttp::DmpHttpUtils::handleWriteRequest(const boost::system::error_code& err) {
72 if (err) { 72 if (err) {
73 std::cout << "Error: " << err << "\n"; 73 std::cout << "Error: " << err << "\n";
74 return; 74 return;
75 } 75 }
76 // 异步持续读数据到response_,直到接收协议符号 \r\n 为止 76 // 异步持续读数据到response_,直到接收协议符号 \r\n 为止
77 boost::asio::async_read_until(socket_, response_, "\r\n", 77 boost::asio::async_read_until(socket_, response_, "\r\n",
78 - boost::bind(&DmpHttpUtils::handle_read_status_line, this, 78 + boost::bind(&DmpHttpUtils::handleReadStatusLine, this,
79 boost::asio::placeholders::error)); 79 boost::asio::placeholders::error));
80 } 80 }
81 -void DmpHttp::DmpHttpUtils::handle_read_status_line(const boost::system::error_code& err) { 81 +void DmpHttp::DmpHttpUtils::handleReadStatusLine(const boost::system::error_code& err) {
82 if (err) { 82 if (err) {
83 std::cout << "Error: " << err << "\n"; 83 std::cout << "Error: " << err << "\n";
84 return; 84 return;
@@ -102,11 +102,11 @@ void DmpHttp::DmpHttpUtils::handle_read_status_line(const boost::system::error_c @@ -102,11 +102,11 @@ void DmpHttp::DmpHttpUtils::handle_read_status_line(const boost::system::error_c
102 } 102 }
103 // 读取响应头,直到接收协议符号 \r\n\r\n 为止 103 // 读取响应头,直到接收协议符号 \r\n\r\n 为止
104 boost::asio::async_read_until(socket_, response_, "\r\n\r\n", 104 boost::asio::async_read_until(socket_, response_, "\r\n\r\n",
105 - boost::bind(&DmpHttpUtils::handle_read_headers, this, 105 + boost::bind(&DmpHttpUtils::handleReadHeaders, this,
106 boost::asio::placeholders::error)); 106 boost::asio::placeholders::error));
107 } 107 }
108 108
109 -void DmpHttp::DmpHttpUtils::handle_read_headers(const boost::system::error_code& err) { 109 +void DmpHttp::DmpHttpUtils::handleReadHeaders(const boost::system::error_code& err) {
110 if (err) { 110 if (err) {
111 std::cout << "Error: " << err << "\n"; 111 std::cout << "Error: " << err << "\n";
112 return; 112 return;
@@ -135,10 +135,10 @@ void DmpHttp::DmpHttpUtils::handle_read_headers(const boost::system::error_code& @@ -135,10 +135,10 @@ void DmpHttp::DmpHttpUtils::handle_read_headers(const boost::system::error_code&
135 // 开始读取剩余所有内容 135 // 开始读取剩余所有内容
136 boost::asio::async_read(socket_, response_, 136 boost::asio::async_read(socket_, response_,
137 boost::asio::transfer_at_least(1), 137 boost::asio::transfer_at_least(1),
138 - boost::bind(&DmpHttpUtils::handle_read_content, this, 138 + boost::bind(&DmpHttpUtils::handleReadContent, this,
139 boost::asio::placeholders::error)); 139 boost::asio::placeholders::error));
140 } 140 }
141 -void DmpHttp::DmpHttpUtils::handle_read_content(const boost::system::error_code& err) { 141 +void DmpHttp::DmpHttpUtils::handleReadContent(const boost::system::error_code& err) {
142 if (!err) { 142 if (!err) {
143 143
144 // 输出读到的数据 144 // 输出读到的数据
@@ -152,7 +152,7 @@ void DmpHttp::DmpHttpUtils::handle_read_content(const boost::system::error_code& @@ -152,7 +152,7 @@ void DmpHttp::DmpHttpUtils::handle_read_content(const boost::system::error_code&
152 // 继续读取剩余内容,直到读到EOF 152 // 继续读取剩余内容,直到读到EOF
153 boost::asio::async_read(socket_, response_, 153 boost::asio::async_read(socket_, response_,
154 boost::asio::transfer_at_least(1), 154 boost::asio::transfer_at_least(1),
155 - boost::bind(&DmpHttpUtils::handle_read_content, this, 155 + boost::bind(&DmpHttpUtils::handleReadContent, this,
156 boost::asio::placeholders::error)); 156 boost::asio::placeholders::error));
157 157
158 } 158 }
@@ -25,20 +25,20 @@ namespace DmpHttp @@ -25,20 +25,20 @@ namespace DmpHttp
25 virtual std::string getResponse(void) {return responseData_;} 25 virtual std::string getResponse(void) {return responseData_;}
26 private: 26 private:
27 // 建立请求 27 // 建立请求
28 - void handle_request_resolve(const std::string& url, pBuildRequest func); 28 + void handleRequestResolve(const std::string& url, pBuildRequest func);
29 // 解析后 29 // 解析后
30 - void handle_resolve(const boost::system::error_code& err, 30 + void handleResolve(const boost::system::error_code& err,
31 boost::asio::ip::tcp::resolver::iterator endpoint_iterator); 31 boost::asio::ip::tcp::resolver::iterator endpoint_iterator);
32 // 连接后 32 // 连接后
33 - void handle_connect(const boost::system::error_code& err); 33 + void handleConnect(const boost::system::error_code& err);
34 // 发送请求后 34 // 发送请求后
35 - void handle_write_request(const boost::system::error_code& err); 35 + void handleWriteRequest(const boost::system::error_code& err);
36 // 读取响应后 36 // 读取响应后
37 - void handle_read_status_line(const boost::system::error_code& err); 37 + void handleReadStatusLine(const boost::system::error_code& err);
38 // 读取响应头后 38 // 读取响应头后
39 - void handle_read_headers(const boost::system::error_code& err); 39 + void handleReadHeaders(const boost::system::error_code& err);
40 // 读取正文数据后 40 // 读取正文数据后
41 - void handle_read_content(const boost::system::error_code& err); 41 + void handleReadContent(const boost::system::error_code& err);
42 private: 42 private:
43 // 解析器 43 // 解析器
44 boost::asio::ip::tcp::resolver resolver_; 44 boost::asio::ip::tcp::resolver resolver_;
@@ -16,9 +16,22 @@ @@ -16,9 +16,22 @@
16 #include <boost/property_tree/xml_parser.hpp> 16 #include <boost/property_tree/xml_parser.hpp>
17 #include <sstream> 17 #include <sstream>
18 #include <fstream> 18 #include <fstream>
  19 +#include <math.h>
  20 +#include "dmptilethumbnail.h"
  21 +#include "dmptilelayer.h"
  22 +
  23 +<<<<<<< Updated upstream
  24 +
19 #include <iostream> 25 #include <iostream>
20 #include "dmplogger.h" 26 #include "dmplogger.h"
21 27
  28 +#include <math.h>
  29 +#include "dmptilethumbnail.h"
  30 +#include "dmptilelayer.h"
  31 +=======
  32 +>>>>>>> Stashed changes
  33 +
  34 +
22 35
23 DmpServerManager::DmpServerManager() 36 DmpServerManager::DmpServerManager()
24 { 37 {
@@ -49,12 +62,13 @@ DmpServerManager::~DmpServerManager() @@ -49,12 +62,13 @@ DmpServerManager::~DmpServerManager()
49 void DmpServerManager::init(const boost::filesystem::path &modulePath) 62 void DmpServerManager::init(const boost::filesystem::path &modulePath)
50 { 63 {
51 serverRegistry_->init(modulePath); 64 serverRegistry_->init(modulePath);
52 -  
53 - if(!LoadServices()) 65 +<<<<<<< Updated upstream
  66 + if(!loadServices())
54 { 67 {
55 std::cout << "加载服务失败!" << std::endl; 68 std::cout << "加载服务失败!" << std::endl;
56 LOGGER_ERROR("加载服务失败!"); 69 LOGGER_ERROR("加载服务失败!");
57 } 70 }
  71 + //LoadDmpServices();
58 } 72 }
59 73
60 std::string DmpServerManager::getCapabilities() 74 std::string DmpServerManager::getCapabilities()
@@ -125,6 +139,13 @@ bool DmpServerManager::publish(const std::string& serverName, const std::string& @@ -125,6 +139,13 @@ bool DmpServerManager::publish(const std::string& serverName, const std::string&
125 return false; 139 return false;
126 } 140 }
127 projects_[serviceName] = project; 141 projects_[serviceName] = project;
  142 + //增加缩略图处理
  143 + if(serverName=="tileserver")
  144 + {
  145 + DmpTileLayer *tileLayer = static_cast<DmpTileLayer *>(project->getLayer());
  146 + DmpTileThumbnail::ctreatWmtsThumbnail(tileLayer);
  147 + }
  148 +
128 return true; 149 return true;
129 } 150 }
130 151
@@ -149,7 +170,7 @@ bool DmpServerManager::stopService(const std::string &serverName, const std::str @@ -149,7 +170,7 @@ bool DmpServerManager::stopService(const std::string &serverName, const std::str
149 { 170 {
150 return serverRegistry_->getServer(serverName)->stop(serviceName); 171 return serverRegistry_->getServer(serverName)->stop(serviceName);
151 } 172 }
152 -bool DmpServerManager::LoadServices() 173 +bool DmpServerManager::loadServices()
153 { 174 {
154 boost::property_tree::ptree pt,ptList; 175 boost::property_tree::ptree pt,ptList;
155 std::string conn = DmpServerConfig::Instance()->getMetaUrl(); 176 std::string conn = DmpServerConfig::Instance()->getMetaUrl();
@@ -159,15 +180,6 @@ bool DmpServerManager::LoadServices() @@ -159,15 +180,6 @@ bool DmpServerManager::LoadServices()
159 { 180 {
160 return false; 181 return false;
161 } 182 }
162 -  
163 - ////测试响应内容写入文本  
164 - // std::ofstream examplefile ("/mnt/d/example.txt");  
165 - // if (examplefile.is_open()) {  
166 - // examplefile << DmpHttp::get(url_);  
167 - // examplefile.close();  
168 - // }  
169 - //boost::property_tree::read_json("./example.txt", pt_);  
170 -  
171 std::stringstream ssData; 183 std::stringstream ssData;
172 ssData<<strContent.c_str(); 184 ssData<<strContent.c_str();
173 boost::property_tree::read_json(ssData, pt); 185 boost::property_tree::read_json(ssData, pt);
@@ -182,8 +194,31 @@ bool DmpServerManager::LoadServices() @@ -182,8 +194,31 @@ bool DmpServerManager::LoadServices()
182 std::string type = e.second.get<std::string>("type"); 194 std::string type = e.second.get<std::string>("type");
183 int capabilities =e.second.get<int>("capabilities"); 195 int capabilities =e.second.get<int>("capabilities");
184 std::string project = e.second.get<std::string>("project"); 196 std::string project = e.second.get<std::string>("project");
185 - this->publish(type,name,title,capabilities,project); 197 + this->initServices(type,name,title,capabilities,project);
186 } 198 }
187 } 199 }
188 return true; 200 return true;
  201 +}
  202 +bool DmpServerManager::initServices(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData)
  203 +{
  204 + //project
  205 + std::string projData;
  206 + if (!DmpServerUtils::Base64Decode(projectData, &projData))
  207 + {
  208 + return false;
  209 + }
  210 + DmpProject *project = new DmpProject();
  211 + if (!project->Read(projData))
  212 + {
  213 + delete project;
  214 + return false;
  215 + }
  216 +
  217 + if (!serverRegistry_->getServer(serverName)->publish(serviceName, title, capabilities, *project))
  218 + {
  219 + delete project;
  220 + return false;
  221 + }
  222 + projects_[serviceName] = project;
  223 + return true;
189 } 224 }
@@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
19 #include "dmpserverrequest.h" 19 #include "dmpserverrequest.h"
20 #include "dmpserverregistry.h" 20 #include "dmpserverregistry.h"
21 21
  22 +
22 #define URI_RELOAD ("/API/Service/TileService/Reload") //加载已注册服务接口 23 #define URI_RELOAD ("/API/Service/TileService/Reload") //加载已注册服务接口
23 class SERVER_EXPORT DmpServerManager 24 class SERVER_EXPORT DmpServerManager
24 { 25 {
@@ -37,7 +38,12 @@ public: @@ -37,7 +38,12 @@ public:
37 DmpProject* getProject(const std::string& serviceName); 38 DmpProject* getProject(const std::string& serviceName);
38 bool removeProject(const std::string& serviceName); 39 bool removeProject(const std::string& serviceName);
39 std::string getCapabilities(); 40 std::string getCapabilities();
40 - bool LoadServices(); 41 + bool loadServices();
  42 + //初始化加载服务
  43 + bool initServices(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData);
  44 + // bool ctreatTmsThumbnail() ;
  45 + // bool ctreatWmtsThumbnail() ;
  46 + // bool BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo,cairo_t *cr,int x,int y);
41 47
42 private: 48 private:
43 typedef std::map<std::string, DmpProject*, ci_less> ProjectMap; 49 typedef std::map<std::string, DmpProject*, ci_less> ProjectMap;
@@ -54,4 +60,5 @@ struct ServicesData @@ -54,4 +60,5 @@ struct ServicesData
54 std::string project; 60 std::string project;
55 }; 61 };
56 62
  63 +
57 #endif // __dmpservermanager_h__ 64 #endif // __dmpservermanager_h__
  1 +/**************************************************************************
  2 +* file: dmptilethumbnail.cpp
  3 +
  4 +* Author: lijiahuan
  5 +* Date: 2021-12-23 15:33:50
  6 +* Email: jiahuanl@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#include "dmptilethumbnail.h"
  10 +#include <iostream>
  11 +#include <string>
  12 +#include <map>
  13 +#include <memory>
  14 +#include <math.h>
  15 +
  16 +
  17 +bool DmpTileThumbnail::ctreatWmtsThumbnail(DmpTileLayer *tileLayer)
  18 +{
  19 +
  20 + std::string path = tileLayer->getDataSource();
  21 + path="/mnt/d/Code/tiles/qgis";
  22 + std::string vendor=tileLayer->getVendor();
  23 + std::string format=tileLayer->getFormat();
  24 +
  25 + DmpRectangle rectangle=tileLayer->extent();
  26 + std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
  27 + std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax());
  28 + Point minPoin{.x=107.78981494180618,.y=18.870480519260582};
  29 + Point maxPoin{.x=120.43553603935675,.y=25.999868757737033};
  30 +
  31 + int tileMatrix=6;
  32 + Point origin{.x=-400,.y=400};
  33 + double resolution=0.02197265625009295*256;
  34 + int minCol=floor(abs(origin.x-minPoin.x)/resolution);
  35 + int minRow=floor(abs(origin.y-minPoin.y)/resolution);
  36 + int maxCol=floor(abs(origin.x-maxPoin.x)/resolution);
  37 + int maxRow=floor(abs(origin.y-maxPoin.y)/resolution);
  38 + int width=maxCol-minCol;
  39 + int heigth=minRow-maxRow;
  40 + cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 256*(width+1), 256*(heigth+1));
  41 + cairo_t *cr =cairo_create (surface);
  42 +
  43 + for( int i = 0 ; i <= width ; i++ )
  44 + {
  45 + for(int j=0;j<=heigth;j++)
  46 + {
  47 + char* buff;
  48 + int length;
  49 + getTile(maxRow+j,minCol+i,tileMatrix,format,buff,length);
  50 + // std::string filepath=path+"/"+std::to_string(tileMatrix)+"/"+std::to_string(minCol+i)+"/"+std::to_string(maxRow+j)+".png";
  51 + // cairo_surface_t* image = cairo_image_surface_create_from_png( filepath.c_str());
  52 +
  53 + st_png_data* pPngData;
  54 + pPngData->pdata=(unsigned char*)buff;
  55 + pPngData->length=length;
  56 + cairo_surface_t* image1 = cairo_image_surface_create_from_png_stream(cairo_read_func_mine,&pPngData);
  57 +
  58 + BufferCopy(image1,surface,cr,0,0);
  59 + cairo_surface_write_to_png (surface, "./wmts1.png");
  60 + BufferCopy(image1,surface,cr,i*256,j*256);
  61 + }
  62 + }
  63 +
  64 + cairo_destroy (cr);
  65 + cairo_surface_write_to_png (surface, "./wmts.png");
  66 + cairo_surface_destroy (surface);
  67 + return true;
  68 +}
  69 +bool DmpTileThumbnail::ctreatTmsThumbnail()
  70 +{
  71 + std::string path="/mnt/d/Code/tiles/qgis";
  72 + std::string vendor="QGIS";
  73 + Point origin{.x=-400,.y=400};
  74 + Point minPoin{.x=107.78981494180618,.y=18.870480519260582};
  75 + Point maxPoin{.x=120.43553603935675,.y=25.999868757737033};
  76 + double resolution=0.02197265625009295*256;
  77 + // int minCol=floor(abs(origin.x-minPoin.x)/resolution);
  78 + // int minRow=floor(abs(origin.y-minPoin.y)/resolution);
  79 + // int maxCol=floor(abs(origin.x-maxPoin.x)/resolution);
  80 + // int maxRow=floor(abs(origin.y-maxPoin.y)/resolution);
  81 + int minCol=51;
  82 + int minRow=28;
  83 + int maxCol=53;
  84 + int maxRow=27;
  85 + int width=maxCol-minCol;
  86 + int heigth=minRow-maxRow;
  87 + cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 256*(width+1), 256*(heigth+1));
  88 + cairo_t *cr =cairo_create (surface);
  89 + for( int i = 0 ; i <= width ; i++ )
  90 + {
  91 + for(int j=0;j<=heigth;j++)
  92 + {
  93 + std::string filepath=path+"/6/"+std::to_string(minCol+i)+"/"+std::to_string(maxRow+j)+".png";
  94 + cairo_surface_t* image = cairo_image_surface_create_from_png( filepath.c_str());
  95 +
  96 + BufferCopy(image,surface,cr,i*256,j*256);
  97 + }
  98 + }
  99 + cairo_destroy (cr);
  100 + cairo_surface_write_to_png (surface, "./tms.png");
  101 + cairo_surface_destroy (surface);
  102 + return true;
  103 +}
  104 +bool DmpTileThumbnail::BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo, cairo_t *cr,int x,int y)
  105 +{
  106 + if (pClsCSFrom == NULL||pClsCSTo == NULL)
  107 + {
  108 + return false;
  109 + }
  110 + if(cr==NULL)
  111 + {
  112 + cr = cairo_create (pClsCSTo);
  113 + }
  114 + cairo_set_source_surface(cr, pClsCSFrom, x, y);
  115 + cairo_paint(cr);
  116 +
  117 + return true;
  118 +}
  119 +void DmpTileThumbnail::getTile(int row, int col, int level, std::string& format,char* refbuff,int length)
  120 +{
  121 + int packSize = 128;
  122 + int rGroup = (int)row/packSize;
  123 + rGroup = rGroup * packSize;
  124 + int cGroup = (int)col/packSize;
  125 + cGroup = cGroup*packSize;
  126 + std::string path="/mnt/d/Code/tiles/gdmap/_alllayers";
  127 + std::string bundleBase =GetBundlePath(level,rGroup,cGroup);
  128 + std::string bundleFilePath = path+bundleBase + ".bundle";
  129 + std::string bundlxFilePath = path+bundleBase + ".bundlx";
  130 +
  131 + int index = packSize * (col - cGroup) + (row - rGroup);
  132 +
  133 + //读取bundlx文件存储该切片的位置,计算偏移量
  134 + std::ifstream freadx(bundlxFilePath, std::ifstream::binary);
  135 + if(!freadx)
  136 + {
  137 +
  138 + return;
  139 + }
  140 + freadx.seekg(16+5*index, freadx.beg);
  141 + char* buffer = new char[5];
  142 + freadx.read(buffer,5);
  143 + freadx.close();
  144 +
  145 + long offset = (long)(buffer[0]&0xff)
  146 + + (long)(buffer[1]&0xff) * 256
  147 + + (long)(buffer[2]&0xff) * 65536
  148 + + (long)(buffer[3]&0xff) * 16777216
  149 + + (long)(buffer[4]&0xff) * 4294967296L;
  150 + delete [] buffer;
  151 + //读取bundle文件获取切片
  152 + std::ifstream fread(bundleFilePath, std::ifstream::binary);
  153 + if(!fread)
  154 + {
  155 +
  156 + return;
  157 + }
  158 + fread.seekg(offset, fread.beg);
  159 + char* buff = new char[4];
  160 + fread.read(buff, 4);
  161 + length = (long)(buff[0]&0xff)
  162 + + (long)(buff[1]&0xff) * 256
  163 + + (long)(buff[2]&0xff) * 65536
  164 + + (long)(buff[3]&0xff) * 16777216;
  165 + delete[] buff;
  166 + char* imgBuffer = new char[length];
  167 + fread.read(imgBuffer, length);
  168 + fread.close();
  169 + refbuff=imgBuffer;
  170 + delete[] imgBuffer;
  171 +}
  172 +std::string DmpTileThumbnail::GetBundlePath(int level, int rGroup, int cGroup)
  173 +{
  174 + std::string l = std::to_string(level);
  175 + int len = l.length();
  176 + if (len < 2)
  177 + {
  178 + for (int i = 0; i < 2 - len; i++)
  179 + {
  180 + l = "0" + l;
  181 + }
  182 + }
  183 + l = "L" + l;
  184 + std::string r =IntToHexStr(rGroup);
  185 +
  186 + int rLength = r.length();
  187 + if (rLength < 4)
  188 + {
  189 + for (int i = 0; i < 4 - rLength; i++)
  190 + {
  191 + r = "0" + r;
  192 + }
  193 + }
  194 + r = "R" + r;
  195 +
  196 + std::string c = IntToHexStr(cGroup);
  197 + int cLength = c.length();
  198 + if (cLength < 4)
  199 + {
  200 + for (int i = 0; i < 4 - cLength; i++)
  201 + {
  202 + c = "0" + c;
  203 + }
  204 + }
  205 + c = "C" + c;
  206 + std::string rootPath;
  207 + std::string bundlePath = rootPath + "/"+l+"/"+r+c;
  208 + return bundlePath;
  209 +}
  210 +std::string DmpTileThumbnail::IntToFormatStr(const int num)
  211 + {
  212 + std::string str = std::to_string(num);
  213 + if(num>=0 && num<10)
  214 + {
  215 + str = "0"+str;
  216 + }
  217 + return str;
  218 + }
  219 +
  220 +std::string DmpTileThumbnail::IntToHexStr(const int num)
  221 + {
  222 + char* buffer = new char[8];
  223 + sprintf(buffer,"%x",num);
  224 + std::string str = std::string(buffer);
  225 + delete[] buffer;
  226 + return str;
  227 + }
  228 +
  229 +
  230 +cairo_status_t DmpTileThumbnail::cairo_read_func_mine (void *closure, unsigned char *data, unsigned int length)
  231 +{
  232 + st_png_data* pPngData = (st_png_data*)closure;
  233 + memcpy(data, pPngData->pdata + pPngData->length, length);
  234 + pPngData->length += length;
  235 + return CAIRO_STATUS_SUCCESS;
  236 +}
  1 +/**************************************************************************
  2 +* file: dmptilethumbnail.h
  3 +
  4 +* Author: lijiahuan
  5 +* Date: 2021-12-23 15:34:29
  6 +* Email: jiahuanl@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +
  10 +#ifndef __dmptilethumbnail_h__
  11 +#define __dmptilethumbnail_h__
  12 +#include <cairo/cairo.h>
  13 +#include "dmptilelayer.h"
  14 +// namespace tileserver
  15 +// {
  16 + class DmpTileThumbnail
  17 + {
  18 + public:
  19 +
  20 + static bool ctreatTmsThumbnail() ;
  21 + static bool ctreatWmtsThumbnail(DmpTileLayer *tileLayer);
  22 + static bool BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo,cairo_t *cr,int x,int y);
  23 + static void getTile(int row, int col, int level, std::string& format,char* refbuff,int length);
  24 + static std::string GetBundlePath(int level, int rGroup, int cGroup);
  25 + static std::string IntToFormatStr(const int num);
  26 + static std::string IntToHexStr(const int num);
  27 + static cairo_status_t cairo_read_func_mine (void *closure, unsigned char *data, unsigned int length);
  28 + const int _packetSize = 128;
  29 +
  30 + };
  31 + struct Point
  32 + {
  33 + double x;
  34 + double y;
  35 + };
  36 +
  37 + struct st_png_data
  38 + {
  39 + unsigned char* pdata;
  40 + unsigned int length;
  41 + };
  42 +// }
  43 +
  44 +#endif // __dmptilethumbnail_h__
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 3
4 SET (TILESERVER_SRCS 4 SET (TILESERVER_SRCS
5 dmptileserver.cpp 5 dmptileserver.cpp
  6 + #dmptilethumbnail.cpp
6 wmts/dmpwmts.cpp 7 wmts/dmpwmts.cpp
7 wmts/dmpwmtsparameters.cpp 8 wmts/dmpwmtsparameters.cpp
8 wmts/dmptileproviderfactory.cpp 9 wmts/dmptileproviderfactory.cpp
@@ -19,6 +20,7 @@ SET (TILESERVER_SRCS @@ -19,6 +20,7 @@ SET (TILESERVER_SRCS
19 20
20 SET (TILESERVER_HDRS 21 SET (TILESERVER_HDRS
21 dmptileserver.h 22 dmptileserver.h
  23 + #dmptilethumbnail.h
22 wmts/dmpwmtsparameters.h 24 wmts/dmpwmtsparameters.h
23 wmts/dmptileprovider.h 25 wmts/dmptileprovider.h
24 wmts/dmptileproviderfactory.h 26 wmts/dmptileproviderfactory.h
@@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
12 #include "wmts/dmpwmts.h" 12 #include "wmts/dmpwmts.h"
13 #include "tms/dmptms.h" 13 #include "tms/dmptms.h"
14 #include "dmpserverresponse.h" 14 #include "dmpserverresponse.h"
  15 +#include "dmptilethumbnail.h"
15 16
16 namespace tileserver 17 namespace tileserver
17 { 18 {
@@ -23,6 +23,7 @@ @@ -23,6 +23,7 @@
23 #include "dmpservice.h" 23 #include "dmpservice.h"
24 #include "dmpserverutils.h" 24 #include "dmpserverutils.h"
25 #include "dmpserverproject.h" 25 #include "dmpserverproject.h"
  26 +#include<cairo/cairo.h>
26 27
27 namespace tileserver 28 namespace tileserver
28 { 29 {
@@ -52,15 +52,21 @@ namespace DmpWmts @@ -52,15 +52,21 @@ namespace DmpWmts
52 return; 52 return;
53 } 53 }
54 } 54 }
55 - void DmpCapabiliTilesOperation::WriteCapabilities(boost::property_tree::ptree& pt,const std::string& host,const std::string& servicename,DmpServerResponse& response) 55 + void DmpCapabiliTilesOperation::WriteCapabilities(boost::property_tree::ptree& pt,const std::string& host,const std::string& servicename,const std::string& title,DmpServerResponse& response)
56 { 56 {
57 //构建能力文档 57 //构建能力文档
58 boost::property_tree::ptree pt_root,pt_TileMatrix; 58 boost::property_tree::ptree pt_root,pt_TileMatrix;
59 - CreateGetCapabilitiesDocument(host,servicename,pt_root); 59 + //CreateGetCapabilitiesDocument(host,servicename,pt_root);
  60 + CreateGetCapabilitiesDocument(host,title,pt_root);
60 pt_root.add("Capabilities.Contents.Layer.ows:Title",pt.get<std::string>("Layer.ows:Title")); 61 pt_root.add("Capabilities.Contents.Layer.ows:Title",pt.get<std::string>("Layer.ows:Title"));
61 pt_root.add("Capabilities.Contents.Layer.ows:Abstract",pt.get<std::string>("Layer.ows:Abstract")); 62 pt_root.add("Capabilities.Contents.Layer.ows:Abstract",pt.get<std::string>("Layer.ows:Abstract"));
62 pt_root.add("Capabilities.Contents.Layer.ows:Identifier",pt.get<std::string>("Layer.ows:Identifier")); 63 pt_root.add("Capabilities.Contents.Layer.ows:Identifier",pt.get<std::string>("Layer.ows:Identifier"));
63 //pt_root_.add("Capabilities.Contents.Layer.Style.<xmlattr>.isDefault",pt_.get<std::string>("Layer.Style.<xmlattr>.isDefault")); 64 //pt_root_.add("Capabilities.Contents.Layer.Style.<xmlattr>.isDefault",pt_.get<std::string>("Layer.Style.<xmlattr>.isDefault"));
  65 +
  66 +
  67 + pt_root.add("Capabilities.Contents.Layer.ows:BoundingBox.ows:LowerCorner",pt.get<std::string>("Layer.ows:BoundingBox.ows:LowerCorner"));
  68 + pt_root.add("Capabilities.Contents.Layer.ows:BoundingBox.ows:UpperCorner",pt.get<std::string>("Layer.ows:BoundingBox.ows:UpperCorner"));
  69 +
64 pt_root.add("Capabilities.Contents.Layer.Style",pt.get<std::string>("Layer.Style")); 70 pt_root.add("Capabilities.Contents.Layer.Style",pt.get<std::string>("Layer.Style"));
65 pt_root.add("Capabilities.Contents.Layer.Format",pt.get<std::string>("Layer.Format")); 71 pt_root.add("Capabilities.Contents.Layer.Format",pt.get<std::string>("Layer.Format"));
66 pt_root.add("Capabilities.Contents.Layer.TileMatrixSetLink.TileMatrixSet",pt.get<std::string>("Layer.TileMatrixSetLink.TileMatrixSet")); 72 pt_root.add("Capabilities.Contents.Layer.TileMatrixSetLink.TileMatrixSet",pt.get<std::string>("Layer.TileMatrixSetLink.TileMatrixSet"));
@@ -35,7 +35,7 @@ namespace DmpWmts @@ -35,7 +35,7 @@ namespace DmpWmts
35 public: 35 public:
36 DmpCapabiliTilesOperation(); 36 DmpCapabiliTilesOperation();
37 void WriteCapabilities(DmpServerResponse& response); 37 void WriteCapabilities(DmpServerResponse& response);
38 - void WriteCapabilities(boost::property_tree::ptree& pt ,const std::string& host ,const std::string& servicename,DmpServerResponse& response); 38 + void WriteCapabilities(boost::property_tree::ptree& pt ,const std::string& host ,const std::string& servicename,const std::string& title,DmpServerResponse& response);
39 void GetCapabilitiesDocument(DmpServerResponse& response); 39 void GetCapabilitiesDocument(DmpServerResponse& response);
40 void CreateGetCapabilitiesDocument(const std::string& host,const std::string& servicename,boost::property_tree::ptree& pt); 40 void CreateGetCapabilitiesDocument(const std::string& host,const std::string& servicename,boost::property_tree::ptree& pt);
41 void GetServiceIdentificationElement(const std::string& servicename,boost::property_tree::ptree& pt); 41 void GetServiceIdentificationElement(const std::string& servicename,boost::property_tree::ptree& pt);
@@ -67,7 +67,7 @@ namespace DmpWmts @@ -67,7 +67,7 @@ namespace DmpWmts
67 const DmpServerProject *serverProject = context.serverProject(); 67 const DmpServerProject *serverProject = context.serverProject();
68 const DmpProject *project = serverProject->project(); 68 const DmpProject *project = serverProject->project();
69 DmpTileLayer *tileLayer = static_cast<DmpTileLayer *>(project->getLayer(layerName)); 69 DmpTileLayer *tileLayer = static_cast<DmpTileLayer *>(project->getLayer(layerName));
70 - 70 +
71 if (req.empty()) 71 if (req.empty())
72 { 72 {
73 context.response()->writeHtml("wmts,Operation is null"); 73 context.response()->writeHtml("wmts,Operation is null");
@@ -80,11 +80,11 @@ namespace DmpWmts @@ -80,11 +80,11 @@ namespace DmpWmts
80 } 80 }
81 else if(boost::iequals(req, "GetThumbnail")) 81 else if(boost::iequals(req, "GetThumbnail"))
82 { 82 {
83 -  
84 } 83 }
85 else if (boost::iequals(req, "GetCapabilities")) 84 else if (boost::iequals(req, "GetCapabilities"))
86 { 85 {
87 const std::string host=context.request()->domain()+":"+context.request()->port();; 86 const std::string host=context.request()->domain()+":"+context.request()->port();;
  87 + const std::string title=serverProject->title();
88 const std::string servicename=serverProject->name(); 88 const std::string servicename=serverProject->name();
89 89
90 boost::property_tree::ptree pt; 90 boost::property_tree::ptree pt;
@@ -93,6 +93,11 @@ namespace DmpWmts @@ -93,6 +93,11 @@ namespace DmpWmts
93 pt.add("Layer.ows:Identifier",""); 93 pt.add("Layer.ows:Identifier","");
94 pt.add("Layer.Style",tileLayer->getStyle()); 94 pt.add("Layer.Style",tileLayer->getStyle());
95 pt.add("Layer.Format",tileLayer->getFormat()); 95 pt.add("Layer.Format",tileLayer->getFormat());
  96 + DmpRectangle rectangle=tileLayer->extent();
  97 + std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
  98 + std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax());
  99 + pt.add("Layer.ows:BoundingBox.ows:LowerCorner",lowerPoint);
  100 + pt.add("Layer.ows:BoundingBox.ows:UpperCorner",upperPoint);
96 101
97 std::vector<DmpTileMatrixSet*> tileMatrixSets; 102 std::vector<DmpTileMatrixSet*> tileMatrixSets;
98 tileLayer->getTileMatrixSets(tileMatrixSets); 103 tileLayer->getTileMatrixSets(tileMatrixSets);
@@ -120,11 +125,12 @@ namespace DmpWmts @@ -120,11 +125,12 @@ namespace DmpWmts
120 pt.add("TileMatrixSet.TileHeight",(*iter)->tileRows()); 125 pt.add("TileMatrixSet.TileHeight",(*iter)->tileRows());
121 pt.add("TileMatrixSet.TopLeftCorner",std::to_string((*iter)->tileOrigin()->x())+","+std::to_string((*iter)->tileOrigin()->y())); 126 pt.add("TileMatrixSet.TopLeftCorner",std::to_string((*iter)->tileOrigin()->x())+","+std::to_string((*iter)->tileOrigin()->y()));
122 pt.add("TileMatrixSet.DPI",(*iter)->dpi()); 127 pt.add("TileMatrixSet.DPI",(*iter)->dpi());
  128 +
123 } 129 }
124 //boost::property_tree::write_json("/mnt/d/json.txt",pt); 130 //boost::property_tree::write_json("/mnt/d/json.txt",pt);
125 131
126 DmpCapabiliTilesOperation capOper; 132 DmpCapabiliTilesOperation capOper;
127 - capOper.WriteCapabilities(pt,host,servicename,*context.response()); 133 + capOper.WriteCapabilities(pt,host,servicename,title,*context.response());
128 134
129 } 135 }
130 } 136 }
注册登录 后发表评论