提交 8e446e18a7a81ea282d05f6026f4d41d5dae1378

作者 nheweijun
1 个父辈 0e3bf228

2021.8.9

@@ -29,4 +29,7 @@ dist/ @@ -29,4 +29,7 @@ dist/
29 build/ 29 build/
30 *.egg-info/ 30 *.egg-info/
31 .git/ 31 .git/
32 -.vscode/  
  32 +.vscode/
  33 +app/modules/image/data
  34 +app/modules/image/file_tmp
  35 +app/modules/file_tmp
@@ -16,8 +16,8 @@ else: @@ -16,8 +16,8 @@ else:
16 from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient 16 from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
17 from thrift.protocol.TBinaryProtocol import TBinaryProtocol 17 from thrift.protocol.TBinaryProtocol import TBinaryProtocol
18 18
19 -from . import ImageDataService  
20 -from .ttypes import * 19 +from app.modules.image.ImageDataService import ImageDataService
  20 +from app.modules.image.ImageDataService.ttypes import *
21 21
22 if len(sys.argv) <= 1 or sys.argv[1] == '--help': 22 if len(sys.argv) <= 1 or sys.argv[1] == '--help':
23 print('') 23 print('')
@@ -466,7 +466,7 @@ class getData_result(object): @@ -466,7 +466,7 @@ class getData_result(object):
466 break 466 break
467 if fid == 0: 467 if fid == 0:
468 if ftype == TType.STRING: 468 if ftype == TType.STRING:
469 - self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() 469 + self.success = iprot.readBinary()
470 else: 470 else:
471 iprot.skip(ftype) 471 iprot.skip(ftype)
472 else: 472 else:
@@ -481,7 +481,7 @@ class getData_result(object): @@ -481,7 +481,7 @@ class getData_result(object):
481 oprot.writeStructBegin('getData_result') 481 oprot.writeStructBegin('getData_result')
482 if self.success is not None: 482 if self.success is not None:
483 oprot.writeFieldBegin('success', TType.STRING, 0) 483 oprot.writeFieldBegin('success', TType.STRING, 0)
484 - oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success) 484 + oprot.writeBinary(self.success)
485 oprot.writeFieldEnd() 485 oprot.writeFieldEnd()
486 oprot.writeFieldStop() 486 oprot.writeFieldStop()
487 oprot.writeStructEnd() 487 oprot.writeStructEnd()
@@ -501,7 +501,7 @@ class getData_result(object): @@ -501,7 +501,7 @@ class getData_result(object):
501 return not (self == other) 501 return not (self == other)
502 all_structs.append(getData_result) 502 all_structs.append(getData_result)
503 getData_result.thrift_spec = ( 503 getData_result.thrift_spec = (
504 - (0, TType.STRING, 'success', 'UTF8', None, ), # 0 504 + (0, TType.STRING, 'success', 'BINARY', None, ), # 0
505 ) 505 )
506 506
507 507
@@ -9,8 +9,14 @@ from flask import Blueprint @@ -9,8 +9,14 @@ from flask import Blueprint
9 from app.util import BlueprintApi 9 from app.util import BlueprintApi
10 from . import image_register 10 from . import image_register
11 from . import image_service_register 11 from . import image_service_register
  12 +from . import image_service_list
12 from . import image_server_list 13 from . import image_server_list
13 from . import data_list 14 from . import data_list
  15 +from . import capabilities
  16 +from . import image_list
  17 +from . import image_tile
  18 +
  19 +
14 class DataManager(BlueprintApi): 20 class DataManager(BlueprintApi):
15 21
16 bp = Blueprint("Image", __name__, url_prefix="/API/Image") 22 bp = Blueprint("Image", __name__, url_prefix="/API/Image")
@@ -50,4 +56,49 @@ class DataManager(BlueprintApi): @@ -50,4 +56,49 @@ class DataManager(BlueprintApi):
50 """ 56 """
51 数据列表 57 数据列表
52 """ 58 """
53 - return data_list.Api().result  
  59 + return data_list.Api().result
  60 +
  61 + @staticmethod
  62 + @bp.route('/Capabilities', methods=['POST'])
  63 + @swag_from(capabilities.Api.api_doc)
  64 + def capabilities():
  65 + """
  66 + 能力文档
  67 + """
  68 + return capabilities.Api().result
  69 +
  70 + @staticmethod
  71 + @bp.route('/ImageList', methods=['POST'])
  72 + @swag_from(image_list.Api.api_doc)
  73 + def image_list():
  74 + """
  75 + 影像列表
  76 + """
  77 + return image_list.Api().result
  78 +
  79 + @staticmethod
  80 + @bp.route('/ImageServiceList', methods=['POST'])
  81 + @swag_from(image_service_list.Api.api_doc)
  82 + def image_service_list():
  83 + """
  84 + 影像服务列表
  85 + """
  86 + return image_service_list.Api().result
  87 +
  88 + @staticmethod
  89 + @bp.route('/Tile/<guid>/<l>/<y>/<z>', methods=['GET'])
  90 + @swag_from(image_tile.Api.api_doc)
  91 + def api_image_tile(guid,l,y,z):
  92 + """
  93 + 切片服务
  94 + """
  95 + return image_tile.Api(guid,l,y,z).result
  96 +
  97 + @staticmethod
  98 + @bp.route('/Tile', methods=['GET','POST'])
  99 + @swag_from(image_tile.Api.api_doc)
  100 + def api_image_tile_kv():
  101 + """
  102 + 切片服务
  103 + """
  104 + return image_tile.Api("1",1,1,1).result
@@ -4,502 +4,507 @@ @@ -4,502 +4,507 @@
4 #email: nheweijun@sina.com 4 #email: nheweijun@sina.com
5 5
6 6
7 -from app.models import Database  
8 -from app.util import get_parameter,objects_to_jsonarray  
9 -import traceback  
10 from flask import Response 7 from flask import Response
11 -def api(): 8 +from app.util.component.ApiTemplate import ApiTemplate
  9 +class Api(ApiTemplate):
