提交 5e556b6613c7140ae85c39b92a017b618c6777c7

作者 qingxiongf
2 个父辈 b1db07ea 90ed5e67
1 -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -o -lfcgi++ -lfcgi")  
2 -  
3 -INCLUDE_DIRECTORIES(  
4 - ${CMAKE_SOURCE_DIR}/src/server/spserver  
5 -)  
6 -  
7 -  
8 -ADD_SUBDIRECTORY(spserver)  
9 -ADD_SUBDIRECTORY(services)  
10 -  
11 -  
12 -  
13 -########################################################  
14 -# Files  
15 -SET (DMAP_SERVER_SRCS  
16 - dmpfilterresponsedecorator.cpp  
17 - dmpmainserver.cpp  
18 - dmprequesthandler.cpp  
19 - dmpserver.cpp  
20 - dmpserverapi.cpp  
21 - dmpserverconfig.cpp  
22 - dmpservercontext.cpp  
23 - dmpserverapicontext.cpp  
24 - dmpserverapihandler.cpp  
25 - dmpserverfilter.cpp  
26 - dmpserverinterface.cpp  
27 - dmpserverinterfaceimpl.cpp  
28 - dmpservermanager.cpp  
29 - dmpservermanagerapi.cpp  
30 - dmpserverresponse.cpp  
31 - dmpserverrequest.cpp  
32 - dmpserverparameters.cpp  
33 - dmpserverplugins.cpp  
34 - dmpserverutils.cpp  
35 - dmpserverloader.cpp  
36 - dmpserverproject.cpp  
37 - dmpserverregistry.cpp  
38 - python/dmppythonutils.cpp  
39 - python/dmpserverwrapper.cpp  
40 - dmphttpbase.cpp  
41 - dmphttputils.cpp  
42 -)  
43 -  
44 -SET (DMAP_SERVER_HDRS  
45 - dmpfilterresponsedecorator.h  
46 - dmpmainserver.h  
47 - dmprequesthandler.h  
48 - dmpserver.h  
49 - dmpserverapi.h  
50 - dmpserverapihandler.h  
51 - dmpserverapicontext.h  
52 - dmpservercontext.h  
53 - dmpserverconfig.h  
54 - dmpserverentity.h  
55 - dmpserverfilter.h  
56 - dmpserverinterface.h  
57 - dmpserverinterfaceimpl.h  
58 - dmpservermanager.h  
59 - dmpservermanagerapi.h  
60 - dmpserverrequest.h  
61 - dmpserverresponse.h  
62 - dmpserverparameters.h  
63 - dmpserverplugins.h  
64 - dmpserverutils.h  
65 - dmpservice.h  
66 - dmpservermodule.h  
67 - dmpserverloader.h  
68 - dmpserverproject.h  
69 - dmpserverregistry.h  
70 - python/dmppythonutils.h  
71 - dmphttpbase.h  
72 - dmphttputils.h  
73 -)  
74 -  
75 -#############################################################  
76 -# dmap_server library  
77 -  
78 -  
79 -  
80 -INCLUDE_DIRECTORIES(  
81 - ${CMAKE_SOURCE_DIR}/src/core  
82 - ${CMAKE_SOURCE_DIR}/src/core/geometry  
83 - ${CMAKE_SOURCE_DIR}/src/core/symbology  
84 -)  
85 -  
86 -INCLUDE_DIRECTORIES(SYSTEM  
87 - ${PYTHON_INCLUDE_PATH}  
88 -)  
89 -ADD_LIBRARY(dmap_server SHARED ${DMAP_SERVER_SRCS} ${DMAP_SERVER_HDRS})  
90 -  
91 -target_link_libraries(dmap_server  
92 - dmap_core  
93 - ${Boost_LIBRARIES}  
94 - Boost::regex  
95 - ${PYTHON_LIBRARIES}  
96 - dl)  
97 -  
98 -IF (WITH_BINDINGS)  
99 - TARGET_LINK_LIBRARIES(dmap_server  
100 - Boost::${DMAP_BOOST_PYTHON_FOUND}  
101 - )  
102 -ENDIF(WITH_BINDINGS)  
103 -  
104 -set_target_properties(dmap_server  
105 - PROPERTIES  
106 - POSITION_INDEPENDENT_CODE 1  
107 - CXX_VISIBILITY_PRESET hidden  
108 - VISIBILITY_INLINES_HIDDEN 1  
109 - #VERSION ${COMPLETE_VERSION}  
110 - #SOVERSION ${COMPLETE_VERSION}  
111 - )  
112 -  
113 -generate_export_header(  
114 - dmap_server  
115 - BASE_NAME SERVER  
116 - EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}/dmap_server.h"  
117 -)  
118 -  
119 -  
120 -target_include_directories(dmap_server  
121 - PUBLIC  
122 - ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}  
123 - )  
124 - MESSAGE(STATUS "dmap_server path: ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}")  
125 -  
126 -  
127 -add_executable(dmap_spserv  
128 - dmap_spserv.cpp  
129 - dmpspserverrequest.h  
130 - dmpspserverresponse.h  
131 - dmpspserverrequest.cpp  
132 - dmpspserverresponse.cpp  
133 -)  
134 -  
135 -add_executable(dmap_serv  
136 - dmap_serv.cpp  
137 - dmpapacheserverrequest.h  
138 - dmpapacheserverresponse.h  
139 - dmpapacheserverrequest.cpp  
140 - dmpapacheserverresponse.cpp  
141 -)  
142 -  
143 -target_link_libraries(dmap_spserv  
144 - spserver  
145 - dmap_server  
146 - )  
147 -  
148 -target_link_libraries(dmap_serv  
149 - dmap_server  
150 -)  
151 -  
152 -INCLUDE_DIRECTORIES(  
153 - ${CMAKE_SOURCE_DIR}/pgsql/include  
154 -)  
155 -LINK_DIRECTORIES(dmap_server ${CMAKE_SOURCE_DIR}/pgsql/lib)  
156 -TARGET_LINK_LIBRARIES(dmap_server ${CMAKE_SOURCE_DIR}/pgsql/lib/libpq.so)  
157 -  
158 -find_package(Fcgi REQUIRED)  
159 -if (NOT FCGI_FOUND)  
160 - message (SEND_ERROR "Fast CGI dependency was not found!")  
161 -endif()  
162 -  
163 -target_include_directories(dmap_serv SYSTEM PRIVATE  
164 - ${FCGI_INCLUDE_DIR}  
165 -)  
166 -target_link_libraries(dmap_serv  
167 - ${FCGI_LIBRARY}  
168 -)  
169 -########################################################  
170 -# Install  
171 -INSTALL(FILES  
172 - dmpserver.ini  
173 - DESTINATION ${DMAP_LIBEXEC_SUBDIR}  
174 -)  
175 -  
176 -INSTALL(TARGETS dmap_server  
177 - RUNTIME DESTINATION ${DMAP_BIN_DIR}  
178 - LIBRARY DESTINATION ${DMAP_LIB_DIR}  
179 - ARCHIVE DESTINATION ${DMAP_LIB_DIR}  
180 - PUBLIC_HEADER DESTINATION ${DMAP_INCLUDE_DIR}  
181 -)  
182 -  
183 -INSTALL(TARGETS dmap_serv  
184 - DESTINATION ${DMAP_BIN_DIR}  
185 -)  
186 -  
187 -INSTALL(TARGETS dmap_spserv  
188 - DESTINATION ${DMAP_BIN_DIR} 1 +
  2 +INCLUDE_DIRECTORIES(
  3 + ${CMAKE_SOURCE_DIR}/src/server/spserver
  4 +)
  5 +
  6 +ADD_SUBDIRECTORY(spserver)
  7 +ADD_SUBDIRECTORY(services)
  8 +
  9 +########################################################
  10 +# Files
  11 +SET (DMAP_SERVER_SRCS
  12 + dmpfilterresponsedecorator.cpp
  13 + dmpmainserver.cpp
  14 + dmprequesthandler.cpp
  15 + dmpserver.cpp
  16 + dmpservice.cpp
  17 + dmpservercontext.cpp
  18 + dmpserverapihandler.cpp
  19 + dmpserverfilter.cpp
  20 + dmpserverinterface.cpp
  21 + dmpserverinterfaceimpl.cpp
  22 + dmpservermanager.cpp
  23 + dmpservermanagerapi.cpp
  24 + dmpserverresponse.cpp
  25 + dmpserverrequest.cpp
  26 + dmpserverparameters.cpp
  27 + dmpserverplugins.cpp
  28 + dmpserverutils.cpp
  29 + dmpservernativeloader.cpp
  30 + python/dmppythonutils.cpp
  31 + python/dmpserverwrapper.cpp
  32 +)
  33 +
  34 +SET (DMAP_SERVER_HDRS
  35 + dmpfilterresponsedecorator.h
  36 + dmpmainserver.h
  37 + dmprequesthandler.h
  38 + dmpserver.h
  39 + dmpserverapihandler.h
  40 + dmpservercontext.h
  41 + dmpserverfilter.h
  42 + dmpserverinterface.h
  43 + dmpserverinterfaceimpl.h
  44 + dmpservermanager.h
  45 + dmpservermanagerapi.h
  46 + dmpserverrequest.h
  47 + dmpserverresponse.h
  48 + dmpserverparameters.h
  49 + dmpserverplugins.h
  50 + dmpserverutils.h
  51 + dmpservice.h
  52 + dmpservermodule.h
  53 + dmpservernativeloader.h
  54 + python/dmppythonutils.h
  55 +)
  56 +
  57 +#############################################################
  58 +# dmap_server library
  59 +
  60 +INCLUDE_DIRECTORIES(
  61 + ${CMAKE_SOURCE_DIR}/src/core
  62 +)
  63 +
  64 +INCLUDE_DIRECTORIES(SYSTEM
  65 + ${PYTHON_INCLUDE_PATH}
  66 +)
  67 +ADD_LIBRARY(dmap_server SHARED ${DMAP_SERVER_SRCS} ${DMAP_SERVER_HDRS})
  68 +
  69 +target_link_libraries(dmap_server
  70 + dmap_core
  71 + ${Boost_LIBRARIES}
  72 + Boost::regex
  73 + ${PYTHON_LIBRARIES}
  74 + dl)
  75 +
  76 +IF (WITH_BINDINGS)
  77 + TARGET_LINK_LIBRARIES(dmap_server
  78 + Boost::${DMAP_BOOST_PYTHON_FOUND}
  79 + )
  80 +ENDIF(WITH_BINDINGS)
  81 +
  82 +set_target_properties(dmap_server
  83 + PROPERTIES
  84 + POSITION_INDEPENDENT_CODE 1
  85 + CXX_VISIBILITY_PRESET hidden
  86 + VISIBILITY_INLINES_HIDDEN 1
  87 + #VERSION ${COMPLETE_VERSION}
  88 + #SOVERSION ${COMPLETE_VERSION}
  89 + )
  90 +
  91 +generate_export_header(
  92 + dmap_server
  93 + BASE_NAME SERVER
  94 + EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}/dmap_server.h"
  95 +)
  96 +
  97 +
  98 +target_include_directories(dmap_server
  99 + PUBLIC
  100 + ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}
  101 + )
  102 + MESSAGE(STATUS "dmap_server path: ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}")
  103 +
  104 +add_executable(dmap_spserv
  105 + dmap_spserv.cpp
  106 + dmpspserverrequest.h
  107 + dmpspserverresponse.h
  108 + dmpspserverrequest.cpp
  109 + dmpspserverresponse.cpp
  110 +)
  111 +
  112 +target_link_libraries(dmap_spserv
  113 + spserver
  114 + dmap_server
  115 + )
  116 +
  117 +########################################################
  118 +# Install
  119 +
  120 +INSTALL(TARGETS dmap_server
  121 + RUNTIME DESTINATION ${DMAP_BIN_DIR}
  122 + LIBRARY DESTINATION ${DMAP_LIB_DIR}
  123 + ARCHIVE DESTINATION ${DMAP_LIB_DIR}
  124 + PUBLIC_HEADER DESTINATION ${DMAP_INCLUDE_DIR}
  125 +)
  126 +
  127 +INSTALL(TARGETS dmap_spserv
  128 + DESTINATION ${DMAP_BIN_DIR}
189 ) 129 )
@@ -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_;
1 -/**************************************************************************  
2 -* file: dmpservermanager.cpp  
3 -  
4 -* Author: wanzhongping  
5 -* Date: 2021-07-27 21:59:46  
6 -* Email: zhongpingw@chinadci.com  
7 -* copyright: 广州城市信息研究所有限公司  
8 -***************************************************************************/  
9 -#include "dmpservermanager.h"  
10 -#include "dmpserver.h"  
11 -#include "dmphttputils.h"  
12 -#include "dmpserverConfig.h"  
13 -#include <memory>  
14 -#include <boost/property_tree/ptree.hpp>  
15 -#include <boost/property_tree/json_parser.hpp>  
16 -#include <boost/property_tree/xml_parser.hpp>  
17 -#include <sstream>  
18 -#include <fstream>  
19 -#include <iostream>  
20 -#include "dmplogger.h"  
21 -  
22 -  
23 -DmpServerManager::DmpServerManager()  
24 -{  
25 - serverRegistry_ = new DmpServerRegistry();  
26 -}  
27 -  
28 -DmpServerManager::~DmpServerManager()  
29 -{  
30 - if (serverRegistry_)  
31 - {  
32 - delete serverRegistry_;  
33 - serverRegistry_ = NULL;  
34 - }  
35 -  
36 - ProjectMap::iterator iter = projects_.begin();  
37 - for (; iter != projects_.end(); ++iter)  
38 - {  
39 - DmpProject *mapProject = iter->second;  
40 - if (mapProject)  
41 - {  
42 - delete mapProject;  
43 - mapProject = nullptr;  
44 - }  
45 - }  
46 - projects_.clear();  
47 -}  
48 -  
49 -void DmpServerManager::init(const boost::filesystem::path &modulePath)  
50 -{  
51 - serverRegistry_->init(modulePath);  
52 -  
53 - if(!LoadServices())  
54 - {  
55 - std::cout << "加载服务失败!" << std::endl;  
56 - LOGGER_ERROR("加载服务失败!");  
57 - }  
58 -}  
59 -  
60 -std::string DmpServerManager::getCapabilities()  
61 -{  
62 - return serverRegistry_->getCapabilities();  
63 -}  
64 -  
65 -std::shared_ptr<DmpServer> DmpServerManager::serverForRequest(const DmpServerRequest &request)  
66 -{  
67 - return serverRegistry_->getServerForRequest(request);  
68 -}  
69 -  
70 -std::shared_ptr<DmpServerApi> DmpServerManager::apiForRequest(const DmpServerRequest &request)  
71 -{  
72 - return serverRegistry_->getApiForRequest(request);  
73 -}  
74 -  
75 -DmpProject *DmpServerManager::getProject(const std::string &serviceName)  
76 -{  
77 - std::map<std::string, DmpProject *>::iterator iter = projects_.find(serviceName);  
78 - if (iter != projects_.end())  
79 - {  
80 - return iter->second;  
81 - }  
82 - else  
83 - {  
84 - return nullptr;  
85 - }  
86 -}  
87 -  
88 -bool DmpServerManager::removeProject(const std::string &serviceName)  
89 -{  
90 - try  
91 - {  
92 - std::map<std::string, DmpProject *>::iterator iter = projects_.find(serviceName);  
93 - if (iter != projects_.end())  
94 - {  
95 - delete iter->second;  
96 - projects_.erase(iter);  
97 - }  
98 - }  
99 - catch (const std::exception &e)  
100 - {  
101 - std::cerr << e.what() << '\n';  
102 - return false;  
103 - }  
104 - return true;  
105 -}  
106 -  
107 -bool DmpServerManager::publish(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData)  
108 -{  
109 - //project  
110 - std::string projData;  
111 - if (!DmpServerUtils::Base64Decode(projectData, &projData))  
112 - {  
113 - return false;  
114 - }  
115 - DmpProject *project = new DmpProject();  
116 - if (!project->Read(projData))  
117 - {  
118 - delete project;  
119 - return false;  
120 - }  
121 -  
122 - if (!serverRegistry_->getServer(serverName)->publish(serviceName, title, capabilities, *project))  
123 - {  
124 - delete project;  
125 - return false;  
126 - }  
127 - projects_[serviceName] = project;  
128 - return true;  
129 -}  
130 -  
131 -bool DmpServerManager::deleteService(const std::string &serverName, const std::string &serviceName)  
132 -{  
133 - if (serverRegistry_->getServer(serverName)->remove(serviceName) && removeProject(serviceName))  
134 - {  
135 - return true;  
136 - }  
137 - else  
138 - {  
139 - return false;  
140 - }  
141 -}  
142 -  
143 -bool DmpServerManager::startService(const std::string &serverName, const std::string &serviceName)  
144 -{  
145 - return serverRegistry_->getServer(serverName)->start(serviceName);  
146 -}  
147 -  
148 -bool DmpServerManager::stopService(const std::string &serverName, const std::string &serviceName)  
149 -{  
150 - return serverRegistry_->getServer(serverName)->stop(serviceName);  
151 -}  
152 -bool DmpServerManager::LoadServices()  
153 -{  
154 - boost::property_tree::ptree pt,ptList;  
155 - std::string conn = DmpServerConfig::Instance()->getMetaUrl();  
156 - const std::string url= conn + URI_RELOAD;  
157 - std::string strContent=DmpHttp::get(url);  
158 - if(strContent.length()==0)  
159 - {  
160 - return false;  
161 - }  
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;  
172 - ssData<<strContent.c_str();  
173 - boost::property_tree::read_json(ssData, pt);  
174 - int iCount = std::atoi(pt.get<std::string>("data.count").c_str());  
175 - if(iCount>0)  
176 - {  
177 - ptList=pt.get_child("data.list");  
178 - for (auto& e : ptList)  
179 - {  
180 - std::string name = e.second.get<std::string>("name");  
181 - std::string title = e.second.get<std::string>("title");  
182 - std::string type = e.second.get<std::string>("type");  
183 - int capabilities =e.second.get<int>("capabilities");  
184 - std::string project = e.second.get<std::string>("project");  
185 - this->publish(type,name,title,capabilities,project);  
186 - }  
187 - }  
188 - return true; 1 +/**************************************************************************
  2 +* file: dmpservermanager.cpp
  3 +
  4 +* Author: wanzhongping
  5 +* Date: 2021-07-27 21:59:46
  6 +* Email: zhongpingw@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#include "dmpservermanager.h"
  10 +#include "dmpserver.h"
  11 +#include "dmphttputils.h"
  12 +#include "dmpserverConfig.h"
  13 +#include <memory>
  14 +#include <boost/property_tree/ptree.hpp>
  15 +#include <boost/property_tree/json_parser.hpp>
  16 +#include <boost/property_tree/xml_parser.hpp>
  17 +#include <sstream>
  18 +#include <fstream>
  19 +#include <math.h>
  20 +#include "dmptilelayer.h"
  21 +#include <iostream>
  22 +#include "dmplogger.h"
  23 +#include "dmptilelayer.h"
  24 +
  25 +DmpServerManager::DmpServerManager()
  26 +{
  27 + serverRegistry_ = new DmpServerRegistry();
  28 +}
  29 +
  30 +DmpServerManager::~DmpServerManager()
  31 +{
  32 + if (serverRegistry_)
  33 + {
  34 + delete serverRegistry_;
  35 + serverRegistry_ = NULL;
  36 + }
  37 +
  38 + ProjectMap::iterator iter = projects_.begin();
  39 + for (; iter != projects_.end(); ++iter)
  40 + {
  41 + DmpProject *mapProject = iter->second;
  42 + if (mapProject)
  43 + {
  44 + delete mapProject;
  45 + mapProject = nullptr;
  46 + }
  47 + }
  48 + projects_.clear();
  49 +}
  50 +
  51 +void DmpServerManager::init(const boost::filesystem::path &modulePath)
  52 +{
  53 + serverRegistry_->init(modulePath);
  54 + if(!loadServices())
  55 + {
  56 + std::cout << "加载服务失败!" << std::endl;
  57 + LOGGER_ERROR("加载服务失败!");
  58 + }
  59 + //LoadDmpServices();
  60 +}
  61 +
  62 +std::string DmpServerManager::getCapabilities()
  63 +{
  64 + return serverRegistry_->getCapabilities();
  65 +}
  66 +
  67 +std::shared_ptr<DmpServer> DmpServerManager::serverForRequest(const DmpServerRequest &request)
  68 +{
  69 + return serverRegistry_->getServerForRequest(request);
  70 +}
  71 +
  72 +std::shared_ptr<DmpServerApi> DmpServerManager::apiForRequest(const DmpServerRequest &request)
  73 +{
  74 + return serverRegistry_->getApiForRequest(request);
  75 +}
  76 +
  77 +DmpProject *DmpServerManager::getProject(const std::string &serviceName)
  78 +{
  79 + std::map<std::string, DmpProject *>::iterator iter = projects_.find(serviceName);
  80 + if (iter != projects_.end())
  81 + {
  82 + return iter->second;
  83 + }
  84 + else
  85 + {
  86 + return nullptr;
  87 + }
  88 +}
  89 +
  90 +bool DmpServerManager::removeProject(const std::string &serviceName)
  91 +{
  92 + try
  93 + {
  94 + std::map<std::string, DmpProject *>::iterator iter = projects_.find(serviceName);
  95 + if (iter != projects_.end())
  96 + {
  97 + delete iter->second;
  98 + projects_.erase(iter);
  99 + }
  100 + }
  101 + catch (const std::exception &e)
  102 + {
  103 + std::cerr << e.what() << '\n';
  104 + return false;
  105 + }
  106 + return true;
  107 +}
  108 +
  109 +bool DmpServerManager::publish(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData)
  110 +{
  111 + //project
  112 + std::string projData;
  113 + if (!DmpServerUtils::Base64Decode(projectData, &projData))
  114 + {
  115 + return false;
  116 + }
  117 + DmpProject *project = new DmpProject();
  118 + if (!project->Read(projData))
  119 + {
  120 + delete project;
  121 + return false;
  122 + }
  123 +
  124 + if (!serverRegistry_->getServer(serverName)->publish(serviceName, title, capabilities, *project))
  125 + {
  126 + delete project;
  127 + return false;
  128 + }
  129 + projects_[serviceName] = project;
  130 +
  131 + return true;
  132 +}
  133 +
  134 +bool DmpServerManager::deleteService(const std::string &serverName, const std::string &serviceName)
  135 +{
  136 + if (serverRegistry_->getServer(serverName)->remove(serviceName) && removeProject(serviceName))
  137 + {
  138 + return true;
  139 + }
  140 + else
  141 + {
  142 + return false;
  143 + }
  144 +}
  145 +
  146 +bool DmpServerManager::startService(const std::string &serverName, const std::string &serviceName)
  147 +{
  148 + return serverRegistry_->getServer(serverName)->start(serviceName);
  149 +}
  150 +
  151 +bool DmpServerManager::stopService(const std::string &serverName, const std::string &serviceName)
  152 +{
  153 + return serverRegistry_->getServer(serverName)->stop(serviceName);
  154 +}
  155 +bool DmpServerManager::loadServices()
  156 +{
  157 + boost::property_tree::ptree pt,ptList;
  158 + std::string conn = DmpServerConfig::Instance()->getMetaUrl();
  159 + const std::string url= conn + URI_RELOAD;
  160 + std::string strContent=DmpHttp::get(url);
  161 + if(strContent.length()==0)
  162 + {
  163 + return false;
  164 + }
  165 + std::stringstream ssData;
  166 + ssData<<strContent.c_str();
  167 + boost::property_tree::read_json(ssData, pt);
  168 + int iCount = std::atoi(pt.get<std::string>("data.count").c_str());
  169 + if(iCount>0)
  170 + {
  171 + ptList=pt.get_child("data.list");
  172 + for (auto& e : ptList)
  173 + {
  174 + std::string name = e.second.get<std::string>("name");
  175 + std::string title = e.second.get<std::string>("title");
  176 + std::string type = e.second.get<std::string>("type");
  177 + int capabilities =e.second.get<int>("capabilities");
  178 + std::string project = e.second.get<std::string>("project");
  179 + this->initServices(type,name,title,capabilities,project);
  180 + }
  181 + }
  182 + return true;
  183 +}
  184 +bool DmpServerManager::initServices(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData)
  185 +{
  186 + //project
  187 + std::string projData;
  188 + if (!DmpServerUtils::Base64Decode(projectData, &projData))
  189 + {
  190 + return false;
  191 + }
  192 + DmpProject *project = new DmpProject();
  193 + if (!project->Read(projData))
  194 + {
  195 + delete project;
  196 + return false;
  197 + }
  198 +
  199 + if (!serverRegistry_->getServer(serverName)->publish(serviceName, title, capabilities, *project))
  200 + {
  201 + delete project;
  202 + return false;
  203 + }
  204 + projects_[serviceName] = project;
  205 + return true;
189 } 206 }
@@ -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__
  1 +/**************************************************************************
  2 +* file: dmpmanagerapihandler.cpp
  3 +
  4 +* Author: wanzhongping
  5 +* Date: 2021-07-15 14:46:40
  6 +* Email: zhongpingw@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#include <iostream>
  10 +#include <boost/json.hpp>
  11 +#include <boost/property_tree/ptree.hpp>
  12 +#include <boost/property_tree/json_parser.hpp>
  13 +#include <boost/property_tree/xml_parser.hpp>
  14 +#include <boost/foreach.hpp>
  15 +#include <boost/lexical_cast.hpp>
  16 +#include <boost/algorithm/string.hpp>
  17 +#include <boost/date_time.hpp>
  18 +
  19 +#include "dmpmanagerapihandler.h"
  20 +#include "dmpserverrequest.h"
  21 +#include "dmpserverresponse.h"
  22 +#include "dmpapiparameters.h"
  23 +#include "dmplogger.h"
  24 +#include "dmpapiutils.h"
  25 +#include "dmpservermanager.h"
  26 +#include "dmpserverutils.h"
  27 +
  28 +DmpManagerApiHandler::DmpManagerApiHandler()
  29 +{
  30 +
  31 +}
  32 +
  33 +void DmpManagerApiHandler::HandleRequest(const DmpServerApiContext &context) const
  34 +{
  35 + if (OperationId().compare("regservice") == 0) {
  36 + regService(context);
  37 + }
  38 + else if (OperationId().compare("startservice") == 0) {
  39 + startService(context);
  40 + }
  41 + else if (OperationId().compare("stopservice") == 0) {
  42 + stopService(context);
  43 + }
  44 + else if(OperationId().compare("regtileservice") == 0) {
  45 + RegTileService(context);
  46 + }
  47 + else if(OperationId().compare("getservicelist") == 0) {
  48 + GetServiceList(context);
  49 + }
  50 + else if(OperationId().compare("getservicedetail") == 0) {
  51 + GetServiceDetail(context);
  52 + }
  53 + else if(OperationId().compare("getcapabilities") == 0) {
  54 + getCapabilities(context);
  55 + }
  56 + else if(OperationId().compare("updateservice") == 0) {
  57 + UpdateService(context);
  58 + }
  59 + else if(OperationId().compare("deleteservice") == 0) {
  60 + deleteService(context);
  61 + }
  62 + else if(OperationId().compare("gettileserviceinfo") == 0) {
  63 + GetTileServiceInfo(context);
  64 + }
  65 + else if(OperationId().compare("addcatalog") == 0) {
  66 + AddCatalog(context);
  67 + }
  68 + else if(OperationId().compare("deletecatalog") == 0) {
  69 + DeleteCatalog(context);
  70 + }
  71 + else if(OperationId().compare("getservicesmatrixsets") == 0) {
  72 + GetServicesMatrixSets(context);
  73 + }
  74 + else if(OperationId().compare("deletecache") == 0) {
  75 + DeleteCache(context);
  76 + }
  77 + else if(OperationId().compare("updatecache") == 0) {
  78 + UpdateCache(context);
  79 + }
  80 + else if(OperationId().compare("reloadservices") == 0) {
  81 + reloadServices(context);
  82 + }
  83 + else {
  84 + context.response()->write("not find oparation: " + OperationId());
  85 + }
  86 +}
  87 +void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const
  88 +{
  89 + switch (context.request()->method())
  90 + {
  91 + case DmpServerRequest::Method::GET_METHOD:
  92 + {
  93 + context.response()->write("{\"status\":\"true\",\"message\":\"服务发布测试——————GET\"}");
  94 + break;
  95 + }
  96 + case DmpServerRequest::Method::POST_METHOD:
  97 + {
  98 + std::string name;
  99 + std::string title;
  100 + int capabilities;
  101 + std::string serverType;
  102 + std::string project;
  103 + const char* data = (char*)(context.request()->GetData());
  104 + if(data && *data != '\0')
  105 + {
  106 + try
  107 + {
  108 + std::stringstream stream(data);
  109 + boost::property_tree::ptree pt;
  110 + boost::property_tree::read_json(stream, pt);
  111 +
  112 + name = pt.get<std::string>("name");
  113 + title = pt.get<std::string>("title");
  114 + capabilities = pt.get<int>("capabilities");
  115 + serverType = pt.get<std::string>("type");
  116 + project = pt.get<std::string>("project");
  117 + }
  118 + catch (boost::property_tree::ptree_bad_path& e) {
  119 + LOGGER_ERROR(e.what());
  120 + context.response()->write("{\"status\":\"false\",\"message\":\"服务发布失败\"}");
  121 + return;
  122 + }
  123 + catch (boost::property_tree::ptree_bad_data& e) {
  124 + LOGGER_ERROR(e.what());
  125 + context.response()->write("{\"status\":\"false\",\"message\":\"服务发布失败\"}");
  126 + return;
  127 + }
  128 + if(context.manager()->publish(serverType, name, title, capabilities, project)) {
  129 + LOGGER_INFO("服务发布成功");
  130 + context.response()->write("{\"status\":\"true\",\"message\":\"Pulish service successful!\"}");
  131 + // std::string projData;
  132 + // DmpServerUtils::Base64Decode(project, &projData);
  133 + // context.response()->removeHeader("Content-Type");
  134 + // context.response()->setHeader("Content-Type", "text/xml;charset=utf-8");
  135 + // context.response()->write(projData);
  136 + }
  137 + else
  138 + {
  139 + LOGGER_ERROR("服务发布失败");
  140 + context.response()->write("{\"status\":\"false\",\"message\":\"Pulish service fail!\"}");
  141 + }
  142 + }
  143 + else
  144 + {
  145 + LOGGER_ERROR("POST数据为空");
  146 + context.response()->write("{\"status\":\"false\",\"message\":\"Pulish service fail!\"}");
  147 + return;
  148 + }
  149 + break;
  150 +
  151 + }
  152 + default:
  153 + {
  154 +
  155 + }
  156 + }
  157 +}
  158 +
  159 +void DmpManagerApiHandler::startService(const DmpServerApiContext &context) const
  160 +{
  161 + switch (context.request()->method())
  162 + {
  163 + case DmpServerRequest::Method::GET_METHOD:
  164 + {
  165 + DmpServerParameters params = context.request()->serverParameters();
  166 + std::string serverName;
  167 + params.getValue("servername", serverName);
  168 + std::string serviceName;
  169 + params.getValue("servicename",serviceName);
  170 + context.manager()->startService(serverName, serviceName);
  171 + break;
  172 + }
  173 + case DmpServerRequest::Method::POST_METHOD:
  174 + {
  175 + context.response()->write("{\"status\":\"true\",\"message\":\"服务删除——————POST\"}");
  176 + break;
  177 + }
  178 + default:
  179 + {
  180 +
  181 + }
  182 + }
  183 +}
  184 +void DmpManagerApiHandler::stopService(const DmpServerApiContext &context) const
  185 +{
  186 + switch (context.request()->method())
  187 + {
  188 + case DmpServerRequest::Method::GET_METHOD:
  189 + {
  190 + DmpServerParameters params = context.request()->serverParameters();
  191 + std::string serverName;
  192 + params.getValue("servername", serverName);
  193 + std::string serviceName;
  194 + params.getValue("servicename",serviceName);
  195 + context.manager()->stopService(serverName, serviceName);
  196 + break;
  197 + }
  198 + case DmpServerRequest::Method::POST_METHOD:
  199 + {
  200 + context.response()->write("{\"status\":\"true\",\"message\":\"服务删除——————POST\"}");
  201 + break;
  202 + }
  203 + default:
  204 + {
  205 +
  206 + }
  207 + }
  208 +}
  209 +void DmpManagerApiHandler::RegTileService(const DmpServerApiContext &context) const
  210 +{
  211 + switch (context.request()->method())
  212 + {
  213 + case DmpServerRequest::Method::GET_METHOD:
  214 + {
  215 + context.response()->write("{\"status\":\"true\",\"message\":\"切片服务发布测试——————GET\"}");
  216 + break;
  217 + }
  218 + case DmpServerRequest::Method::POST_METHOD:
  219 + {
  220 + context.response()->write("{\"status\":\"true\",\"message\":\"切片服务发布测试——————POST\"}");
  221 + break;
  222 + }
  223 + default:
  224 + {
  225 +
  226 + }
  227 + }
  228 +}
  229 +void DmpManagerApiHandler::GetServiceList(const DmpServerApiContext &context) const
  230 +{
  231 +}
  232 +
  233 +void DmpManagerApiHandler::GetServiceDetail(const DmpServerApiContext &context) const
  234 +{
  235 +}
  236 +
  237 +void DmpManagerApiHandler::UpdateService(const DmpServerApiContext &context) const
  238 +{
  239 + switch (context.request()->method())
  240 + {
  241 + case DmpServerRequest::Method::GET_METHOD:
  242 + {
  243 + context.response()->write("{\"status\":\"true\",\"message\":\"更新服务信息——————GET\"}");
  244 + break;
  245 + }
  246 + case DmpServerRequest::Method::POST_METHOD:
  247 + {
  248 + context.response()->write("{\"status\":\"true\",\"message\":\"更新服务信息——————POST\"}");
  249 + break;
  250 + }
  251 + default:
  252 + {
  253 +
  254 + }
  255 + }
  256 +}
  257 +
  258 +void DmpManagerApiHandler::deleteService(const DmpServerApiContext &context) const
  259 +{
  260 + switch (context.request()->method())
  261 + {
  262 + case DmpServerRequest::Method::GET_METHOD:
  263 + {
  264 + DmpServerParameters params = context.request()->serverParameters();
  265 + std::string serverName;
  266 + params.getValue("servername", serverName);
  267 + std::string serviceName;
  268 + params.getValue("servicename",serviceName);
  269 + if(context.manager()->deleteService(serverName, serviceName)) {
  270 + context.response()->write("{\"status\":\"true\",\"message\":\"删除服务成功\"}");
  271 + }else{
  272 + context.response()->write("{\"status\":\"false\",\"message\":\"删除服务失败\"}");
  273 + }
  274 + break;
  275 + }
  276 + case DmpServerRequest::Method::POST_METHOD:
  277 + {
  278 + context.response()->write("{\"status\":\"true\",\"message\":\"服务删除——————POST\"}");
  279 + break;
  280 + }
  281 + default:
  282 + {
  283 +
  284 + }
  285 + }
  286 +}
  287 +
  288 +//获取配置文件切片信息
  289 +void DmpManagerApiHandler::GetTileServiceInfo(const DmpServerApiContext &context) const
  290 +{
  291 + switch (context.request()->method())
  292 + {
  293 + case DmpServerRequest::Method::GET_METHOD:
  294 + {
  295 + context.response()->write("{\"status\":\"true\",\"message\":\"获取切片配置信息——————GET\"}");
  296 + break;
  297 + }
  298 + case DmpServerRequest::Method::POST_METHOD:
  299 + {
  300 + std::string path;
  301 + std::string strExtent;
  302 + const char* data = (char*)(context.request()->GetData());
  303 + if(data && *data != '\0')
  304 + {
  305 + try
  306 + {
  307 + std::stringstream stream(data);
  308 + boost::property_tree::ptree pt;
  309 + boost::property_tree::ptree pt_json;
  310 + std::string confcdipath;
  311 + std::string confxmlpath;
  312 +
  313 + boost::property_tree::read_json(stream, pt);
  314 + path= pt.get<std::string>("projectlayers.maplayer.datasource");
  315 + confcdipath=path+"/conf.cdi";
  316 + confxmlpath=path+"/conf.xml";
  317 + //读取切片配置文件conf.cdi
  318 + boost::property_tree::ptree pt_confcdi;
  319 + boost::property_tree::read_xml(confcdipath,pt_confcdi);
  320 + //boost::property_tree::ptree pt_base=pt.get_child("base");
  321 + std::string xmin=pt_confcdi.get<std::string>("EnvelopeN.XMin");
  322 + std::string ymin=pt_confcdi.get<std::string>("EnvelopeN.YMin");
  323 + std::string xmax=pt_confcdi.get<std::string>("EnvelopeN.XMax");
  324 + std::string ymax=pt_confcdi.get<std::string>("EnvelopeN.YMax");
  325 + pt.put("projectlayers.maplayer.extent.xmin",xmin);
  326 + pt.put("projectlayers.maplayer.extent.ymin",ymin);
  327 + pt.put("projectlayers.maplayer.extent.xmax",xmax);
  328 + pt.put("projectlayers.maplayer.extent.ymax",ymax);
  329 + //读取配置文件conf.xml
  330 + boost::property_tree::ptree pt_confxml;
  331 + boost::property_tree::read_xml(confxmlpath,pt_confxml);
  332 + std::string strWKT=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.SpatialReference.WKT");
  333 + std::string wkid=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.SpatialReference.WKID");
  334 + std::string top=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileOrigin.X");
  335 + std::string left=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileOrigin.Y");
  336 + std::string tileCols=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileCols");
  337 + std::string tileRows=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileRows");
  338 + std::string dpi=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.DPI");
  339 + pt.put("projectCrs.spatialrefsys.wkt",strWKT);
  340 + pt.put("projectCrs.spatialrefsys.srid",wkid);
  341 +
  342 + boost::property_tree::ptree pt_tileMatrixSets=pt.get_child("tileMatrixSets");
  343 + BOOST_FOREACH(boost::property_tree::ptree::value_type &v1,pt_tileMatrixSets)
  344 + {
  345 + //conf.xml中读取tileinfo
  346 + boost::property_tree::ptree pt_levels,pt_tileMatrixSet;
  347 + boost::property_tree::ptree pt_tileArry=pt_confxml.get_child("CacheInfo.TileCacheInfo.LODInfos");
  348 + BOOST_FOREACH(boost::property_tree::ptree::value_type &v2,pt_tileArry)
  349 + {
  350 + boost::property_tree::ptree pt_level;
  351 + if(v2.first=="LODInfo")
  352 + {
  353 + std::string level=v2.second.get<std::string>("LevelID");
  354 + std::string scale=v2.second.get<std::string>("Scale");
  355 + std::string resolution=v2.second.get<std::string>("Resolution");
  356 + pt_level.add("level.id",level);
  357 + pt_level.add("level.scaleDenominator",scale);
  358 + pt_level.add("level.resolution",resolution);
  359 + pt_levels.push_back(std::make_pair("", pt_level));
  360 + }
  361 + }
  362 + std::string id_=v1.second.get<std::string>("tileMatrixSet.id");
  363 + pt_tileMatrixSet.add("id",id_);
  364 + pt_tileMatrixSet.add("crs","EPSG::"+wkid);
  365 + pt_tileMatrixSet.add("tileCols",tileCols);
  366 + pt_tileMatrixSet.add("tileRows",tileRows);
  367 + pt_tileMatrixSet.add("dpi",dpi);
  368 + pt_tileMatrixSet.add("tileOrigin.X",top);
  369 + pt_tileMatrixSet.add("tileOrigin.Y",left);
  370 + pt_tileMatrixSet.add_child("levels",pt_levels);
  371 + //pt_tilelist.add_child("tileMatrixList",pt_tiles);
  372 + v1.second.put_child("tileMatrixSet",pt_tileMatrixSet);
  373 + //v1.second.put("id","EPSG::"+wkid);
  374 + }
  375 +
  376 + pt.put_child("tileMatrixSets",pt_tileMatrixSets);
  377 + std::stringstream ss;
  378 + boost::property_tree::write_json(ss,pt);
  379 + strExtent=ss.str();
  380 + }
  381 + catch (boost::property_tree::ptree_bad_path& e) {
  382 + LOGGER_ERROR(e.what());
  383 + context.response()->write("{\"status\":\"false\",\"message\":\"获取切片配置信息失败\"}");
  384 + return;
  385 + }
  386 + catch (boost::property_tree::ptree_bad_data& e) {
  387 + LOGGER_ERROR(e.what());
  388 + context.response()->write("{\"status\":\"false\",\"message\":\"获取切片配置信息失败\"}");
  389 + return;
  390 + }
  391 + context.response()->write(strExtent);
  392 + }
  393 + break;
  394 + }
  395 + default:
  396 + {
  397 +
  398 + }
  399 + }
  400 +}
  401 +
  402 +//判断服务是否存在
  403 +void DmpManagerApiHandler::IsExistServiceName(const DmpServerApiContext &context) const
  404 +{
  405 + switch (context.request()->method())
  406 + {
  407 + case DmpServerRequest::Method::GET_METHOD:
  408 + {
  409 + context.response()->write("{\"status\":\"true\",\"message\":\"——————GET\"}");
  410 + break;
  411 + }
  412 + case DmpServerRequest::Method::POST_METHOD:
  413 + {
  414 + context.response()->write("{\"status\":\"true\",\"message\":\"——————POST\"}");
  415 + break;
  416 + }
  417 + default:
  418 + {
  419 +
  420 + }
  421 + }
  422 +}
  423 +
  424 +//新增目录
  425 +void DmpManagerApiHandler::AddCatalog(const DmpServerApiContext &context) const
  426 +{
  427 + switch (context.request()->method())
  428 + {
  429 + case DmpServerRequest::Method::GET_METHOD:
  430 + {
  431 + context.response()->write("{\"status\":\"true\",\"message\":\"新增目录——————GET\"}");
  432 + break;
  433 + }
  434 + case DmpServerRequest::Method::POST_METHOD:
  435 + {
  436 + context.response()->write("{\"status\":\"true\",\"message\":\"新增目录——————POST\"}");
  437 + break;
  438 + }
  439 + default:
  440 + {
  441 +
  442 + }
  443 + }
  444 +}
  445 +
  446 +//删除目录
  447 +void DmpManagerApiHandler::DeleteCatalog(const DmpServerApiContext &context) const
  448 +{
  449 + switch (context.request()->method())
  450 + {
  451 + case DmpServerRequest::Method::GET_METHOD:
  452 + {
  453 + context.response()->write("{\"status\":\"true\",\"message\":\"删除目录——————GET\"}");
  454 + break;
  455 + }
  456 + case DmpServerRequest::Method::POST_METHOD:
  457 + {
  458 + context.response()->write("{\"status\":\"true\",\"message\":\"删除目录——————POST\"}");
  459 + break;
  460 + }
  461 + default:
  462 + {
  463 +
  464 + }
  465 + }
  466 +}
  467 +
  468 +void DmpManagerApiHandler::GetServicesMatrixSets(const DmpServerApiContext &context) const
  469 +{
  470 + switch (context.request()->method())
  471 + {
  472 + case DmpServerRequest::Method::GET_METHOD:
  473 + {
  474 + context.response()->write("{\"status\":\"true\",\"message\":\"删除目录——————GET\"}");
  475 + break;
  476 + }
  477 + case DmpServerRequest::Method::POST_METHOD:
  478 + {
  479 + context.response()->write("{\"status\":\"true\",\"message\":\"删除目录——————POST\"}");
  480 + break;
  481 + }
  482 + default:
  483 + {
  484 +
  485 + }
  486 + }
  487 +}
  488 +void DmpManagerApiHandler::GetCatalogList(const DmpServerApiContext &context) const
  489 +{
  490 + switch (context.request()->method())
  491 + {
  492 + case DmpServerRequest::Method::GET_METHOD:
  493 + {
  494 + context.response()->write("{\"status\":\"true\",\"message\":\"获取目录列表——————GET\"}");
  495 + break;
  496 + }
  497 + case DmpServerRequest::Method::POST_METHOD:
  498 + {
  499 + context.response()->write("{\"status\":\"true\",\"message\":\"获取目录列表——————POST\"}");
  500 + break;
  501 + }
  502 + default:
  503 + {
  504 +
  505 + }
  506 + }
  507 +}
  508 +void DmpManagerApiHandler::UpdateCache(const DmpServerApiContext &context)const
  509 +{
  510 + switch (context.request()->method())
  511 + {
  512 + case DmpServerRequest::Method::GET_METHOD:
  513 + {
  514 + std::string serviceName_;
  515 + const DmpServerParameters params_ (context.request()->serverParameters());
  516 + CIMap paramsMap=params_.parameters();
  517 + std::map<std::string, std::string>::const_iterator iter;
  518 + iter =paramsMap.find("SERVICENAME");
  519 + if (iter != paramsMap.end())
  520 + {
  521 + try
  522 + {
  523 + serviceName_ = boost::lexical_cast<std::string>(iter->second);
  524 + }
  525 + catch (boost::bad_lexical_cast &e)
  526 + {
  527 + LOGGER_ERROR(e.what());
  528 + context.response()->write("{\"status\":\"true\",\"message\":\"获取参数信息错误——————GET\"}");
  529 + return;
  530 + }
  531 + }
  532 +
  533 + break;
  534 + }
  535 + case DmpServerRequest::Method::POST_METHOD:
  536 + {
  537 + context.response()->write("{\"status\":\"true\",\"message\":\"更新缓存——————POST\"}");
  538 + break;
  539 + }
  540 + default:
  541 + {
  542 +
  543 + }
  544 + }
  545 +}
  546 +void DmpManagerApiHandler::DeleteCache(const DmpServerApiContext &context)const
  547 +{
  548 + switch (context.request()->method())
  549 + {
  550 + case DmpServerRequest::Method::GET_METHOD:
  551 + {
  552 + std::string serviceName_;
  553 + const DmpServerParameters params_ (context.request()->serverParameters());
  554 + CIMap paramsMap=params_.parameters();
  555 + std::map<std::string, std::string>::const_iterator iter;
  556 + iter =paramsMap.find("SERVICENAME");
  557 + if (iter != paramsMap.end())
  558 + {
  559 + try
  560 + {
  561 + serviceName_ = boost::lexical_cast<std::string>(iter->second);
  562 + }
  563 + catch (boost::bad_lexical_cast &e)
  564 + {
  565 + LOGGER_ERROR(e.what());
  566 + context.response()->write("{\"status\":\"true\",\"message\":\"获取参数信息错误——————GET\"}");
  567 + return;
  568 + }
  569 + }
  570 +
  571 + break;
  572 + }
  573 + case DmpServerRequest::Method::POST_METHOD:
  574 + {
  575 + context.response()->write("{\"status\":\"true\",\"message\":\"删除缓存——————POST\"}");
  576 + break;
  577 + }
  578 + default:
  579 + {
  580 +
  581 + }
  582 + }
  583 +}
  584 +
  585 +void DmpManagerApiHandler::getCapabilities(const DmpServerApiContext &context) const
  586 +{
  587 + std::string strJson = context.manager()->getCapabilities();
  588 + context.response()->write(strJson);
  589 +}
  590 +void DmpManagerApiHandler::reloadServices(const DmpServerApiContext &context) const
  591 +{
  592 + switch (context.request()->method())
  593 + {
  594 + case DmpServerRequest::Method::GET_METHOD:
  595 + {
  596 + if(context.manager()->loadServices()) {
  597 + context.response()->write("{\"status\":\"true\",\"message\":\"重载服务成功\"}");
  598 + }else{
  599 + context.response()->write("{\"status\":\"false\",\"message\":\"重载服务失败\"}");
  600 + }
  601 + break;
  602 +
  603 + }
  604 + case DmpServerRequest::Method::POST_METHOD:
  605 + {
  606 + context.response()->write("{\"status\":\"true\",\"message\":\"服务重载——————POST\"}");
  607 + break;
  608 + }
  609 + default:
  610 + {
  611 +
  612 + }
  613 + }
  614 +}
@@ -45,9 +45,12 @@ void DmpManagerApiHandler::HandleRequest(const DmpServerApiContext &context) con @@ -45,9 +45,12 @@ void DmpManagerApiHandler::HandleRequest(const DmpServerApiContext &context) con
45 else if(OperationId().compare("deleteservice") == 0) { 45 else if(OperationId().compare("deleteservice") == 0) {
46 deleteService(context); 46 deleteService(context);
47 } 47 }
48 - else if(OperationId().compare("reloadservices") == 0) { 48 + else if(OperationId().compare("reloadservices") == 0) {
49 reloadServices(context); 49 reloadServices(context);
50 } 50 }
  51 + else if(OperationId().compare("gettileserviceinfo") == 0) {
  52 + GetTileServiceInfo(context);
  53 + }
51 else { 54 else {
52 context.response()->write("not find oparation: " + OperationId()); 55 context.response()->write("not find oparation: " + OperationId());
53 } 56 }
@@ -56,6 +59,7 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const @@ -56,6 +59,7 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const
56 { 59 {
57 switch (context.request()->method()) 60 switch (context.request()->method())
58 { 61 {
  62 +
59 case DmpServerRequest::Method::GET_METHOD: 63 case DmpServerRequest::Method::GET_METHOD:
60 { 64 {
61 context.response()->write("{\"status\":\"true\",\"message\":\"服务发布测试——————GET\"}"); 65 context.response()->write("{\"status\":\"true\",\"message\":\"服务发布测试——————GET\"}");
@@ -93,9 +97,12 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const @@ -93,9 +97,12 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const
93 context.response()->write("{\"status\":\"false\",\"message\":\"服务发布失败\"}"); 97 context.response()->write("{\"status\":\"false\",\"message\":\"服务发布失败\"}");
94 return; 98 return;
95 } 99 }
96 - if(context.manager()->publish(serverType, name, title, capabilities, project)) { 100 + int flag=context.manager()->publish(serverType, name, title, capabilities, project);
  101 + if(flag==1) {
97 LOGGER_INFO("服务发布成功"); 102 LOGGER_INFO("服务发布成功");
98 - context.response()->write("{\"status\":\"true\",\"message\":\"Pulish service successful!\"}"); 103 + std::string http="http://"+context.request()->domain()+":"+context.request()->port();
  104 + std::string url=http+"/DMap/Services/"+name+"/TileServer/tmsService?REQUEST=GetThumbnail";
  105 + context.response()->write("{\"status\":\""+std::to_string(flag)+"\",\"url\":\""+url+"\",\"message\":\"Pulish service successful!\"}");
99 // std::string projData; 106 // std::string projData;
100 // DmpServerUtils::Base64Decode(project, &projData); 107 // DmpServerUtils::Base64Decode(project, &projData);
101 // context.response()->removeHeader("Content-Type"); 108 // context.response()->removeHeader("Content-Type");
@@ -105,7 +112,14 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const @@ -105,7 +112,14 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const
105 else 112 else
106 { 113 {
107 LOGGER_ERROR("服务发布失败"); 114 LOGGER_ERROR("服务发布失败");
108 - context.response()->write("{\"status\":\"false\",\"message\":\"Pulish service fail!\"}"); 115 + if(flag==0)
  116 + {
  117 + context.response()->write("{\"status\":\""+std::to_string(flag)+"\",\"message\":\"Pulish service thumbnail fail!\"}");
  118 + }
  119 + else
  120 + {
  121 + context.response()->write("{\"status\":\""+std::to_string(flag)+"\",\"message\":\"Pulish service fail!\"}");
  122 + }
109 } 123 }
110 } 124 }
111 else 125 else
@@ -236,4 +250,117 @@ void DmpManagerApiHandler::reloadServices(const DmpServerApiContext &context) co @@ -236,4 +250,117 @@ void DmpManagerApiHandler::reloadServices(const DmpServerApiContext &context) co
236 250
237 } 251 }
238 } 252 }
  253 +}
  254 +//获取配置文件切片信息
  255 +void DmpManagerApiHandler::GetTileServiceInfo(const DmpServerApiContext &context) const
  256 +{
  257 + switch (context.request()->method())
  258 + {
  259 + case DmpServerRequest::Method::GET_METHOD:
  260 + {
  261 + context.response()->write("{\"status\":\"true\",\"message\":\"获取切片配置信息——————GET\"}");
  262 + break;
  263 + }
  264 + case DmpServerRequest::Method::POST_METHOD:
  265 + {
  266 + std::string path;
  267 + std::string strExtent;
  268 + const char* data = (char*)(context.request()->GetData());
  269 + if(data && *data != '\0')
  270 + {
  271 + try
  272 + {
  273 + std::stringstream stream(data);
  274 + boost::property_tree::ptree pt;
  275 + boost::property_tree::ptree pt_json;
  276 + std::string confcdipath;
  277 + std::string confxmlpath;
  278 +
  279 + boost::property_tree::read_json(stream, pt);
  280 + path= pt.get<std::string>("projectlayers.maplayer.datasource");
  281 + confcdipath=path+"/conf.cdi";
  282 + confxmlpath=path+"/conf.xml";
  283 + //读取切片配置文件conf.cdi
  284 + boost::property_tree::ptree pt_confcdi;
  285 + boost::property_tree::read_xml(confcdipath,pt_confcdi);
  286 + //boost::property_tree::ptree pt_base=pt.get_child("base");
  287 + std::string xmin=pt_confcdi.get<std::string>("EnvelopeN.XMin");
  288 + std::string ymin=pt_confcdi.get<std::string>("EnvelopeN.YMin");
  289 + std::string xmax=pt_confcdi.get<std::string>("EnvelopeN.XMax");
  290 + std::string ymax=pt_confcdi.get<std::string>("EnvelopeN.YMax");
  291 + pt.put("projectlayers.maplayer.extent.xmin",xmin);
  292 + pt.put("projectlayers.maplayer.extent.ymin",ymin);
  293 + pt.put("projectlayers.maplayer.extent.xmax",xmax);
  294 + pt.put("projectlayers.maplayer.extent.ymax",ymax);
  295 + //读取配置文件conf.xml
  296 + boost::property_tree::ptree pt_confxml;
  297 + boost::property_tree::read_xml(confxmlpath,pt_confxml);
  298 + std::string strWKT=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.SpatialReference.WKT");
  299 + std::string wkid=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.SpatialReference.WKID");
  300 + std::string top=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileOrigin.X");
  301 + std::string left=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileOrigin.Y");
  302 + std::string tileCols=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileCols");
  303 + std::string tileRows=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileRows");
  304 + std::string dpi=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.DPI");
  305 + pt.put("projectCrs.spatialrefsys.wkt",strWKT);
  306 + pt.put("projectCrs.spatialrefsys.srid",wkid);
  307 +
  308 + boost::property_tree::ptree pt_tileMatrixSets=pt.get_child("tileMatrixSets");
  309 + BOOST_FOREACH(boost::property_tree::ptree::value_type &v1,pt_tileMatrixSets)
  310 + {
  311 + //conf.xml中读取tileinfo
  312 + boost::property_tree::ptree pt_levels,pt_tileMatrixSet;
  313 + boost::property_tree::ptree pt_tileArry=pt_confxml.get_child("CacheInfo.TileCacheInfo.LODInfos");
  314 + BOOST_FOREACH(boost::property_tree::ptree::value_type &v2,pt_tileArry)
  315 + {
  316 + boost::property_tree::ptree pt_level;
  317 + if(v2.first=="LODInfo")
  318 + {
  319 + std::string level=v2.second.get<std::string>("LevelID");
  320 + std::string scale=v2.second.get<std::string>("Scale");
  321 + std::string resolution=v2.second.get<std::string>("Resolution");
  322 + pt_level.add("level.id",level);
  323 + pt_level.add("level.scaleDenominator",scale);
  324 + pt_level.add("level.resolution",resolution);
  325 + pt_levels.push_back(std::make_pair("", pt_level));
  326 + }
  327 + }
  328 + std::string id_=v1.second.get<std::string>("tileMatrixSet.id");
  329 + pt_tileMatrixSet.add("id",id_);
  330 + pt_tileMatrixSet.add("crs","EPSG::"+wkid);
  331 + pt_tileMatrixSet.add("tileCols",tileCols);
  332 + pt_tileMatrixSet.add("tileRows",tileRows);
  333 + pt_tileMatrixSet.add("dpi",dpi);
  334 + pt_tileMatrixSet.add("tileOrigin.X",top);
  335 + pt_tileMatrixSet.add("tileOrigin.Y",left);
  336 + pt_tileMatrixSet.add_child("levels",pt_levels);
  337 + //pt_tilelist.add_child("tileMatrixList",pt_tiles);
  338 + v1.second.put_child("tileMatrixSet",pt_tileMatrixSet);
  339 + //v1.second.put("id","EPSG::"+wkid);
  340 + }
  341 +
  342 + pt.put_child("tileMatrixSets",pt_tileMatrixSets);
  343 + std::stringstream ss;
  344 + boost::property_tree::write_json(ss,pt);
  345 + strExtent=ss.str();
  346 + }
  347 + catch (boost::property_tree::ptree_bad_path& e) {
  348 + LOGGER_ERROR(e.what());
  349 + context.response()->write("{\"status\":\"false\",\"message\":\"获取切片配置信息失败\"}");
  350 + return;
  351 + }
  352 + catch (boost::property_tree::ptree_bad_data& e) {
  353 + LOGGER_ERROR(e.what());
  354 + context.response()->write("{\"status\":\"false\",\"message\":\"获取切片配置信息失败\"}");
  355 + return;
  356 + }
  357 + context.response()->write(strExtent);
  358 + }
  359 + break;
  360 + }
  361 + default:
  362 + {
  363 +
  364 + }
  365 + }
239 } 366 }
@@ -27,6 +27,7 @@ public: @@ -27,6 +27,7 @@ public:
27 void deleteService(const DmpServerApiContext &context) const; 27 void deleteService(const DmpServerApiContext &context) const;
28 void getCapabilities(const DmpServerApiContext &context)const; 28 void getCapabilities(const DmpServerApiContext &context)const;
29 void reloadServices(const DmpServerApiContext &context)const; 29 void reloadServices(const DmpServerApiContext &context)const;
  30 + void GetTileServiceInfo(const DmpServerApiContext &context) const;
30 31
31 }; 32 };
32 33
@@ -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
@@ -18,6 +19,7 @@ SET (TILESERVER_SRCS @@ -18,6 +19,7 @@ SET (TILESERVER_SRCS
18 19
19 SET (TILESERVER_HDRS 20 SET (TILESERVER_HDRS
20 dmptileserver.h 21 dmptileserver.h
  22 + #dmptilethumbnail.h
21 wmts/dmpwmtsparameters.h 23 wmts/dmpwmtsparameters.h
22 wmts/dmptileprovider.h 24 wmts/dmptileprovider.h
23 wmts/dmptileproviderfactory.h 25 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);
@@ -66,7 +66,7 @@ namespace DmpWmts @@ -66,7 +66,7 @@ namespace DmpWmts
66 const DmpServerProject *serverProject = context.serverProject(); 66 const DmpServerProject *serverProject = context.serverProject();
67 const DmpProject *project = serverProject->project(); 67 const DmpProject *project = serverProject->project();
68 DmpTileLayer *tileLayer = static_cast<DmpTileLayer *>(project->getLayer(layerName)); 68 DmpTileLayer *tileLayer = static_cast<DmpTileLayer *>(project->getLayer(layerName));
69 - 69 +
70 if (req.empty()) 70 if (req.empty())
71 { 71 {
72 context.response()->writeHtml("wmts,Operation is null"); 72 context.response()->writeHtml("wmts,Operation is null");
@@ -79,11 +79,11 @@ namespace DmpWmts @@ -79,11 +79,11 @@ namespace DmpWmts
79 } 79 }
80 else if(boost::iequals(req, "GetThumbnail")) 80 else if(boost::iequals(req, "GetThumbnail"))
81 { 81 {
82 -  
83 } 82 }
84 else if (boost::iequals(req, "GetCapabilities")) 83 else if (boost::iequals(req, "GetCapabilities"))
85 { 84 {
86 const std::string host=context.request()->domain()+":"+context.request()->port();; 85 const std::string host=context.request()->domain()+":"+context.request()->port();;
  86 + const std::string title=serverProject->title();
87 const std::string servicename=serverProject->name(); 87 const std::string servicename=serverProject->name();
88 88
89 boost::property_tree::ptree pt; 89 boost::property_tree::ptree pt;
@@ -92,6 +92,11 @@ namespace DmpWmts @@ -92,6 +92,11 @@ namespace DmpWmts
92 pt.add("Layer.ows:Identifier",""); 92 pt.add("Layer.ows:Identifier","");
93 pt.add("Layer.Style",tileLayer->getStyle()); 93 pt.add("Layer.Style",tileLayer->getStyle());
94 pt.add("Layer.Format",tileLayer->getFormat()); 94 pt.add("Layer.Format",tileLayer->getFormat());
  95 + DmpRectangle rectangle=tileLayer->extent();
  96 + std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
  97 + std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax());
  98 + pt.add("Layer.ows:BoundingBox.ows:LowerCorner",lowerPoint);
  99 + pt.add("Layer.ows:BoundingBox.ows:UpperCorner",upperPoint);
95 100
96 std::vector<DmpTileMatrixSet*> tileMatrixSets; 101 std::vector<DmpTileMatrixSet*> tileMatrixSets;
97 tileLayer->getTileMatrixSets(tileMatrixSets); 102 tileLayer->getTileMatrixSets(tileMatrixSets);
@@ -119,11 +124,12 @@ namespace DmpWmts @@ -119,11 +124,12 @@ namespace DmpWmts
119 pt.add("TileMatrixSet.TileHeight",(*iter)->tileRows()); 124 pt.add("TileMatrixSet.TileHeight",(*iter)->tileRows());
120 pt.add("TileMatrixSet.TopLeftCorner",std::to_string((*iter)->tileOrigin()->x())+","+std::to_string((*iter)->tileOrigin()->y())); 125 pt.add("TileMatrixSet.TopLeftCorner",std::to_string((*iter)->tileOrigin()->x())+","+std::to_string((*iter)->tileOrigin()->y()));
121 pt.add("TileMatrixSet.DPI",(*iter)->dpi()); 126 pt.add("TileMatrixSet.DPI",(*iter)->dpi());
  127 +
122 } 128 }
123 //boost::property_tree::write_json("/mnt/d/json.txt",pt); 129 //boost::property_tree::write_json("/mnt/d/json.txt",pt);
124 130
125 DmpCapabiliTilesOperation capOper; 131 DmpCapabiliTilesOperation capOper;
126 - capOper.WriteCapabilities(pt,host,servicename,*context.response()); 132 + capOper.WriteCapabilities(pt,host,servicename,title,*context.response());
127 133
128 } 134 }
129 } 135 }
注册登录 后发表评论