12 10
13 - x = '''<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd" version="1.0.0">  
14 - <!-- Service Identification -->  
15 - <ows:ServiceIdentification>  
16 - <ows:Title>localimage</ows:Title>  
17 - <ows:ServiceType>OGC WMTS</ows:ServiceType>  
18 - <ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>  
19 - </ows:ServiceIdentification>  
20 - <!-- Operations Metadata -->  
21 - <ows:OperationsMetadata>  
22 - <ows:Operation name="GetCapabilities">  
23 - <ows:DCP>  
24 - <ows:HTTP>  
25 - <ows:Get xlink:href="http://172.26.99.160:8840/API/Image/Capabilities">  
26 - <ows:Constraint name="GetEncoding">  
27 - <ows:AllowedValues>  
28 - <ows:Value>RESTful</ows:Value>  
29 - </ows:AllowedValues>  
30 - </ows:Constraint>  
31 - </ows:Get>  
32 - <!-- add KVP binding in 10.1 -->  
33 - <ows:Get xlink:href="http://172.26.99.160:8840/API/Image/TileMany?">  
34 - <ows:Constraint name="GetEncoding">  
35 - <ows:AllowedValues>  
36 - <ows:Value>KVP</ows:Value>  
37 - </ows:AllowedValues>  
38 - </ows:Constraint>  
39 - </ows:Get>  
40 - </ows:HTTP>  
41 - </ows:DCP>  
42 - </ows:Operation>  
43 - <ows:Operation name="GetTile">  
44 - <ows:DCP>  
45 - <ows:HTTP>  
46 - <ows:Get xlink:href="http://172.26.99.160:8840/API/Image/TileMany">  
47 - <ows:Constraint name="GetEncoding">  
48 - <ows:AllowedValues>  
49 - <ows:Value>RESTful</ows:Value>  
50 - </ows:AllowedValues>  
51 - </ows:Constraint>  
52 - </ows:Get>  
53 - <ows:Get xlink:href="http://172.26.99.160:8840/API/Image/TileMany?">  
54 - <ows:Constraint name="GetEncoding">  
55 - <ows:AllowedValues>  
56 - <ows:Value>KVP</ows:Value>  
57 - </ows:AllowedValues>  
58 - </ows:Constraint>  
59 - </ows:Get>  
60 - </ows:HTTP>  
61 - </ows:DCP>  
62 - </ows:Operation>  
63 - </ows:OperationsMetadata>  
64 - <Contents>  
65 - <!-- Layer -->  
66 - <Layer>  
67 - <ows:Title>changde</ows:Title>  
68 - <ows:Identifier>changde</ows:Identifier>  
69 - <ows:BoundingBox crs="urn:ogc:def:crs:EPSG::4490">  
70 - <ows:LowerCorner>111.604613312 28.9170588759</ows:LowerCorner>  
71 - <ows:UpperCorner>111.751508603 29.079435995</ows:UpperCorner>  
72 - </ows:BoundingBox>  
73 - <ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">  
74 - <ows:LowerCorner>111.604613312 28.9170588759</ows:LowerCorner>  
75 - <ows:UpperCorner>111.751508603 29.079435995</ows:UpperCorner>  
76 - </ows:WGS84BoundingBox>  
77 - <Style isDefault="true">  
78 - <ows:Title>Default Style</ows:Title>  
79 - <ows:Identifier>default</ows:Identifier>  
80 - </Style>  
81 - <Format>image/png</Format>  
82 - <TileMatrixSetLink>  
83 - <TileMatrixSet>default028mm</TileMatrixSet>  
84 - </TileMatrixSetLink>  
85 - <TileMatrixSetLink>  
86 - <TileMatrixSet>nativeTileMatrixSet</TileMatrixSet>  
87 - </TileMatrixSetLink>  
88 - <ResourceURL format="image/png" resourceType="tile" template="http://172.26.99.160:8840/API/Image/TileMany/{TileMatrix}/{TileRow}/{TileCol}?format=image/png"/>  
89 - </Layer>  
90 - <!-- TileMatrixSet -->  
91 - <TileMatrixSet>  
92 - <ows:Title>Default TileMatrix using 0.28mm</ows:Title>  
93 - <ows:Abstract>The tile matrix set that has scale values calculated based on the dpi defined by OGC specification (dpi assumes 0.28mm as the physical distance of a pixel).</ows:Abstract>  
94 - <ows:Identifier>default028mm</ows:Identifier>  
95 - <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4490</ows:SupportedCRS>  
96 - <TileMatrix>  
97 - <ows:Identifier>0</ows:Identifier>  
98 - <ScaleDenominator>5.584552725961496E8</ScaleDenominator>  
99 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
100 - <TileWidth>256</TileWidth>  
101 - <TileHeight>256</TileHeight>  
102 - <MatrixWidth>1</MatrixWidth>  
103 - <MatrixHeight>1</MatrixHeight>  
104 - </TileMatrix>  
105 - <TileMatrix>  
106 - <ows:Identifier>1</ows:Identifier>  
107 - <ScaleDenominator>2.792276362980748E8</ScaleDenominator>  
108 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
109 - <TileWidth>256</TileWidth>  
110 - <TileHeight>256</TileHeight>  
111 - <MatrixWidth>1</MatrixWidth>  
112 - <MatrixHeight>1</MatrixHeight>  
113 - </TileMatrix>  
114 - <TileMatrix>  
115 - <ows:Identifier>2</ows:Identifier>  
116 - <ScaleDenominator>1.396138181490374E8</ScaleDenominator>  
117 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
118 - <TileWidth>256</TileWidth>  
119 - <TileHeight>256</TileHeight>  
120 - <MatrixWidth>1</MatrixWidth>  
121 - <MatrixHeight>1</MatrixHeight>  
122 - </TileMatrix>  
123 - <TileMatrix>  
124 - <ows:Identifier>3</ows:Identifier>  
125 - <ScaleDenominator>6.98069090745187E7</ScaleDenominator>  
126 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
127 - <TileWidth>256</TileWidth>  
128 - <TileHeight>256</TileHeight>  
129 - <MatrixWidth>1</MatrixWidth>  
130 - <MatrixHeight>1</MatrixHeight>  
131 - </TileMatrix>  
132 - <TileMatrix>  
133 - <ows:Identifier>4</ows:Identifier>  
134 - <ScaleDenominator>3.490345453725935E7</ScaleDenominator>  
135 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
136 - <TileWidth>256</TileWidth>  
137 - <TileHeight>256</TileHeight>  
138 - <MatrixWidth>1</MatrixWidth>  
139 - <MatrixHeight>1</MatrixHeight>  
140 - </TileMatrix>  
141 - <TileMatrix>  
142 - <ows:Identifier>5</ows:Identifier>  
143 - <ScaleDenominator>1.7451727268629674E7</ScaleDenominator>  
144 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
145 - <TileWidth>256</TileWidth>  
146 - <TileHeight>256</TileHeight>  
147 - <MatrixWidth>1</MatrixWidth>  
148 - <MatrixHeight>1</MatrixHeight>  
149 - </TileMatrix>  
150 - <TileMatrix>  
151 - <ows:Identifier>6</ows:Identifier>  
152 - <ScaleDenominator>8725863.634314837</ScaleDenominator>  
153 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
154 - <TileWidth>256</TileWidth>  
155 - <TileHeight>256</TileHeight>  
156 - <MatrixWidth>1</MatrixWidth>  
157 - <MatrixHeight>1</MatrixHeight>  
158 - </TileMatrix>  
159 - <TileMatrix>  
160 - <ows:Identifier>7</ows:Identifier>  
161 - <ScaleDenominator>4362931.8171574185</ScaleDenominator>  
162 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
163 - <TileWidth>256</TileWidth>  
164 - <TileHeight>256</TileHeight>  
165 - <MatrixWidth>1</MatrixWidth>  
166 - <MatrixHeight>1</MatrixHeight>  
167 - </TileMatrix>  
168 - <TileMatrix>  
169 - <ows:Identifier>8</ows:Identifier>  
170 - <ScaleDenominator>2181465.9085787092</ScaleDenominator>  
171 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
172 - <TileWidth>256</TileWidth>  
173 - <TileHeight>256</TileHeight>  
174 - <MatrixWidth>2</MatrixWidth>  
175 - <MatrixHeight>2</MatrixHeight>  
176 - </TileMatrix>  
177 - <TileMatrix>  
178 - <ows:Identifier>9</ows:Identifier>  
179 - <ScaleDenominator>1090732.9542893546</ScaleDenominator>  
180 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
181 - <TileWidth>256</TileWidth>  
182 - <TileHeight>256</TileHeight>  
183 - <MatrixWidth>3</MatrixWidth>  
184 - <MatrixHeight>3</MatrixHeight>  
185 - </TileMatrix>  
186 - <TileMatrix>  
187 - <ows:Identifier>10</ows:Identifier>  
188 - <ScaleDenominator>545366.4771446773</ScaleDenominator>  
189 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
190 - <TileWidth>256</TileWidth>  
191 - <TileHeight>256</TileHeight>  
192 - <MatrixWidth>6</MatrixWidth>  
193 - <MatrixHeight>6</MatrixHeight>  
194 - </TileMatrix>  
195 - <TileMatrix>  
196 - <ows:Identifier>11</ows:Identifier>  
197 - <ScaleDenominator>272683.23857233865</ScaleDenominator>  
198 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
199 - <TileWidth>256</TileWidth>  
200 - <TileHeight>256</TileHeight>  
201 - <MatrixWidth>11</MatrixWidth>  
202 - <MatrixHeight>11</MatrixHeight>  
203 - </TileMatrix>  
204 - <TileMatrix>  
205 - <ows:Identifier>12</ows:Identifier>  
206 - <ScaleDenominator>136341.61928616933</ScaleDenominator>  
207 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
208 - <TileWidth>256</TileWidth>  
209 - <TileHeight>256</TileHeight>  
210 - <MatrixWidth>21</MatrixWidth>  
211 - <MatrixHeight>20</MatrixHeight>  
212 - </TileMatrix>  
213 - <TileMatrix>  
214 - <ows:Identifier>13</ows:Identifier>  
215 - <ScaleDenominator>68170.80964308466</ScaleDenominator>  
216 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
217 - <TileWidth>256</TileWidth>  
218 - <TileHeight>256</TileHeight>  
219 - <MatrixWidth>42</MatrixWidth>  
220 - <MatrixHeight>40</MatrixHeight>  
221 - </TileMatrix>  
222 - <TileMatrix>  
223 - <ows:Identifier>14</ows:Identifier>  
224 - <ScaleDenominator>34085.40482154233</ScaleDenominator>  
225 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
226 - <TileWidth>256</TileWidth>  
227 - <TileHeight>256</TileHeight>  
228 - <MatrixWidth>83</MatrixWidth>  
229 - <MatrixHeight>80</MatrixHeight>  
230 - </TileMatrix>  
231 - <TileMatrix>  
232 - <ows:Identifier>15</ows:Identifier>  
233 - <ScaleDenominator>17042.702410771166</ScaleDenominator>  
234 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
235 - <TileWidth>256</TileWidth>  
236 - <TileHeight>256</TileHeight>  
237 - <MatrixWidth>166</MatrixWidth>  
238 - <MatrixHeight>158</MatrixHeight>  
239 - </TileMatrix>  
240 - <TileMatrix>  
241 - <ows:Identifier>16</ows:Identifier>  
242 - <ScaleDenominator>8521.351205385583</ScaleDenominator>  
243 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
244 - <TileWidth>256</TileWidth>  
245 - <TileHeight>256</TileHeight>  
246 - <MatrixWidth>331</MatrixWidth>  
247 - <MatrixHeight>314</MatrixHeight>  
248 - </TileMatrix>  
249 - <TileMatrix>  
250 - <ows:Identifier>17</ows:Identifier>  
251 - <ScaleDenominator>4260.6756026927915</ScaleDenominator>  
252 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
253 - <TileWidth>256</TileWidth>  
254 - <TileHeight>256</TileHeight>  
255 - <MatrixWidth>661</MatrixWidth>  
256 - <MatrixHeight>627</MatrixHeight>  
257 - </TileMatrix>  
258 - <TileMatrix>  
259 - <ows:Identifier>18</ows:Identifier>  
260 - <ScaleDenominator>2130.3378013463957</ScaleDenominator>  
261 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
262 - <TileWidth>256</TileWidth>  
263 - <TileHeight>256</TileHeight>  
264 - <MatrixWidth>1321</MatrixWidth>  
265 - <MatrixHeight>1254</MatrixHeight>  
266 - </TileMatrix>  
267 - <TileMatrix>  
268 - <ows:Identifier>19</ows:Identifier>  
269 - <ScaleDenominator>1065.1689006731979</ScaleDenominator>  
270 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
271 - <TileWidth>256</TileWidth>  
272 - <TileHeight>256</TileHeight>  
273 - <MatrixWidth>2642</MatrixWidth>  
274 - <MatrixHeight>2508</MatrixHeight>  
275 - </TileMatrix>  
276 - <TileMatrix>  
277 - <ows:Identifier>20</ows:Identifier>  
278 - <ScaleDenominator>532.5844503365989</ScaleDenominator>  
279 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
280 - <TileWidth>256</TileWidth>  
281 - <TileHeight>256</TileHeight>  
282 - <MatrixWidth>5283</MatrixWidth>  
283 - <MatrixHeight>5014</MatrixHeight>  
284 - </TileMatrix>  
285 - </TileMatrixSet>  
286 - <TileMatrixSet>  
287 - <ows:Title>Native TiledMapService TileMatrixSet</ows:Title>  
288 - <ows:Abstract>the tile matrix set that has scale values calculated based on the dpi defined by ArcGIS Server tiled map service. The current tile dpi is 96</ows:Abstract>  
289 - <ows:Identifier>nativeTileMatrixSet</ows:Identifier>  
290 - <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4490</ows:SupportedCRS>  
291 - <TileMatrix>  
292 - <ows:Identifier>0</ows:Identifier>  
293 - <ScaleDenominator>5.909951861175001E8</ScaleDenominator>  
294 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
295 - <TileWidth>256</TileWidth>  
296 - <TileHeight>256</TileHeight>  
297 - <MatrixWidth>1</MatrixWidth>  
298 - <MatrixHeight>1</MatrixHeight>  
299 - </TileMatrix>  
300 - <TileMatrix>  
301 - <ows:Identifier>1</ows:Identifier>  
302 - <ScaleDenominator>2.9549759305875003E8</ScaleDenominator>  
303 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
304 - <TileWidth>256</TileWidth>  
305 - <TileHeight>256</TileHeight>  
306 - <MatrixWidth>1</MatrixWidth>  
307 - <MatrixHeight>1</MatrixHeight>  
308 - </TileMatrix>  
309 - <TileMatrix>  
310 - <ows:Identifier>2</ows:Identifier>  
311 - <ScaleDenominator>1.4774879652937502E8</ScaleDenominator>  
312 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
313 - <TileWidth>256</TileWidth>  
314 - <TileHeight>256</TileHeight>  
315 - <MatrixWidth>1</MatrixWidth>  
316 - <MatrixHeight>1</MatrixHeight>  
317 - </TileMatrix>  
318 - <TileMatrix>  
319 - <ows:Identifier>3</ows:Identifier>  
320 - <ScaleDenominator>7.387439826468751E7</ScaleDenominator>  
321 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
322 - <TileWidth>256</TileWidth>  
323 - <TileHeight>256</TileHeight>  
324 - <MatrixWidth>1</MatrixWidth>  
325 - <MatrixHeight>1</MatrixHeight>  
326 - </TileMatrix>  
327 - <TileMatrix>  
328 - <ows:Identifier>4</ows:Identifier>  
329 - <ScaleDenominator>3.6937199132343754E7</ScaleDenominator>  
330 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
331 - <TileWidth>256</TileWidth>  
332 - <TileHeight>256</TileHeight>  
333 - <MatrixWidth>1</MatrixWidth>  
334 - <MatrixHeight>1</MatrixHeight>  
335 - </TileMatrix>  
336 - <TileMatrix>  
337 - <ows:Identifier>5</ows:Identifier>  
338 - <ScaleDenominator>1.8468599566171877E7</ScaleDenominator>  
339 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
340 - <TileWidth>256</TileWidth>  
341 - <TileHeight>256</TileHeight>  
342 - <MatrixWidth>1</MatrixWidth>  
343 - <MatrixHeight>1</MatrixHeight>  
344 - </TileMatrix>  
345 - <TileMatrix>  
346 - <ows:Identifier>6</ows:Identifier>  
347 - <ScaleDenominator>9234299.783085939</ScaleDenominator>  
348 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
349 - <TileWidth>256</TileWidth>  
350 - <TileHeight>256</TileHeight>  
351 - <MatrixWidth>1</MatrixWidth>  
352 - <MatrixHeight>1</MatrixHeight>  
353 - </TileMatrix>  
354 - <TileMatrix>  
355 - <ows:Identifier>7</ows:Identifier>  
356 - <ScaleDenominator>4617149.891542969</ScaleDenominator>  
357 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
358 - <TileWidth>256</TileWidth>  
359 - <TileHeight>256</TileHeight>  
360 - <MatrixWidth>1</MatrixWidth>  
361 - <MatrixHeight>1</MatrixHeight>  
362 - </TileMatrix>  
363 - <TileMatrix>  
364 - <ows:Identifier>8</ows:Identifier>  
365 - <ScaleDenominator>2308574.9457714846</ScaleDenominator>  
366 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
367 - <TileWidth>256</TileWidth>  
368 - <TileHeight>256</TileHeight>  
369 - <MatrixWidth>2</MatrixWidth>  
370 - <MatrixHeight>2</MatrixHeight>  
371 - </TileMatrix>  
372 - <TileMatrix>  
373 - <ows:Identifier>9</ows:Identifier>  
374 - <ScaleDenominator>1154287.4728857423</ScaleDenominator>  
375 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
376 - <TileWidth>256</TileWidth>  
377 - <TileHeight>256</TileHeight>  
378 - <MatrixWidth>3</MatrixWidth>  
379 - <MatrixHeight>3</MatrixHeight>  
380 - </TileMatrix>  
381 - <TileMatrix>  
382 - <ows:Identifier>10</ows:Identifier>  
383 - <ScaleDenominator>577143.7364428712</ScaleDenominator>  
384 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
385 - <TileWidth>256</TileWidth>  
386 - <TileHeight>256</TileHeight>  
387 - <MatrixWidth>6</MatrixWidth>  
388 - <MatrixHeight>6</MatrixHeight>  
389 - </TileMatrix>  
390 - <TileMatrix>  
391 - <ows:Identifier>11</ows:Identifier>  
392 - <ScaleDenominator>288571.8682214356</ScaleDenominator>  
393 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
394 - <TileWidth>256</TileWidth>  
395 - <TileHeight>256</TileHeight>  
396 - <MatrixWidth>11</MatrixWidth>  
397 - <MatrixHeight>11</MatrixHeight>  
398 - </TileMatrix>  
399 - <TileMatrix>  
400 - <ows:Identifier>12</ows:Identifier>  
401 - <ScaleDenominator>144285.9341107178</ScaleDenominator>  
402 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
403 - <TileWidth>256</TileWidth>  
404 - <TileHeight>256</TileHeight>  
405 - <MatrixWidth>21</MatrixWidth>  
406 - <MatrixHeight>20</MatrixHeight>  
407 - </TileMatrix>  
408 - <TileMatrix>  
409 - <ows:Identifier>13</ows:Identifier>  
410 - <ScaleDenominator>72142.9670553589</ScaleDenominator>  
411 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
412 - <TileWidth>256</TileWidth>  
413 - <TileHeight>256</TileHeight>  
414 - <MatrixWidth>42</MatrixWidth>  
415 - <MatrixHeight>40</MatrixHeight>  
416 - </TileMatrix>  
417 - <TileMatrix>  
418 - <ows:Identifier>14</ows:Identifier>  
419 - <ScaleDenominator>36071.48352767945</ScaleDenominator>  
420 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
421 - <TileWidth>256</TileWidth>  
422 - <TileHeight>256</TileHeight>  
423 - <MatrixWidth>83</MatrixWidth>  
424 - <MatrixHeight>80</MatrixHeight>  
425 - </TileMatrix>  
426 - <TileMatrix>  
427 - <ows:Identifier>15</ows:Identifier>  
428 - <ScaleDenominator>18035.741763839724</ScaleDenominator>  
429 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
430 - <TileWidth>256</TileWidth>  
431 - <TileHeight>256</TileHeight>  
432 - <MatrixWidth>166</MatrixWidth>  
433 - <MatrixHeight>158</MatrixHeight>  
434 - </TileMatrix>  
435 - <TileMatrix>  
436 - <ows:Identifier>16</ows:Identifier>  
437 - <ScaleDenominator>9017.870881919862</ScaleDenominator>  
438 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
439 - <TileWidth>256</TileWidth>  
440 - <TileHeight>256</TileHeight>  
441 - <MatrixWidth>331</MatrixWidth>  
442 - <MatrixHeight>314</MatrixHeight>  
443 - </TileMatrix>  
444 - <TileMatrix>  
445 - <ows:Identifier>17</ows:Identifier>  
446 - <ScaleDenominator>4508.935440959931</ScaleDenominator>  
447 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
448 - <TileWidth>256</TileWidth>  
449 - <TileHeight>256</TileHeight>  
450 - <MatrixWidth>661</MatrixWidth>  
451 - <MatrixHeight>627</MatrixHeight>  
452 - </TileMatrix>  
453 - <TileMatrix>  
454 - <ows:Identifier>18</ows:Identifier>  
455 - <ScaleDenominator>2254.4677204799655</ScaleDenominator>  
456 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
457 - <TileWidth>256</TileWidth>  
458 - <TileHeight>256</TileHeight>  
459 - <MatrixWidth>1321</MatrixWidth>  
460 - <MatrixHeight>1254</MatrixHeight>  
461 - </TileMatrix>  
462 - <TileMatrix>  
463 - <ows:Identifier>19</ows:Identifier>  
464 - <ScaleDenominator>1127.2338602399827</ScaleDenominator>  
465 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
466 - <TileWidth>256</TileWidth>  
467 - <TileHeight>256</TileHeight>  
468 - <MatrixWidth>2642</MatrixWidth>  
469 - <MatrixHeight>2508</MatrixHeight>  
470 - </TileMatrix>  
471 - <TileMatrix>  
472 - <ows:Identifier>20</ows:Identifier>  
473 - <ScaleDenominator>563.6169301199914</ScaleDenominator>  
474 - <TopLeftCorner>90.0 -180.0</TopLeftCorner>  
475 - <TileWidth>256</TileWidth>  
476 - <TileHeight>256</TileHeight>  
477 - <MatrixWidth>5283</MatrixWidth>  
478 - <MatrixHeight>5014</MatrixHeight>  
479 - </TileMatrix>  
480 - </TileMatrixSet>  
481 - </Contents>  
482 - <ServiceMetadataURL xlink:href="http://172.26.99.160:8840/API/Image/Capabilities"/>  
483 - </Capabilities>''' 11 + api_name = "影像数据列表"
484 12
485 - r = Response(response=x, status=200, mimetype="application/xml")  
486 - r.headers["Content-Type"] = "text/xml; charset=utf-8"  
487 - return r 13 + def process(self):
488 14
  15 + x = '''<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd" version="1.0.0">
  16 + <!-- Service Identification -->
  17 + <ows:ServiceIdentification>
  18 + <ows:Title>localimage</ows:Title>
  19 + <ows:ServiceType>OGC WMTS</ows:ServiceType>
  20 + <ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
  21 + </ows:ServiceIdentification>
  22 + <!-- Operations Metadata -->
  23 + <ows:OperationsMetadata>
  24 + <ows:Operation name="GetCapabilities">
  25 + <ows:DCP>
  26 + <ows:HTTP>
  27 + <ows:Get xlink:href="http://172.26.99.160:8840/API/Image/Capabilities">
  28 + <ows:Constraint name="GetEncoding">
  29 + <ows:AllowedValues>
  30 + <ows:Value>RESTful</ows:Value>
  31 + </ows:AllowedValues>
  32 + </ows:Constraint>
  33 + </ows:Get>
  34 + <!-- add KVP binding in 10.1 -->
  35 + <ows:Get xlink:href="http://172.26.99.160:8840/API/Image/TileMany?">
  36 + <ows:Constraint name="GetEncoding">
  37 + <ows:AllowedValues>
  38 + <ows:Value>KVP</ows:Value>
  39 + </ows:AllowedValues>
  40 + </ows:Constraint>
  41 + </ows:Get>
  42 + </ows:HTTP>
  43 + </ows:DCP>
  44 + </ows:Operation>
  45 + <ows:Operation name="GetTile">
  46 + <ows:DCP>
  47 + <ows:HTTP>
  48 + <ows:Get xlink:href="http://172.26.99.160:8840/API/Image/TileMany">
  49 + <ows:Constraint name="GetEncoding">
  50 + <ows:AllowedValues>
  51 + <ows:Value>RESTful</ows:Value>
  52 + </ows:AllowedValues>
  53 + </ows:Constraint>
  54 + </ows:Get>
  55 + <ows:Get xlink:href="http://172.26.99.160:8840/API/Image/TileMany?">
  56 + <ows:Constraint name="GetEncoding">
  57 + <ows:AllowedValues>
  58 + <ows:Value>KVP</ows:Value>
  59 + </ows:AllowedValues>
  60 + </ows:Constraint>
  61 + </ows:Get>
  62 + </ows:HTTP>
  63 + </ows:DCP>
  64 + </ows:Operation>
  65 + </ows:OperationsMetadata>
  66 + <Contents>
  67 + <!-- Layer -->
  68 + <Layer>
  69 + <ows:Title>changde</ows:Title>
  70 + <ows:Identifier>changde</ows:Identifier>
  71 + <ows:BoundingBox crs="urn:ogc:def:crs:EPSG::4490">
  72 + <ows:LowerCorner>111.604613312 28.9170588759</ows:LowerCorner>
  73 + <ows:UpperCorner>111.751508603 29.079435995</ows:UpperCorner>
  74 + </ows:BoundingBox>
  75 + <ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
  76 + <ows:LowerCorner>111.604613312 28.9170588759</ows:LowerCorner>
  77 + <ows:UpperCorner>111.751508603 29.079435995</ows:UpperCorner>
  78 + </ows:WGS84BoundingBox>
  79 + <Style isDefault="true">
  80 + <ows:Title>Default Style</ows:Title>
  81 + <ows:Identifier>default</ows:Identifier>
  82 + </Style>
  83 + <Format>image/png</Format>
  84 + <TileMatrixSetLink>
  85 + <TileMatrixSet>default028mm</TileMatrixSet>
  86 + </TileMatrixSetLink>
  87 + <TileMatrixSetLink>
  88 + <TileMatrixSet>nativeTileMatrixSet</TileMatrixSet>
  89 + </TileMatrixSetLink>
  90 + <ResourceURL format="image/png" resourceType="tile" template="http://172.26.99.160:8840/API/Image/TileMany/{TileMatrix}/{TileRow}/{TileCol}?format=image/png"/>
  91 + </Layer>
  92 + <!-- TileMatrixSet -->
  93 + <TileMatrixSet>
  94 + <ows:Title>Default TileMatrix using 0.28mm</ows:Title>
  95 + <ows:Abstract>The tile matrix set that has scale values calculated based on the dpi defined by OGC specification (dpi assumes 0.28mm as the physical distance of a pixel).</ows:Abstract>
  96 + <ows:Identifier>default028mm</ows:Identifier>
  97 + <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4490</ows:SupportedCRS>
  98 + <TileMatrix>
  99 + <ows:Identifier>0</ows:Identifier>
  100 + <ScaleDenominator>5.584552725961496E8</ScaleDenominator>
  101 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  102 + <TileWidth>256</TileWidth>
  103 + <TileHeight>256</TileHeight>
  104 + <MatrixWidth>1</MatrixWidth>
  105 + <MatrixHeight>1</MatrixHeight>
  106 + </TileMatrix>
  107 + <TileMatrix>
  108 + <ows:Identifier>1</ows:Identifier>
  109 + <ScaleDenominator>2.792276362980748E8</ScaleDenominator>
  110 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  111 + <TileWidth>256</TileWidth>
  112 + <TileHeight>256</TileHeight>
  113 + <MatrixWidth>1</MatrixWidth>
  114 + <MatrixHeight>1</MatrixHeight>
  115 + </TileMatrix>
  116 + <TileMatrix>
  117 + <ows:Identifier>2</ows:Identifier>
  118 + <ScaleDenominator>1.396138181490374E8</ScaleDenominator>
  119 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  120 + <TileWidth>256</TileWidth>
  121 + <TileHeight>256</TileHeight>
  122 + <MatrixWidth>1</MatrixWidth>
  123 + <MatrixHeight>1</MatrixHeight>
  124 + </TileMatrix>
  125 + <TileMatrix>
  126 + <ows:Identifier>3</ows:Identifier>
  127 + <ScaleDenominator>6.98069090745187E7</ScaleDenominator>
  128 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  129 + <TileWidth>256</TileWidth>
  130 + <TileHeight>256</TileHeight>
  131 + <MatrixWidth>1</MatrixWidth>
  132 + <MatrixHeight>1</MatrixHeight>
  133 + </TileMatrix>
  134 + <TileMatrix>
  135 + <ows:Identifier>4</ows:Identifier>
  136 + <ScaleDenominator>3.490345453725935E7</ScaleDenominator>
  137 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  138 + <TileWidth>256</TileWidth>
  139 + <TileHeight>256</TileHeight>
  140 + <MatrixWidth>1</MatrixWidth>
  141 + <MatrixHeight>1</MatrixHeight>
  142 + </TileMatrix>
  143 + <TileMatrix>
  144 + <ows:Identifier>5</ows:Identifier>
  145 + <ScaleDenominator>1.7451727268629674E7</ScaleDenominator>
  146 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  147 + <TileWidth>256</TileWidth>
  148 + <TileHeight>256</TileHeight>
  149 + <MatrixWidth>1</MatrixWidth>
  150 + <MatrixHeight>1</MatrixHeight>
  151 + </TileMatrix>
  152 + <TileMatrix>
  153 + <ows:Identifier>6</ows:Identifier>
  154 + <ScaleDenominator>8725863.634314837</ScaleDenominator>
  155 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  156 + <TileWidth>256</TileWidth>
  157 + <TileHeight>256</TileHeight>
  158 + <MatrixWidth>1</MatrixWidth>
  159 + <MatrixHeight>1</MatrixHeight>
  160 + </TileMatrix>
  161 + <TileMatrix>
  162 + <ows:Identifier>7</ows:Identifier>
  163 + <ScaleDenominator>4362931.8171574185</ScaleDenominator>
  164 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  165 + <TileWidth>256</TileWidth>
  166 + <TileHeight>256</TileHeight>
  167 + <MatrixWidth>1</MatrixWidth>
  168 + <MatrixHeight>1</MatrixHeight>
  169 + </TileMatrix>
  170 + <TileMatrix>
  171 + <ows:Identifier>8</ows:Identifier>
  172 + <ScaleDenominator>2181465.9085787092</ScaleDenominator>
  173 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  174 + <TileWidth>256</TileWidth>
  175 + <TileHeight>256</TileHeight>
  176 + <MatrixWidth>2</MatrixWidth>
  177 + <MatrixHeight>2</MatrixHeight>
  178 + </TileMatrix>
  179 + <TileMatrix>
  180 + <ows:Identifier>9</ows:Identifier>
  181 + <ScaleDenominator>1090732.9542893546</ScaleDenominator>
  182 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  183 + <TileWidth>256</TileWidth>
  184 + <TileHeight>256</TileHeight>
  185 + <MatrixWidth>3</MatrixWidth>
  186 + <MatrixHeight>3</MatrixHeight>
  187 + </TileMatrix>
  188 + <TileMatrix>
  189 + <ows:Identifier>10</ows:Identifier>
  190 + <ScaleDenominator>545366.4771446773</ScaleDenominator>
  191 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  192 + <TileWidth>256</TileWidth>
  193 + <TileHeight>256</TileHeight>
  194 + <MatrixWidth>6</MatrixWidth>
  195 + <MatrixHeight>6</MatrixHeight>
  196 + </TileMatrix>
  197 + <TileMatrix>
  198 + <ows:Identifier>11</ows:Identifier>
  199 + <ScaleDenominator>272683.23857233865</ScaleDenominator>
  200 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  201 + <TileWidth>256</TileWidth>
  202 + <TileHeight>256</TileHeight>
  203 + <MatrixWidth>11</MatrixWidth>
  204 + <MatrixHeight>11</MatrixHeight>
  205 + </TileMatrix>
  206 + <TileMatrix>
  207 + <ows:Identifier>12</ows:Identifier>
  208 + <ScaleDenominator>136341.61928616933</ScaleDenominator>
  209 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  210 + <TileWidth>256</TileWidth>
  211 + <TileHeight>256</TileHeight>
  212 + <MatrixWidth>21</MatrixWidth>
  213 + <MatrixHeight>20</MatrixHeight>
  214 + </TileMatrix>
  215 + <TileMatrix>
  216 + <ows:Identifier>13</ows:Identifier>
  217 + <ScaleDenominator>68170.80964308466</ScaleDenominator>
  218 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  219 + <TileWidth>256</TileWidth>
  220 + <TileHeight>256</TileHeight>
  221 + <MatrixWidth>42</MatrixWidth>
  222 + <MatrixHeight>40</MatrixHeight>
  223 + </TileMatrix>
  224 + <TileMatrix>
  225 + <ows:Identifier>14</ows:Identifier>
  226 + <ScaleDenominator>34085.40482154233</ScaleDenominator>
  227 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  228 + <TileWidth>256</TileWidth>
  229 + <TileHeight>256</TileHeight>
  230 + <MatrixWidth>83</MatrixWidth>
  231 + <MatrixHeight>80</MatrixHeight>
  232 + </TileMatrix>
  233 + <TileMatrix>
  234 + <ows:Identifier>15</ows:Identifier>
  235 + <ScaleDenominator>17042.702410771166</ScaleDenominator>
  236 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  237 + <TileWidth>256</TileWidth>
  238 + <TileHeight>256</TileHeight>
  239 + <MatrixWidth>166</MatrixWidth>
  240 + <MatrixHeight>158</MatrixHeight>
  241 + </TileMatrix>
  242 + <TileMatrix>
  243 + <ows:Identifier>16</ows:Identifier>
  244 + <ScaleDenominator>8521.351205385583</ScaleDenominator>
  245 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  246 + <TileWidth>256</TileWidth>
  247 + <TileHeight>256</TileHeight>
  248 + <MatrixWidth>331</MatrixWidth>
  249 + <MatrixHeight>314</MatrixHeight>
  250 + </TileMatrix>
  251 + <TileMatrix>
  252 + <ows:Identifier>17</ows:Identifier>
  253 + <ScaleDenominator>4260.6756026927915</ScaleDenominator>
  254 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  255 + <TileWidth>256</TileWidth>
  256 + <TileHeight>256</TileHeight>
  257 + <MatrixWidth>661</MatrixWidth>
  258 + <MatrixHeight>627</MatrixHeight>
  259 + </TileMatrix>
  260 + <TileMatrix>
  261 + <ows:Identifier>18</ows:Identifier>
  262 + <ScaleDenominator>2130.3378013463957</ScaleDenominator>
  263 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  264 + <TileWidth>256</TileWidth>
  265 + <TileHeight>256</TileHeight>
  266 + <MatrixWidth>1321</MatrixWidth>
  267 + <MatrixHeight>1254</MatrixHeight>
  268 + </TileMatrix>
  269 + <TileMatrix>
  270 + <ows:Identifier>19</ows:Identifier>
  271 + <ScaleDenominator>1065.1689006731979</ScaleDenominator>
  272 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  273 + <TileWidth>256</TileWidth>
  274 + <TileHeight>256</TileHeight>
  275 + <MatrixWidth>2642</MatrixWidth>
  276 + <MatrixHeight>2508</MatrixHeight>
  277 + </TileMatrix>
  278 + <TileMatrix>
  279 + <ows:Identifier>20</ows:Identifier>
  280 + <ScaleDenominator>532.5844503365989</ScaleDenominator>
  281 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  282 + <TileWidth>256</TileWidth>
  283 + <TileHeight>256</TileHeight>
  284 + <MatrixWidth>5283</MatrixWidth>
  285 + <MatrixHeight>5014</MatrixHeight>
  286 + </TileMatrix>
  287 + </TileMatrixSet>
  288 + <TileMatrixSet>
  289 + <ows:Title>Native TiledMapService TileMatrixSet</ows:Title>
  290 + <ows:Abstract>the tile matrix set that has scale values calculated based on the dpi defined by ArcGIS Server tiled map service. The current tile dpi is 96</ows:Abstract>
  291 + <ows:Identifier>nativeTileMatrixSet</ows:Identifier>
  292 + <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4490</ows:SupportedCRS>
  293 + <TileMatrix>
  294 + <ows:Identifier>0</ows:Identifier>
  295 + <ScaleDenominator>5.909951861175001E8</ScaleDenominator>
  296 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  297 + <TileWidth>256</TileWidth>
  298 + <TileHeight>256</TileHeight>
  299 + <MatrixWidth>1</MatrixWidth>
  300 + <MatrixHeight>1</MatrixHeight>
  301 + </TileMatrix>
  302 + <TileMatrix>
  303 + <ows:Identifier>1</ows:Identifier>
  304 + <ScaleDenominator>2.9549759305875003E8</ScaleDenominator>
  305 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  306 + <TileWidth>256</TileWidth>
  307 + <TileHeight>256</TileHeight>
  308 + <MatrixWidth>1</MatrixWidth>
  309 + <MatrixHeight>1</MatrixHeight>
  310 + </TileMatrix>
  311 + <TileMatrix>
  312 + <ows:Identifier>2</ows:Identifier>
  313 + <ScaleDenominator>1.4774879652937502E8</ScaleDenominator>
  314 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  315 + <TileWidth>256</TileWidth>
  316 + <TileHeight>256</TileHeight>
  317 + <MatrixWidth>1</MatrixWidth>
  318 + <MatrixHeight>1</MatrixHeight>
  319 + </TileMatrix>
  320 + <TileMatrix>
  321 + <ows:Identifier>3</ows:Identifier>
  322 + <ScaleDenominator>7.387439826468751E7</ScaleDenominator>
  323 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  324 + <TileWidth>256</TileWidth>
  325 + <TileHeight>256</TileHeight>
  326 + <MatrixWidth>1</MatrixWidth>
  327 + <MatrixHeight>1</MatrixHeight>
  328 + </TileMatrix>
  329 + <TileMatrix>
  330 + <ows:Identifier>4</ows:Identifier>
  331 + <ScaleDenominator>3.6937199132343754E7</ScaleDenominator>
  332 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  333 + <TileWidth>256</TileWidth>
  334 + <TileHeight>256</TileHeight>
  335 + <MatrixWidth>1</MatrixWidth>
  336 + <MatrixHeight>1</MatrixHeight>
  337 + </TileMatrix>
  338 + <TileMatrix>
  339 + <ows:Identifier>5</ows:Identifier>
  340 + <ScaleDenominator>1.8468599566171877E7</ScaleDenominator>
  341 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  342 + <TileWidth>256</TileWidth>
  343 + <TileHeight>256</TileHeight>
  344 + <MatrixWidth>1</MatrixWidth>
  345 + <MatrixHeight>1</MatrixHeight>
  346 + </TileMatrix>
  347 + <TileMatrix>
  348 + <ows:Identifier>6</ows:Identifier>
  349 + <ScaleDenominator>9234299.783085939</ScaleDenominator>
  350 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  351 + <TileWidth>256</TileWidth>
  352 + <TileHeight>256</TileHeight>
  353 + <MatrixWidth>1</MatrixWidth>
  354 + <MatrixHeight>1</MatrixHeight>
  355 + </TileMatrix>
  356 + <TileMatrix>
  357 + <ows:Identifier>7</ows:Identifier>
  358 + <ScaleDenominator>4617149.891542969</ScaleDenominator>
  359 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  360 + <TileWidth>256</TileWidth>
  361 + <TileHeight>256</TileHeight>
  362 + <MatrixWidth>1</MatrixWidth>
  363 + <MatrixHeight>1</MatrixHeight>
  364 + </TileMatrix>
  365 + <TileMatrix>
  366 + <ows:Identifier>8</ows:Identifier>
  367 + <ScaleDenominator>2308574.9457714846</ScaleDenominator>
  368 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  369 + <TileWidth>256</TileWidth>
  370 + <TileHeight>256</TileHeight>
  371 + <MatrixWidth>2</MatrixWidth>
  372 + <MatrixHeight>2</MatrixHeight>
  373 + </TileMatrix>
  374 + <TileMatrix>
  375 + <ows:Identifier>9</ows:Identifier>
  376 + <ScaleDenominator>1154287.4728857423</ScaleDenominator>
  377 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  378 + <TileWidth>256</TileWidth>
  379 + <TileHeight>256</TileHeight>
  380 + <MatrixWidth>3</MatrixWidth>
  381 + <MatrixHeight>3</MatrixHeight>
  382 + </TileMatrix>
  383 + <TileMatrix>
  384 + <ows:Identifier>10</ows:Identifier>
  385 + <ScaleDenominator>577143.7364428712</ScaleDenominator>
  386 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  387 + <TileWidth>256</TileWidth>
  388 + <TileHeight>256</TileHeight>
  389 + <MatrixWidth>6</MatrixWidth>
  390 + <MatrixHeight>6</MatrixHeight>
  391 + </TileMatrix>
  392 + <TileMatrix>
  393 + <ows:Identifier>11</ows:Identifier>
  394 + <ScaleDenominator>288571.8682214356</ScaleDenominator>
  395 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  396 + <TileWidth>256</TileWidth>
  397 + <TileHeight>256</TileHeight>
  398 + <MatrixWidth>11</MatrixWidth>
  399 + <MatrixHeight>11</MatrixHeight>
  400 + </TileMatrix>
  401 + <TileMatrix>
  402 + <ows:Identifier>12</ows:Identifier>
  403 + <ScaleDenominator>144285.9341107178</ScaleDenominator>
  404 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  405 + <TileWidth>256</TileWidth>
  406 + <TileHeight>256</TileHeight>
  407 + <MatrixWidth>21</MatrixWidth>
  408 + <MatrixHeight>20</MatrixHeight>
  409 + </TileMatrix>
  410 + <TileMatrix>
  411 + <ows:Identifier>13</ows:Identifier>
  412 + <ScaleDenominator>72142.9670553589</ScaleDenominator>
  413 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  414 + <TileWidth>256</TileWidth>
  415 + <TileHeight>256</TileHeight>
  416 + <MatrixWidth>42</MatrixWidth>
  417 + <MatrixHeight>40</MatrixHeight>
  418 + </TileMatrix>
  419 + <TileMatrix>
  420 + <ows:Identifier>14</ows:Identifier>
  421 + <ScaleDenominator>36071.48352767945</ScaleDenominator>
  422 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  423 + <TileWidth>256</TileWidth>
  424 + <TileHeight>256</TileHeight>
  425 + <MatrixWidth>83</MatrixWidth>
  426 + <MatrixHeight>80</MatrixHeight>
  427 + </TileMatrix>
  428 + <TileMatrix>
  429 + <ows:Identifier>15</ows:Identifier>
  430 + <ScaleDenominator>18035.741763839724</ScaleDenominator>
  431 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  432 + <TileWidth>256</TileWidth>
  433 + <TileHeight>256</TileHeight>
  434 + <MatrixWidth>166</MatrixWidth>
  435 + <MatrixHeight>158</MatrixHeight>
  436 + </TileMatrix>
  437 + <TileMatrix>
  438 + <ows:Identifier>16</ows:Identifier>
  439 + <ScaleDenominator>9017.870881919862</ScaleDenominator>
  440 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  441 + <TileWidth>256</TileWidth>
  442 + <TileHeight>256</TileHeight>
  443 + <MatrixWidth>331</MatrixWidth>
  444 + <MatrixHeight>314</MatrixHeight>
  445 + </TileMatrix>
  446 + <TileMatrix>
  447 + <ows:Identifier>17</ows:Identifier>
  448 + <ScaleDenominator>4508.935440959931</ScaleDenominator>
  449 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  450 + <TileWidth>256</TileWidth>
  451 + <TileHeight>256</TileHeight>
  452 + <MatrixWidth>661</MatrixWidth>
  453 + <MatrixHeight>627</MatrixHeight>
  454 + </TileMatrix>
  455 + <TileMatrix>
  456 + <ows:Identifier>18</ows:Identifier>
  457 + <ScaleDenominator>2254.4677204799655</ScaleDenominator>
  458 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  459 + <TileWidth>256</TileWidth>
  460 + <TileHeight>256</TileHeight>
  461 + <MatrixWidth>1321</MatrixWidth>
  462 + <MatrixHeight>1254</MatrixHeight>
  463 + </TileMatrix>
  464 + <TileMatrix>
  465 + <ows:Identifier>19</ows:Identifier>
  466 + <ScaleDenominator>1127.2338602399827</ScaleDenominator>
  467 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  468 + <TileWidth>256</TileWidth>
  469 + <TileHeight>256</TileHeight>
  470 + <MatrixWidth>2642</MatrixWidth>
  471 + <MatrixHeight>2508</MatrixHeight>
  472 + </TileMatrix>
  473 + <TileMatrix>
  474 + <ows:Identifier>20</ows:Identifier>
  475 + <ScaleDenominator>563.6169301199914</ScaleDenominator>
  476 + <TopLeftCorner>90.0 -180.0</TopLeftCorner>
  477 + <TileWidth>256</TileWidth>
  478 + <TileHeight>256</TileHeight>
  479 + <MatrixWidth>5283</MatrixWidth>
  480 + <MatrixHeight>5014</MatrixHeight>
  481 + </TileMatrix>
  482 + </TileMatrixSet>
  483 + </Contents>
  484 + <ServiceMetadataURL xlink:href="http://172.26.99.160:8840/API/Image/Capabilities"/>
  485 + </Capabilities>'''
489 486
  487 + r = Response(response=x, status=200, mimetype="application/xml")
  488 + r.headers["Content-Type"] = "text/xml; charset=utf-8"
  489 + return r
490 490
491 491
492 -api_doc={  
493 -"tags":["影像接口"],  
494 -"parameters":[  
495 492
496 -],  
497 -"responses":{  
498 - 200:{  
499 - "schema":{  
500 - "properties":{ 493 +
  494 + api_doc = {
  495 + "tags": ["影像接口"],
  496 + "parameters": [
  497 + {"name": "guid",
  498 + "in": "formData",
  499 + "type": "string",
  500 + "description": "服务guid"},
  501 + ],
  502 + "responses": {
  503 + 200: {
  504 + "schema": {
  505 + "properties": {
  506 + }
501 } 507 }
502 } 508 }
503 - }  
504 } 509 }
505 } 510 }
@@ -3,24 +3,17 @@ @@ -3,24 +3,17 @@
3 #createtime: 2021/7/19 3 #createtime: 2021/7/19
4 #email: nheweijun@sina.com 4 #email: nheweijun@sina.com
5 5
6 -from osgeo.ogr import *  
7 -from osgeo import gdal,ogr,osr  
8 -from osgeo.gdal import Dataset,Band  
9 -from app.util.component.ApiTemplate import ApiTemplate  
10 -  
11 6
  7 +from app.util.component.ApiTemplate import ApiTemplate
12 from thrift.transport import TSocket 8 from thrift.transport import TSocket
13 from thrift.transport import TTransport 9 from thrift.transport import TTransport
14 from thrift.protocol import TBinaryProtocol 10 from thrift.protocol import TBinaryProtocol
15 -import numpy  
16 -import cv2  
17 import json 11 import json
18 -from .models import Image  
19 from app.modules.image.ImageDataService import ImageDataService 12 from app.modules.image.ImageDataService import ImageDataService
20 -from app.models import db  
21 -import uuid 13 +from app.util.component.FileProcess import FileProcess
  14 +import datetime
  15 +
22 import os 16 import os
23 -import time  
24 class Api(ApiTemplate): 17 class Api(ApiTemplate):
25 18
26 api_name = "影像数据列表" 19 api_name = "影像数据列表"
@@ -35,22 +28,50 @@ class Api(ApiTemplate): @@ -35,22 +28,50 @@ class Api(ApiTemplate):
35 data_server = self.para.get("data_server") 28 data_server = self.para.get("data_server")
36 29
37 path = self.para.get("path") 30 path = self.para.get("path")
38 - host = data_server.split(":")[0]  
39 - port = int(data_server.split(":")[1])  
40 -  
41 - # if data_server.__eq__("localhost"):  
42 - # pass  
43 - # else:  
44 - t1 =time.time()  
45 - transport = TSocket.TSocket(host, port)  
46 - transport = TTransport.TBufferedTransport(transport)  
47 - protocol = TBinaryProtocol.TBinaryProtocol(transport)  
48 -  
49 - client = ImageDataService.Client(protocol)  
50 - transport.open()  
51 - print(time.time()-t1)  
52 - info= json.loads(client.getImageList(path))  
53 - res["data"] = info 31 +
  32 +
  33 + if data_server.__eq__("本地服务器"):
  34 + project_path = (os.path.dirname(os.path.abspath(__file__)))
  35 +
  36 + base_path = os.path.join(project_path, "data")
  37 + if path:
  38 + base_path = os.path.normpath(path)
  39 +
  40 + data_list: list = []
  41 + for f in os.listdir(base_path):
  42 +
  43 + file_path = os.path.normpath(os.path.join(base_path, f))
  44 + file_size = FileProcess.get_file_size(file_path)
  45 +
  46 + fctime = datetime.datetime.fromtimestamp(os.path.getctime(file_path)).strftime('%Y-%m-%d %H:%M:%S')
  47 +
  48 + file_info = {"name": f, "path": file_path, "size": file_size, "create_time": fctime}
  49 +
  50 + if file_path.lower().endswith("tiff") or file_path.lower().endswith("tif"):
  51 + file_info["type"] = "tif"
  52 + data_list.append(file_info)
  53 + elif file_path.lower().endswith("img"):
  54 + file_info["type"] = "img"
  55 + data_list.append(file_info)
  56 + elif os.path.isdir(file_path):
  57 + file_info["type"] = "dir"
  58 + data_list.append(file_info)
  59 + data_list_sorted = sorted(data_list, key=lambda x: x["name"])
  60 + res["data"] = data_list_sorted
  61 +
  62 + else:
  63 + host = data_server.split(":")[0]
  64 + port = int(data_server.split(":")[1])
  65 +
  66 + transport = TSocket.TSocket(host, port)
  67 + transport = TTransport.TBufferedTransport(transport)
  68 + protocol = TBinaryProtocol.TBinaryProtocol(transport)
  69 + client = ImageDataService.Client(protocol)
  70 + transport.open()
  71 + info= json.loads(client.getImageList(path))
  72 + transport.close()
  73 + res["data"] = info
  74 +
54 res["result"] = True 75 res["result"] = True
55 76
56 except Exception as e: 77 except Exception as e:
@@ -8,6 +8,7 @@ from app.util.component.ApiTemplate import ApiTemplate @@ -8,6 +8,7 @@ from app.util.component.ApiTemplate import ApiTemplate
8 from app.util.component.ModelVisitor import ModelVisitor 8 from app.util.component.ModelVisitor import ModelVisitor
9 9
10 from app.modules.image.models import Image 10 from app.modules.image.models import Image
  11 +
11 class Api(ApiTemplate): 12 class Api(ApiTemplate):
12 13
13 api_name = "影像数据List" 14 api_name = "影像数据List"
@@ -17,6 +18,13 @@ class Api(ApiTemplate): @@ -17,6 +18,13 @@ class Api(ApiTemplate):
17 # 返回结果 18 # 返回结果
18 res = {} 19 res = {}
19 try: 20 try:
  21 + page_index = int(self.para.get("page_index", "0"))
  22 + page_size = int(self.para.get("page_size", "10"))
  23 +
  24 + alias = self.para.get("alias")
  25 + name = self.para.get("name")
  26 +
  27 +
20 images = Image.query.all() 28 images = Image.query.all()
21 res["data"] = ModelVisitor.objects_to_jsonarray(images) 29 res["data"] = ModelVisitor.objects_to_jsonarray(images)
22 res["result"] = True 30 res["result"] = True
@@ -34,49 +34,77 @@ class Api(ApiTemplate): @@ -34,49 +34,77 @@ class Api(ApiTemplate):
34 data_server = self.para.get("data_server") 34 data_server = self.para.get("data_server")
35 35
36 path = self.para.get("path") 36 path = self.para.get("path")
37 - host = data_server.split(":")[0]  
38 - port = int(data_server.split(":")[1])  
39 37
40 - if host.__eq__("localhost"):  
41 - pass 38 +
  39 + if data_server.__eq__("本地服务器"):
  40 + host = data_server
  41 + port = 0
  42 +
  43 + image: Dataset = gdal.Open(path, 0)
  44 + geo = image.GetGeoTransform()
  45 +
  46 + origin = osr.SpatialReference()
  47 + origin.ImportFromWkt(image.GetProjection())
  48 + band_count = image.RasterCount
  49 + band: Band = image.GetRasterBand(1)
  50 + count = band.GetOverviewCount()
  51 + nodatavalue = band.GetNoDataValue()
  52 + left_top = (geo[0], geo[3])
  53 +
  54 + right_buttom = (geo[0] + geo[1] * image.RasterXSize, geo[3] + geo[5] * image.RasterYSize)
  55 + origin_extent = [left_top[0], right_buttom[0], right_buttom[1], left_top[1]]
  56 +
  57 + info = {"band_count": band_count, "overview_count": count,
  58 + "xy_size": [image.RasterXSize, image.RasterYSize]
  59 + , "origin_extent": origin_extent, "null_value": nodatavalue}
  60 +
  61 + del image
  62 +
42 else: 63 else:
  64 + host = data_server.split(":")[0]
  65 + port = int(data_server.split(":")[1])
  66 +
43 transport = TSocket.TSocket(host, port) 67 transport = TSocket.TSocket(host, port)
44 transport = TTransport.TBufferedTransport(transport) 68 transport = TTransport.TBufferedTransport(transport)
45 protocol = TBinaryProtocol.TBinaryProtocol(transport) 69 protocol = TBinaryProtocol.TBinaryProtocol(transport)
46 -  
47 client = ImageDataService.Client(protocol) 70 client = ImageDataService.Client(protocol)
48 -  
49 transport.open() 71 transport.open()
50 -  
51 info= json.loads(client.getInfo(path)) 72 info= json.loads(client.getInfo(path))
  73 + transport.close()
52 74
53 - # 影像空间范围  
54 - if not info["origin_extent"]:  
55 - if not self.para.get("extent"):  
56 - res["result"] = False  
57 - res["msg"] = "数据解析范围失败,请手动输入范围"  
58 - return res  
59 - else :  
60 - origin_extent=json.loads(self.para.get("extent"))  
61 - else:  
62 - origin_extent = info["origin_extent"] 75 + # 影像空间范围
  76 + if not info["origin_extent"]:
  77 + if not self.para.get("extent"):
  78 + res["result"] = False
  79 + res["msg"] = "数据解析范围失败,请手动输入范围"
  80 + return res
  81 + else :
  82 + origin_extent=json.loads(self.para.get("extent"))
  83 + else:
  84 + origin_extent = info["origin_extent"]
  85 +
  86 +
  87 + guid = uuid.uuid1().__str__()
  88 +
  89 + image = Image(guid= guid,
  90 + overview=info["overview_count"],
  91 + raster_x_size=info["xy_size"][0],
  92 + raster_y_size=info["xy_size"][1],
  93 + name=os.path.basename(path),
  94 + alias=self.para.get("alias"),
  95 + extent=json.dumps(origin_extent),
  96 + null_value=info["null_value"],
  97 + host=host,
  98 + port=port,
  99 + # path=os.path.normpath(path)
  100 + path = path
  101 + )
  102 +
  103 + db.session.add(image)
  104 + db.session.commit()
  105 + res["data"] = guid
  106 + res["result"] = True
63 107
64 - transport.close()  
65 - guid = uuid.uuid1().__str__()  
66 - image = Image(guid= guid,  
67 - overview=info["overview_count"],  
68 - raster_x_size=info["xy_size"][0],  
69 - raster_y_size=info["xy_size"][1],  
70 - name=os.path.basename(path),  
71 - alias=self.para.get("alias"),  
72 - extent=origin_extent,  
73 - null_value=info["null_value"]  
74 -  
75 - )  
76 - db.session.add(image)  
77 - db.session.commit()  
78 - res["data"] = guid  
79 - res["result"] = True  
80 except Exception as e: 108 except Exception as e:
81 raise e 109 raise e
82 110
@@ -25,6 +25,7 @@ class Api(ApiTemplate): @@ -25,6 +25,7 @@ class Api(ApiTemplate):
25 if not zoo.connected: 25 if not zoo.connected:
26 zoo.start() 26 zoo.start()
27 res["data"] = zoo.get_children("/rpc") 27 res["data"] = zoo.get_children("/rpc")
  28 + res["data"].append("本地服务器")
28 res["result"] = True 29 res["result"] = True
29 except Exception as e: 30 except Exception as e:
30 raise e 31 raise e
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/7/19
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.util.component.ApiTemplate import ApiTemplate
  8 +from app.util.component.ModelVisitor import ModelVisitor
  9 +from app.modules.image.models import ImageService
  10 +
  11 +
  12 +class Api(ApiTemplate):
  13 +
  14 +
  15 +
  16 + api_name = "注册影像服务"
  17 +
  18 +
  19 +
  20 +
  21 + def process(self):
  22 +
  23 +
  24 +
  25 + # 返回结果
  26 + res = {}
  27 +
  28 + try:
  29 + page_index = int(self.para.get("page_index", "0"))
  30 + page_size = int(self.para.get("page_size", "10"))
  31 +
  32 + alias = self.para.get("alias")
  33 + name = self.para.get("name")
  34 +
  35 +
  36 + image_services = ImageService.query.all()
  37 +
  38 + res["data"] = ModelVisitor.objects_to_jsonarray(image_services)
  39 + res["result"] = True
  40 +
  41 +
  42 + except Exception as e:
  43 + raise e
  44 +
  45 + return res
  46 +
  47 + api_doc = {
  48 + "tags": ["影像接口"],
  49 + "parameters": [
  50 + ],
  51 + "responses": {
  52 + 200: {
  53 + "schema": {
  54 + "properties": {
  55 + }
  56 + }
  57 + }
  58 + }
  59 + }
@@ -3,13 +3,14 @@ @@ -3,13 +3,14 @@
3 #createtime: 2021/7/19 3 #createtime: 2021/7/19
4 #email: nheweijun@sina.com 4 #email: nheweijun@sina.com
5 5
6 -from osgeo.ogr import *  
7 -from osgeo import gdal,ogr,osr  
8 -from osgeo.gdal import Dataset,Band 6 +from app.modules.image.models import ImageService,Image
  7 +from app.models import db
9 from app.util.component.ApiTemplate import ApiTemplate 8 from app.util.component.ApiTemplate import ApiTemplate
10 import uuid 9 import uuid
11 -  
12 - 10 +from app.util.component.SliceScheme import SliceScheme
  11 +from app.util.component.FileProcess import FileProcess
  12 +import os
  13 +import json
13 class Api(ApiTemplate): 14 class Api(ApiTemplate):
14 15
15 api_name = "注册影像服务" 16 api_name = "注册影像服务"
@@ -27,6 +28,30 @@ class Api(ApiTemplate): @@ -27,6 +28,30 @@ class Api(ApiTemplate):
27 service_guid = uuid.uuid1().__str__() 28 service_guid = uuid.uuid1().__str__()
28 29
29 30
  31 + parent = os.path.dirname(os.path.realpath(__file__))
  32 + dir_path, store_file = FileProcess.save(parent)
  33 + scheme = SliceScheme(store_file).parameter
  34 +
  35 + service = ImageService(guid=service_guid, name=name, slice_scheme=json.dumps(scheme))
  36 + service_exetent = []
  37 +
  38 + for g in guids:
  39 + image = Image.query.filter_by(guid=g).one_or_none()
  40 + if image:
  41 + image_extent = json.loads(image.extent)
  42 + if not service_exetent:
  43 + service_exetent = image_extent
  44 + else:
  45 + service_exetent[0] = min(image_extent[0],service_exetent[0])
  46 + service_exetent[1] = min(image_extent[1], service_exetent[1])
  47 + service_exetent[2] = max(image_extent[2], service_exetent[2])
  48 + service_exetent[3] = max(image_extent[3], service_exetent[3])
  49 + service.images.append(image)
  50 + service.extent = json.dumps(service_exetent)
  51 + db.session.add(service)
  52 + db.session.commit()
  53 + res["data"] = service_guid
  54 + res["result"] = True
30 except Exception as e: 55 except Exception as e:
31 raise e 56 raise e
32 57
@@ -38,7 +63,11 @@ class Api(ApiTemplate): @@ -38,7 +63,11 @@ class Api(ApiTemplate):
38 {"name": "guids", 63 {"name": "guids",
39 "in": "formData", 64 "in": "formData",
40 "type": "string", 65 "type": "string",
41 - "description": "影像guids,以英文逗号相隔"} 66 + "description": "影像guids,以英文逗号相隔"},
  67 + {"name": "file",
  68 + "in": "formData",
  69 + "type": "file",
  70 + "description": "切片方案"},
42 ], 71 ],
43 "responses": { 72 "responses": {
44 200: { 73 200: {
@@ -13,281 +13,320 @@ from flask import Response @@ -13,281 +13,320 @@ from flask import Response
13 import io 13 import io
14 import os 14 import os
15 from PIL import Image 15 from PIL import Image
16 -from app.util.slice_scheme import slice_scheme 16 +
17 import time 17 import time
18 import cv2 18 import cv2
19 -from .image_tile_center import create_by_opencv  
20 -def api(level,row,col):  
21 - result = {}  
22 - parameter: dict = get_parameter()  
23 -  
24 -  
25 - try:  
26 -  
27 - bands = [1, 2, 3]  
28 -  
29 - image_list=[  
30 - {"origin_extent":[111.604613312, 29.0171545762, 111.653989358, 29.0531633509],  
31 - "path" : os.path.join(os.path.dirname(__file__), "data", "江南_03.tif"),  
32 - "xysize":[47646,28201],  
33 - "max_level":7},  
34 -  
35 - {"origin_extent": [111.705644552, 28.9864085959, 111.737115887, 29.079435995],  
36 - "path": os.path.join(os.path.dirname(__file__), "data", "江南_01.tif"),  
37 - "xysize":[30116, 73219],  
38 - "max_level":8},  
39 -  
40 - {"origin_extent": [111.639350712, 28.9170588759, 111.751508603, 29.032941696],  
41 - "path": os.path.join(os.path.dirname(__file__), "data", "江南_02.tif"),  
42 - "xysize": [108488, 90777],  
43 - "max_level": 9}  
44 - ]  
45 -  
46 -  
47 -  
48 - slice_para = {'rows': 256.0, 'cols': 256.0, 'x': -180.0, 'y': 90.0, 'dpi': 96.0,  
49 - '0': {'scale': 590995186.11750006, 'resolution': 1.4062500000000004},  
50 - '1': {'scale': 295497593.05875003, 'resolution': 0.7031250000000002},  
51 - '2': {'scale': 147748796.52937502, 'resolution': 0.3515625000000001},  
52 - '3': {'scale': 73874398.26468751, 'resolution': 0.17578125000000006},  
53 - '4': {'scale': 36937199.132343754, 'resolution': 0.08789062500000003},  
54 - '5': {'scale': 18468599.566171877, 'resolution': 0.043945312500000014},  
55 - '6': {'scale': 9234299.783085939, 'resolution': 0.021972656250000007},  
56 - '7': {'scale': 4617149.891542969, 'resolution': 0.010986328125000003},  
57 - '8': {'scale': 2308574.9457714846, 'resolution': 0.005493164062500002},  
58 - '9': {'scale': 1154287.4728857423, 'resolution': 0.002746582031250001},  
59 - '10': {'scale': 577143.7364428712, 'resolution': 0.0013732910156250004},  
60 - '11': {'scale': 288571.8682214356, 'resolution': 0.0006866455078125002},  
61 - '12': {'scale': 144285.9341107178, 'resolution': 0.0003433227539062501},  
62 - '13': {'scale': 72142.9670553589, 'resolution': 0.00017166137695312505},  
63 - '14': {'scale': 36071.48352767945, 'resolution': 8.583068847656253e-05},  
64 - '15': {'scale': 18035.741763839724, 'resolution': 4.2915344238281264e-05},  
65 - '16': {'scale': 9017.870881919862, 'resolution': 2.1457672119140632e-05},  
66 - '17': {'scale': 4508.935440959931, 'resolution': 1.0728836059570316e-05},  
67 - '18': {'scale': 2254.4677204799655, 'resolution': 5.364418029785158e-06},  
68 - '19': {'scale': 1127.2338602399827, 'resolution': 2.682209014892579e-06},  
69 - '20': {'scale': 563.6169301199914, 'resolution': 1.3411045074462895e-06}}  
70 -  
71 - if parameter.get("leaflet"):  
72 - slice_para = {'rows': 256.0, 'cols': 256.0, 'x': -180.0, 'y': 90.0, 'dpi': 96.0,  
73 - '0': {'scale': 295497593.05875003, 'resolution': 0.7031250000000002},  
74 - '1': {'scale': 147748796.52937502, 'resolution': 0.3515625000000001},  
75 - '2': {'scale': 73874398.26468751, 'resolution': 0.17578125000000006},  
76 - '3': {'scale': 36937199.132343754, 'resolution': 0.08789062500000003},  
77 - '4': {'scale': 18468599.566171877, 'resolution': 0.043945312500000014},  
78 - '5': {'scale': 9234299.783085939, 'resolution': 0.021972656250000007},  
79 - '6': {'scale': 4617149.891542969, 'resolution': 0.010986328125000003},  
80 - '7': {'scale': 2308574.9457714846, 'resolution': 0.005493164062500002},  
81 - '8': {'scale': 1154287.4728857423, 'resolution': 0.002746582031250001},  
82 - '9': {'scale': 577143.7364428712, 'resolution': 0.0013732910156250004},  
83 - '10': {'scale': 288571.8682214356, 'resolution': 0.0006866455078125002},  
84 - '11': {'scale': 144285.9341107178, 'resolution': 0.0003433227539062501},  
85 - '12': {'scale': 72142.9670553589, 'resolution': 0.00017166137695312505},  
86 - '13': {'scale': 36071.48352767945, 'resolution': 8.583068847656253e-05},  
87 - '14': {'scale': 18035.741763839724, 'resolution': 4.2915344238281264e-05},  
88 - '15': {'scale': 9017.870881919862, 'resolution': 2.1457672119140632e-05},  
89 - '16': {'scale': 4508.935440959931, 'resolution': 1.0728836059570316e-05},  
90 - '17': {'scale': 2254.4677204799655, 'resolution': 5.364418029785158e-06},  
91 - '18': {'scale': 1127.2338602399827, 'resolution': 2.682209014892579e-06},  
92 - '19': {'scale': 563.6169301199914, 'resolution': 1.3411045074462895e-06}}  
93 -  
94 - # 转换参数  
95 - new_para ={}  
96 - for key in parameter.keys():  
97 - new_para[key.lower()] = parameter[key]  
98 - parameter=new_para  
99 - if parameter.get("tilematrix"):  
100 - if parameter.get("tilematrix").__contains__(":"):  
101 - level = int(parameter.get("tilematrix").split(":")[-1])  
102 - else:  
103 - level = int(parameter.get("tilematrix"))  
104 - if parameter.get("tilerow"):  
105 - row = int(parameter.get("tilerow"))  
106 - if parameter.get("tilecol"):  
107 - col = int(parameter.get("tilecol"))  
108 -  
109 - image_type = parameter.get("format") if parameter.get("format") else "image/png"  
110 -  
111 - quality = int(parameter.get("quality")) if parameter.get("quality") else 30  
112 -  
113 - extent = slice_scheme.get_polygon(slice_para, level, row, col)  
114 -  
115 -  
116 - pixel_array = numpy.zeros((256, 256,3), dtype=int)  
117 - ceng = 2  
118 - for band in bands:  
119 -  
120 - empty = numpy.zeros((256, 256), dtype=int)+65536  
121 -  
122 - for im in image_list:  
123 -  
124 - # 自决定金字塔等级  
125 - xysize = im.get("xysize")  
126 - origin_extent = im.get("origin_extent")  
127 - max_level = im.get("max_level")  
128 -  
129 - # 超出空间范围  
130 - if extent[2]<origin_extent[0] or extent[0]>origin_extent[2] or extent[1]>origin_extent[3] or extent[3]<origin_extent[1]:  
131 - pass  
132 - # 空间范围相交  
133 - else:  
134 - image_level = determine_level(xysize, origin_extent, extent, max_level)  
135 - path = im.get("path") 19 +from app.modules.image.models import ImageService,Image
  20 +from app.models import db
  21 +from app.util.component.ApiTemplate import ApiTemplate
  22 +import uuid
  23 +from app.util.component.SliceScheme import SliceScheme
  24 +from app.util.component.FileProcess import FileProcess
  25 +from app.util.component.ParameterUtil import ParameterUtil
  26 +from app.util.component.GeometryAdapter import GeometryAdapter
  27 +import os
  28 +import json
  29 +from kazoo.client import KazooClient
  30 +from app import GLOBAL_DIC
  31 +from threading import Thread
  32 +from thrift.transport import TSocket
  33 +from thrift.transport import TTransport
  34 +from thrift.protocol import TBinaryProtocol
  35 +from .ImageDataService import ImageDataService
  36 +from flask import current_app
  37 +import gzip
136 38
137 - # print(image_level) 39 +class Api(ApiTemplate):
138 40
139 - image: Dataset = gdal.Open(path, 0) 41 + api_name = "切片"
140 42
141 - band_data: Band = image.GetRasterBand(band) 43 + def __init__(self,guid,level, row, col):
  44 + super().__init__()
  45 + self.guid = guid
  46 + self.level = level
  47 + self.row = row
  48 + self.col = col
142 49
143 - if image_level == -1:  
144 - overview = band_data  
145 - else:  
146 - try:  
147 - overview: Band = band_data.GetOverview(image_level)  
148 - except:  
149 - raise Exception("该影像不存在该级别的金字塔数据!")  
150 - ox = overview.XSize  
151 - oy = overview.YSize 50 + def process(self):
152 51
153 - # 网格大小  
154 - grid_x = (origin_extent[2] - origin_extent[0]) / (ox * 1.0)  
155 - grid_y = (origin_extent[3] - origin_extent[1]) / (oy * 1.0) 52 + result = {}
  53 + parameter: dict = self.para
156 54
157 - # 完全在影像范围内  
158 - if extent[0]>origin_extent[0] and extent[1]>origin_extent[1] and extent[2]<origin_extent[2] and extent[3]<origin_extent[3]: 55 + try:
  56 + if parameter.get("guid"):
  57 + self.guid = parameter.get("guid")
  58 +
  59 + image_service = ImageService.query.filter_by(guid = self.guid).one_or_none()
  60 + images = image_service.images.all()
  61 +
  62 + zoo = GLOBAL_DIC.get("zookeeper")
  63 + if zoo is None:
  64 + zoo :KazooClient = KazooClient(hosts=configure.zookeeper, timeout=100)
  65 + zoo.start()
  66 + GLOBAL_DIC["zookeeper"] = zoo
  67 + else :
  68 + if not zoo.connected:
  69 + zoo.start()
  70 +
  71 + bands = [1, 2, 3]
  72 +
  73 +
  74 + # 转换参数
  75 + parameter = ParameterUtil.to_lower(parameter)
159 76
160 - t1 = time.time()  
161 - # 网格偏移量  
162 -  
163 - off_x = math.floor((extent[0]-origin_extent[0])/grid_x)  
164 - off_y = math.floor((origin_extent[3] -extent[3]) / grid_y)  
165 -  
166 - # 截取后网格个数  
167 - x_g = math.ceil((extent[2]-extent[0])/grid_x)  
168 -  
169 - y_g= math.ceil((extent[3]-extent[1])/grid_y)  
170 - t2 = time.time()  
171 - # print(t2-t1)  
172 - overview_raster:ndarray = overview.ReadAsArray(off_x,off_y,x_g,y_g,256,256)  
173 - t3 = time.time()  
174 - # print(t3-t2)  
175 -  
176 - mask1 = numpy.zeros((256, 256), dtype=int)  
177 - mask2 = numpy.zeros((256, 256), dtype=int)  
178 - mask1[overview_raster == 65536] = 1  
179 - mask2[overview_raster != 65536] = 1  
180 -  
181 - empty = empty*mask1+overview_raster*mask2  
182 - t4 = time.time()  
183 - # print(t4-t3)  
184 - # 部分相交  
185 - else:  
186 77
187 - inter_extent = [0,0,0,0]  
188 - inter_extent[0] = origin_extent[0] if origin_extent[0]>extent[0] else extent[0]  
189 - inter_extent[1] = origin_extent[1] if origin_extent[1] > extent[1] else extent[1]  
190 - inter_extent[2] = origin_extent[2] if origin_extent[2] < extent[2] else extent[2]  
191 - inter_extent[3] = origin_extent[3] if origin_extent[3] < extent[3] else extent[3] 78 + if parameter.get("tilematrix"):
  79 + if parameter.get("tilematrix").__contains__(":"):
  80 + self.level = int(parameter.get("tilematrix").split(":")[-1])
  81 + else:
  82 + self.level = int(parameter.get("tilematrix"))
  83 + if parameter.get("tilerow"):
  84 + self.row = int(parameter.get("tilerow"))
  85 + if parameter.get("tilecol"):
  86 + self.col = int(parameter.get("tilecol"))
  87 +
  88 +
  89 +
  90 + image_type = parameter.get("format") if parameter.get("format") else "image/png"
  91 +
  92 + quality = int(parameter.get("quality")) if parameter.get("quality") else 30
  93 +
  94 + slice_para = json.loads(image_service.slice_scheme)
192 95
193 - # 网格偏移量  
194 - off_x = math.floor((inter_extent[0]-origin_extent[0])/grid_x)  
195 - off_y = math.floor((origin_extent[3] -inter_extent[3]) / grid_y) 96 + extent = SliceScheme.get_polygon(slice_para, self.level, self.row, self.col)
196 97
197 - # 截取后网格个数  
198 - x_g = math.floor((inter_extent[2]-inter_extent[0])/grid_x)  
199 - y_g= math.floor((inter_extent[3]-inter_extent[1])/grid_y) 98 + # 结果矩阵
200 99
201 - # 相对于出图的偏移量 100 + empty_list = [numpy.zeros((256, 256), dtype=int) + 65536,
  101 + numpy.zeros((256, 256), dtype=int) + 65536,
  102 + numpy.zeros((256, 256), dtype=int) + 65536]
202 103
203 - #出图的网格大小  
204 - out_grid_x = (extent[2] - extent[0]) / (256 * 1.0)  
205 - out_grid_y = (extent[3] - extent[1]) / (256 * 1.0) 104 + # 多线程获取分布式数据
206 105
207 - out_off_x = int(math.ceil((inter_extent[0]-extent[0])/out_grid_x))  
208 - out_off_y = int(math.ceil((extent[3] -inter_extent[3]) / out_grid_y)) 106 + intersect_image = [im for im in images if self.determin_intersect(json.loads(im.extent),extent)]
209 107
210 - out_x_g = int(math.floor((inter_extent[2]-inter_extent[0])/out_grid_x))  
211 - out_y_g= int(math.floor((inter_extent[3]-inter_extent[1])/out_grid_y)) 108 + pixel_array = numpy.zeros((256, 256,3), dtype=int)
212 109
213 - # 相交部分在出图的哪个位置 110 + for image in intersect_image:
214 111
215 - overview_raster:ndarray = overview.ReadAsArray(off_x,off_y,x_g,y_g,out_x_g,out_y_g) 112 + if image.host.__eq__("本地服务器"):
216 113
217 - mask1 = numpy.zeros((out_y_g,out_x_g), dtype=int) 114 + pixel_array = numpy.zeros((256, 256, 3), dtype=int)
  115 + ceng = 0
  116 + img: Dataset = gdal.Open(image.path, 0)
  117 + t1 = time.time()
  118 + for band in bands:
218 119
219 - mask2 = numpy.zeros((out_y_g,out_x_g), dtype=int) 120 + # 自决定金字塔等级
  121 + xysize = [img.RasterXSize, img.RasterYSize]
  122 + origin_extent = image.extent
  123 + band_data: Band = img.GetRasterBand(band)
  124 + max_level = band_data.GetOverviewCount()
220 125
221 - mask1[overview_raster == 65536] = 1  
222 - mask2[overview_raster != 65536] = 1 126 + # 超出空间范围
  127 + if extent[2] < origin_extent[0] or extent[0] > origin_extent[2] or extent[1] > origin_extent[
  128 + 3] or extent[3] < origin_extent[1]:
  129 + empty = numpy.zeros((256, 256), dtype=int) + 65536
  130 + # 空间范围相交
  131 + else:
  132 + image_level = self.determine_level(xysize, origin_extent, extent, max_level)
223 133
224 - empty[out_off_y:out_off_y + out_y_g, out_off_x:out_off_x + out_x_g] = empty[out_off_y:out_off_y + out_y_g,out_off_x:out_off_x + out_x_g]*mask1 + overview_raster*mask2 134 + if image_level == -1:
  135 + overview = band_data
  136 + else:
  137 + try:
  138 + overview: Band = band_data.GetOverview(image_level)
  139 + except:
  140 + raise Exception("该影像不存在该级别的金字塔数据!")
  141 + ox = overview.XSize
  142 + oy = overview.YSize
225 143
226 - # 关闭句柄  
227 - del image 144 + # 网格大小
  145 + grid_x = (origin_extent[2] - origin_extent[0]) / (ox * 1.0)
  146 + grid_y = (origin_extent[3] - origin_extent[1]) / (oy * 1.0)
228 147
  148 + # 完全在影像范围内
  149 + if extent[0] > origin_extent[0] and extent[1] > origin_extent[1] and extent[2] < \
  150 + origin_extent[2] and extent[3] < origin_extent[3]:
229 151
  152 + # 网格偏移量
  153 + off_x = math.floor((extent[0] - origin_extent[0]) / grid_x)
  154 + off_y = math.floor((origin_extent[3] - extent[3]) / grid_y)
230 155
231 - # opencv 的颜色排列为GBR  
232 - pixel_array[:,:,ceng]=empty  
233 - ceng-=1 156 + # 截取后网格个数
  157 + x_g = math.ceil((extent[2] - extent[0]) / grid_x)
234 158
235 - t5 = time.time()  
236 - # print(t4-t3) 159 + y_g = math.ceil((extent[3] - extent[1]) / grid_y)
237 160
238 - #将图片生成在内存中,然后直接返回response  
239 - im_data = create_by_opencv(image_type, pixel_array, quality) 161 + empty = overview.ReadAsArray(off_x, off_y, x_g, y_g, 256, 256)
240 162
241 - return Response(im_data, mimetype=image_type.lower())  
242 163
243 - except Exception as e:  
244 - print(traceback.format_exc())  
245 - result["state"] = -1  
246 - result["message"] = e.__str__()  
247 - return result 164 + # 部分相交
  165 + else:
248 166
  167 + inter_extent = [0, 0, 0, 0]
  168 + inter_extent[0] = origin_extent[0] if origin_extent[0] > extent[0] else extent[0]
  169 + inter_extent[1] = origin_extent[1] if origin_extent[1] > extent[1] else extent[1]
  170 + inter_extent[2] = origin_extent[2] if origin_extent[2] < extent[2] else extent[2]
  171 + inter_extent[3] = origin_extent[3] if origin_extent[3] < extent[3] else extent[3]
249 172
  173 + # 网格偏移量
  174 + off_x = math.floor((inter_extent[0] - origin_extent[0]) / grid_x)
  175 + off_y = math.floor((origin_extent[3] - inter_extent[3]) / grid_y)
250 176
  177 + # 截取后网格个数
  178 + x_g = math.floor((inter_extent[2] - inter_extent[0]) / grid_x)
  179 + y_g = math.floor((inter_extent[3] - inter_extent[1]) / grid_y)
251 180
  181 + # 相对于出图的偏移量
252 182
253 -def determine_level(xysize,origin_extent,extent,max_level):  
254 - x = xysize[0]  
255 - y = xysize[1] 183 + # 出图的网格大小
  184 + out_grid_x = (extent[2] - extent[0]) / (256 * 1.0)
  185 + out_grid_y = (extent[3] - extent[1]) / (256 * 1.0)
256 186
257 - level = -1  
258 - pixel = x*y * (((extent[2]-extent[0])*(extent[3]-extent[1]))/((origin_extent[2]-origin_extent[0])*(origin_extent[3]-origin_extent[1]))) 187 + out_off_x = int(math.ceil((inter_extent[0] - extent[0]) / out_grid_x))
  188 + out_off_y = int(math.ceil((extent[3] - inter_extent[3]) / out_grid_y))
259 189
260 - while pixel>100000 and level<max_level-1:  
261 - level+=1  
262 - x=x/2  
263 - y=y/2  
264 - pixel = x * y * (((extent[2] - extent[0]) * (extent[3] - extent[1])) / (  
265 - (origin_extent[2] - origin_extent[0]) * (origin_extent[3] - origin_extent[1])))  
266 - return level 190 + out_x_g = int(math.floor((inter_extent[2] - inter_extent[0]) / out_grid_x))
  191 + out_y_g = int(math.floor((inter_extent[3] - inter_extent[1]) / out_grid_y))
267 192
  193 + # 相交部分在出图的哪个位置
268 194
  195 + overview_raster: ndarray = overview.ReadAsArray(off_x, off_y, x_g, y_g, out_x_g,
  196 + out_y_g)
269 197
270 -def create_by_pil(image_type,pixel_list,quality):  
271 - buffer = io.BytesIO()  
272 - if image_type.__eq__("image/jpeg") or image_type.__eq__("image/jpg"):  
273 - im_type = "jpeg"  
274 - data = list(zip(pixel_list[0][0], pixel_list[1][0], pixel_list[2][0]))  
275 - image_out = Image.new("RGB", (256, 256)) 198 + dat = numpy.zeros((256, 256), dtype=int) + 65536
  199 + dat[out_off_y:out_off_y + out_y_g, out_off_x:out_off_x + out_x_g] = overview_raster
276 200
277 - else:  
278 - im_type = "png"  
279 - four = [0 if x.__eq__(65536) else 255 for x in pixel_list[0][0]]  
280 - data = list(zip(pixel_list[0][0], pixel_list[1][0], pixel_list[2][0], four))  
281 - image_out = Image.new("RGBA", (256, 256))  
282 - t6 = time.time() 201 + empty = dat
283 202
284 - image_out.putdata(data)  
285 - image_out.save(buffer, im_type, quality=quality, optimize=True)  
286 - im_data = buffer.getvalue()  
287 - buffer.close()  
288 - t7 = time.time()  
289 - return im_data 203 + pixel_array[:, :, ceng] = empty
  204 + ceng += 1
290 205
  206 + data = pixel_array
  207 +
  208 + else:
  209 + ser = "{}:{}".format(image.host,image.port)
  210 + if zoo.exists("/rpc/{}".format(ser)):
  211 +
  212 + transport = TSocket.TSocket(image.host, image.port)
  213 + transport = TTransport.TBufferedTransport(transport)
  214 + protocol = TBinaryProtocol.TBinaryProtocol(transport)
  215 + client = ImageDataService.Client(protocol)
  216 + transport.open()
  217 + t1 = time.time()
  218 + data = client.getData(image.path, extent, json.loads(image.extent), bands)
  219 + transport.close()
  220 + current_app.logger.info("time {}".format(time.time()-t1))
  221 +
  222 + data = gzip.decompress(data)
  223 + data = numpy.frombuffer(data, dtype=int)
  224 + data= data.reshape((256, 256, 3))
  225 + else:
  226 + data = numpy.zeros((256, 256, 3), dtype=int) + 65536
  227 +
  228 +
  229 + # 掩膜在中央接口生成
  230 + mask = numpy.zeros((256, 256), dtype=int)
  231 + mask2 = numpy.zeros((256, 256), dtype=int)
  232 + jizhun = data[:, :, 0]
  233 +
  234 + mask[jizhun == 65536] = 1
  235 + mask[jizhun != 65536] = 0
  236 + mask2[jizhun == 65536] = 0
  237 + mask2[jizhun != 65536] = 1
  238 +
  239 + # 掩膜计算
  240 + for i, d in enumerate(empty_list):
  241 + empty_list[i] = empty_list[i] * mask + data[:, :, i] * mask2
  242 +
  243 +
  244 + for ii in [0, 1, 2]:
  245 + # opencv 颜色排序为GBR
  246 + pixel_array[:, :, 2 - ii] = empty_list[ii]
  247 +
  248 + #将图片生成在内存中,然后直接返回response
  249 + im_data = self.create_by_opencv(image_type, pixel_array, quality)
  250 +
  251 + return Response(im_data, mimetype=image_type.lower())
  252 +
  253 + except Exception as e:
  254 + print(traceback.format_exc())
  255 + result["state"] = -1
  256 + result["message"] = e.__str__()
  257 + return result
  258 +
  259 +
  260 + def determine_level(self,xysize,origin_extent,extent,max_level):
  261 + '''
  262 + 根据范围判断调用金字塔的哪一层
  263 + :param xysize:
  264 + :param origin_extent:
  265 + :param extent:
  266 + :param max_level:
  267 + :return:
  268 + '''
  269 + x = xysize[0]
  270 + y = xysize[1]
  271 + level = -1
  272 + pixel = x*y * (((extent[2]-extent[0])*(extent[3]-extent[1]))/((origin_extent[2]-origin_extent[0])*(origin_extent[3]-origin_extent[1])))
  273 + while pixel>100000 and level<max_level-1:
  274 + level+=1
  275 + x=x/2
  276 + y=y/2
  277 + pixel = x * y * (((extent[2] - extent[0]) * (extent[3] - extent[1])) / (
  278 + (origin_extent[2] - origin_extent[0]) * (origin_extent[3] - origin_extent[1])))
  279 + return level
  280 +
  281 + def create_by_opencv(self,image_type, pixel_array, quality):
  282 +
  283 + if image_type.__eq__("image/jpeg") or image_type.__eq__("image/jpg"):
  284 + r, buf = cv2.imencode(".jpg", pixel_array, [cv2.IMWRITE_JPEG_QUALITY, quality])
  285 + image_out = buf.tobytes()
  286 + else:
  287 + four = numpy.zeros((256, 256), dtype=int) + 255
  288 + four[pixel_array[:, :, 0] == 65536] = 0
  289 + r, buf = cv2.imencode(".png", numpy.dstack((pixel_array, four)))
  290 + image_out = buf.tobytes()
  291 + return image_out
  292 +
  293 + def get_data(self,image,extent,bands):
  294 + '''
  295 + 通过RPC获取远程数据
  296 + :param image:
  297 + :param extent:
  298 + :param bands:
  299 + :return:
  300 + '''
  301 + transport = TSocket.TSocket(image.host, image.port)
  302 + transport = TTransport.TBufferedTransport(transport)
  303 + protocol = TBinaryProtocol.TBinaryProtocol(transport)
  304 + client = ImageDataService.Client(protocol)
  305 +
  306 + transport.open()
  307 + data = client.getData(image.path,extent,json.loads(image.extent), bands)
  308 + transport.close()
  309 +
  310 + return numpy.array(json.loads(data))
  311 +
  312 + def determin_intersect(self,extent1,extent2):
  313 + g1 = GeometryAdapter.envelop_2_polygon(extent1)
  314 + g2 = GeometryAdapter.envelop_2_polygon(extent2)
  315 + return g1.Intersect(g2)
  316 +
  317 +
  318 +class MyThread(Thread):
  319 + def __init__(self,func,args=()):
  320 + super(MyThread,self).__init__()
  321 + self.func = func
  322 + self.args = args
  323 + def run(self):
  324 + self.result = self.func(*self.args)
  325 + def get_result(self):
  326 + try:
  327 + return self.result
  328 + except Exception:
  329 + return None
291 330
292 api_doc={ 331 api_doc={
293 "tags":["影像接口"], 332 "tags":["影像接口"],
@@ -6,7 +6,9 @@ @@ -6,7 +6,9 @@
6 6
7 from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Time 7 from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Time
8 from app.models import db 8 from app.models import db
  9 +from sqlalchemy.ext.declarative import declarative_base
9 10
  11 +Base = declarative_base()
10 class Image(db.Model): 12 class Image(db.Model):
11 ''' 13 '''
12 影像元数据 14 影像元数据
@@ -27,14 +29,13 @@ class Image(db.Model): @@ -27,14 +29,13 @@ class Image(db.Model):
27 port=Column(Integer) 29 port=Column(Integer)
28 30
29 31
30 -  
31 dmdms_image_rel = db.Table('dmdms_image_rel', 32 dmdms_image_rel = db.Table('dmdms_image_rel',
32 - Column('guid', String, primary_key=True),  
33 Column('image_guid',String, ForeignKey('dmdms_image.guid')), 33 Column('image_guid',String, ForeignKey('dmdms_image.guid')),
34 - Column('priority',Integer),  
35 Column('service_guid', String, ForeignKey('dmdms_image_service.guid')) 34 Column('service_guid', String, ForeignKey('dmdms_image_service.guid'))
36 ) 35 )
37 36
  37 +
  38 +
38 class ImageService(db.Model): 39 class ImageService(db.Model):
39 ''' 40 '''
40 影像服务 41 影像服务
@@ -47,6 +48,8 @@ class ImageService(db.Model): @@ -47,6 +48,8 @@ class ImageService(db.Model):
47 create_time = Column(DateTime) 48 create_time = Column(DateTime)
48 update_time = Column(DateTime) 49 update_time = Column(DateTime)
49 description = Column(Text) 50 description = Column(Text)
  51 + slice_scheme = Column(Text)
  52 + extent = Column(String(256))
50 images = db.relationship('Image', 53 images = db.relationship('Image',
51 secondary=dmdms_image_rel, 54 secondary=dmdms_image_rel,
52 backref='image_services', 55 backref='image_services',
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/8/9
  4 +#email: nheweijun@sina.com
  5 +
  6 +# from osgeo import osr
  7 +# class CoordinateTransform:
  8 +#
  9 +# def transform:
  10 +# origin = osr.SpatialReference()
  11 +# origin.ImportFromWkt(image.GetProjection())
  12 +# target = osr.SpatialReference()
  13 +#
  14 +#
  15 +# target = origin.CloneGeogCS()
  16 +# band_count = image.RasterCount
  17 +# band: Band = image.GetRasterBand(1)
  18 +# count = band.GetOverviewCount()
  19 +# tran = osr.CoordinateTransformation(origin, target)
  20 +#
  21 +# nodatavalue = band.GetNoDataValue()
@@ -33,4 +33,5 @@ class ParameterUtil: @@ -33,4 +33,5 @@ class ParameterUtil:
33 new_para=dict() 33 new_para=dict()
34 for key in parameter.keys(): 34 for key in parameter.keys():
35 new_para[key.lower()] = parameter[key] 35 new_para[key.lower()] = parameter[key]
36 - parameter = new_para  
  36 + parameter = new_para
  37 + return parameter
1 # coding=utf-8 1 # coding=utf-8
2 import os 2 import os
3 bind='0.0.0.0:8840' 3 bind='0.0.0.0:8840'
4 -workers=1 4 +workers=4
5 backlog=2048 5 backlog=2048
6 worker_class="gevent" 6 worker_class="gevent"
7 #daemon=True 7 #daemon=True
@@ -14,5 +14,6 @@ Pillow==8.1.2 @@ -14,5 +14,6 @@ Pillow==8.1.2
14 opencv-python==4.5.1.48 14 opencv-python==4.5.1.48
15 psutil==5.8.0 15 psutil==5.8.0
16 mod_wsgi==4.8.0 16 mod_wsgi==4.8.0
  17 +thrift==0.13.0
17 Authlib==0.13 18 Authlib==0.13
18 - 19 +kazoo==2.8.0
@@ -11,7 +11,7 @@ else @@ -11,7 +11,7 @@ else
11 port=$1 11 port=$1
12 echo "端口设置为$1 ..." 12 echo "端口设置为$1 ..."
13 fi 13 fi
14 -docker run -d --name dmapmanager -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port:8840 -v $curPath:/usr/src/app -w /usr/src/app dci/dmapdms:3.0 gunicorn -c gun_conf.py run:app 14 +docker run -d --name dmapmanager -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port:8840 -v $curPath:/usr/src/app -w /usr/src/app dci/dmapdms:4.0 gunicorn -c gun_conf.py run:app
15 # 清除未完成的任务任务 15 # 清除未完成的任务任务
16 sleep 5 16 sleep 5
17 curl localhost:$port/release 17 curl localhost:$port/release
@@ -3,4 +3,5 @@ from flask import Flask @@ -3,4 +3,5 @@ from flask import Flask
3 from app import create_app 3 from app import create_app
4 app:Flask = create_app() 4 app:Flask = create_app()
5 if __name__ == '__main__': 5 if __name__ == '__main__':
6 - app.run(host="0.0.0.0", port="8840", threaded=True, debug=True)  
  6 + app.run(host="0.0.0.0", port="8840", threaded=True, debug=True)
  7 + # app.run(host="0.0.0.0", port="8840", threaded=True)
@@ -5,4 +5,16 @@ @@ -5,4 +5,16 @@
5 5
6 from pyDes import des,ECB,PAD_PKCS5 6 from pyDes import des,ECB,PAD_PKCS5
7 import base64 7 import base64
  8 +import numpy
  9 +import gzip
  10 +import sys
  11 +import json
  12 +pixel_array = numpy.empty((256,256,3),dtype=int)+3
8 13
  14 +
  15 +
  16 +# 使用gzip 压缩传输
  17 +content = gzip.compress(pixel_array, 2)
  18 +
  19 +print(sys.getsizeof(json.dumps(pixel_array.tolist())))
  20 +print(sys.getsizeof((content)))
注册登录 后发表评论