提交 874cc3806ba715875615fcf47f91f6ec57d025e2

作者 nheweijun
1 个父辈 fe04e634

2021.12.21 完成影像模块的剥离

正在显示 40 个修改的文件 包含 92 行增加4614 行删除

要显示太多修改。

为保证性能只显示 40 of 88 个文件。

... ... @@ -22,6 +22,9 @@ class Api(ApiTemplate):
22 22 for cata in catalogs:
23 23 catalog_guids = [c.guid for c in Catalog.query.filter(Catalog.path.like("%" + cata.guid + "%")).all()]
24 24 table_count = Table.query.filter(Table.catalog_guid.in_(catalog_guids)).count()
  25 +
  26 +
  27 +
25 28 database_alias = cata.relate_database.alias
26 29 cata_json = ModelVisitor.object_to_json(cata)
27 30 cata_json["table_count"]=table_count
... ...
... ... @@ -56,7 +56,7 @@ class Api(ApiTemplate):
56 56 res["msg"] = "数据库连接已存在,请修改数据库连接!"
57 57 return res
58 58 elif not self.check_space(sqlalchemy_uri):
59   - res["msg"] = "数据不是空间数据库!"
  59 + res["msg"] = "数据不是空间数据库!"
60 60 return res
61 61 else:
62 62 this_time = datetime.datetime.now()
... ...
... ... @@ -5,7 +5,6 @@
5 5
6 6 from ..models import db,Task,Table,InsertingLayerName,Process
7 7
8   -from app.modules.service.models import Image
9 8 from app.util.component.ApiTemplate import ApiTemplate
10 9 from app.util.component.StructuredPrint import StructurePrint
11 10 import os
... ... @@ -66,7 +65,7 @@ class Api(ApiTemplate):
66 65 if task.task_type==4:
67 66 pass
68 67 if task.task_type==5:
69   - Image.query.filter_by(guid=task.parameter).update({"has_pyramid":0})
  68 + pass
70 69
71 70 Task.query.filter_by(guid=task.guid).update({"state":-1})
72 71
... ...
... ... @@ -4,10 +4,11 @@
4 4 #email: nheweijun@sina.com
5 5
6 6
7   -from ..models import ServiceCatalog,db,Service
  7 +from ..models import ServiceCatalog,db,Service,ServiceEngine
8 8
9 9 from app.util.component.ApiTemplate import ApiTemplate
10 10 from app.util.component.ModelVisitor import ModelVisitor
  11 +import requests
11 12 class Api(ApiTemplate):
12 13 api_name = "下一级目录"
13 14 def process(self):
... ... @@ -19,12 +20,28 @@ class Api(ApiTemplate):
19 20
20 21 res["data"] = []
21 22 catalogs = ServiceCatalog.query.filter_by(pguid=self.para.get("catalog_guid")).all()
  23 +
  24 + # 获取全部影像服务
  25 + image_engines = ServiceEngine.query.filter_by(type="ImageServer").all()
  26 + image_services = []
  27 + for ie in image_engines:
  28 + url = "{}/API/Service/List".format(ie.url)
  29 + response:requests.Response = requests.post(url,{"page_size":1000})
  30 + if not response.json().get("result"):
  31 + raise Exception("获取影像服务List失败!")
  32 + else:
  33 + image_services.extend(response.json()["data"]["list"])
  34 +
22 35 for cata in catalogs:
23 36 catalog_guids = [c.guid for c in ServiceCatalog.query.filter(ServiceCatalog.path.like("%" + cata.guid + "%")).all()]
24 37 service_count = Service.query.filter(Service.catalog_guid.in_(catalog_guids)).count()
25 38 cata_json = ModelVisitor.object_to_json(cata)
26   - cata_json["service_count"]=service_count
  39 +
  40 + image_service_count = len([igs for igs in image_services if igs["catalog_guid"] in catalog_guids])
  41 +
  42 + cata_json["service_count"]=service_count+image_service_count
27 43 res["data"].append(cata_json)
  44 +
28 45 res["result"] = True
29 46 except Exception as e:
30 47 raise e
... ...
... ... @@ -4,9 +4,10 @@
4 4 #email: nheweijun@sina.com
5 5
6 6
7   -from ..models import ServiceCatalog,Service
8   -
  7 +from ..models import ServiceCatalog,Service,ServiceEngine
9 8 from app.util.component.ApiTemplate import ApiTemplate
  9 +import requests
  10 +
10 11 class Api(ApiTemplate):
11 12 api_name = "目录树"
12 13 def process(self):
... ... @@ -18,11 +19,26 @@ class Api(ApiTemplate):
18 19
19 20 catalogs = ServiceCatalog.query.all()
20 21
  22 +
  23 + # 获取全部影像服务
  24 + image_engines = ServiceEngine.query.filter_by(type="ImageServer").all()
  25 + image_services = []
  26 + for ie in image_engines:
  27 + url = "{}/API/Service/List".format(ie.url)
  28 + response:requests.Response = requests.post(url,{"page_size":1000})
  29 + if not response.json().get("result"):
  30 + raise Exception("获取影像服务List失败!")
  31 + else:
  32 + image_services.extend(response.json()["data"]["list"])
  33 +
21 34 tree_origin = []
22 35 for cata in catalogs:
  36 +
23 37 catalog_guids = [c.guid for c in ServiceCatalog.query.filter(ServiceCatalog.path.like("%" + cata.guid + "%")).all()]
24 38 service_count = Service.query.filter(Service.catalog_guid.in_(catalog_guids)).count()
25 39
  40 + image_service_count = len([igs for igs in image_services if igs["catalog_guid"] in catalog_guids])
  41 +
26 42 cata_json ={}
27 43
28 44 cata_json["description"] = cata.description
... ... @@ -31,7 +47,7 @@ class Api(ApiTemplate):
31 47 cata_json["path"] = cata.path
32 48 cata_json["pguid"] = cata.pguid
33 49 cata_json["sort"] = cata.sort
34   - cata_json["service_count"]=service_count
  50 + cata_json["service_count"]=service_count+image_service_count
35 51 cata_json["children"] = []
36 52 tree_origin.append(cata_json)
37 53
... ...
... ... @@ -4,7 +4,8 @@
4 4 #email: nheweijun@sina.com
5 5
6 6
7   -from ..models import Service,ServiceCatalog,db
  7 +from ..models import Service,ServiceCatalog,db,ServiceEngine
  8 +import requests
8 9
9 10 from app.util.component.ApiTemplate import ApiTemplate
10 11 class Api(ApiTemplate):
... ... @@ -17,9 +18,24 @@ class Api(ApiTemplate):
17 18 # 业务逻辑
18 19 catalogs = ServiceCatalog.query.all()
19 20 res["data"]=[]
  21 +
  22 + # 获取全部影像服务
  23 + image_engines = ServiceEngine.query.filter_by(type="ImageServer").all()
  24 + image_services = []
  25 + for ie in image_engines:
  26 + url = "{}/API/Service/List".format(ie.url)
  27 + response:requests.Response = requests.post(url,{"page_size":1000})
  28 + if not response.json().get("result"):
  29 + raise Exception("获取影像服务List失败!")
  30 + else:
  31 + image_services.extend(response.json()["data"]["list"])
  32 +
20 33 for cata in catalogs:
21 34 catalog_guids = [c.guid for c in ServiceCatalog.query.filter(ServiceCatalog.path.like("%" + cata.guid + "%")).all()]
22 35 service_count = Service.query.filter(Service.catalog_guid.in_(catalog_guids)).count()
  36 +
  37 + image_service_count = len([igs for igs in image_services if igs["catalog_guid"] in catalog_guids])
  38 +
23 39 cata_json ={}
24 40 cata_json["description"] = cata.description
25 41 cata_json["guid"] = cata.guid
... ... @@ -27,7 +43,7 @@ class Api(ApiTemplate):
27 43 cata_json["path"] = cata.path
28 44 cata_json["pguid"] = cata.pguid
29 45 cata_json["sort"] = cata.sort
30   - cata_json["service_count"]=service_count
  46 + cata_json["service_count"] = service_count + image_service_count
31 47 res["data"].append(cata_json)
32 48
33 49 res["result"] = True
... ...
... ... @@ -11,6 +11,7 @@ from . import service_engine_register
11 11 from . import service_engine_delete
12 12 from . import service_engine_edit
13 13 from . import service_engine_list
  14 +from . import service_engine_info
14 15
15 16 class EngineManager(BlueprintApi):
16 17
... ... @@ -35,6 +36,15 @@ class EngineManager(BlueprintApi):
35 36 return service_engine_list.Api().result
36 37
37 38 @staticmethod
  39 + @bp.route('/Info', methods=['POST'])
  40 + @swag_from(service_engine_info.Api.api_doc)
  41 + def service_engine_info():
  42 + """
  43 + Engine Info
  44 + """
  45 + return service_engine_info.Api().result
  46 +
  47 + @staticmethod
38 48 @bp.route('/Edit', methods=['POST'])
39 49 @swag_from(service_engine_edit.Api.api_doc)
40 50 def service_engine_edit():
... ...
1 1 # coding=utf-8
2 2 #author: 4N
3   -#createtime: 2021/7/19
  3 +#createtime: 2021/9/14
4 4 #email: nheweijun@sina.com
5 5
6 6 from app.util.component.ApiTemplate import ApiTemplate
7   -from app.models import db
8   -from ..models import Image
9   -class Api(ApiTemplate):
10   -
11   - api_name = "删除影像数据"
  7 +from app.modules.service.models import ServiceEngine
  8 +from app.util.component.ModelVisitor import ModelVisitor
12 9
  10 +class Api(ApiTemplate):
  11 + api_name = "服务引擎Info"
13 12 def process(self):
14   -
15 13 res = {}
16   -
17 14 try:
18 15 guid = self.para.get("guid")
19   - image = Image.query.filter_by(guid=guid).one_or_none()
20   - db.session.delete(image)
21   - db.session.commit()
22   - res["result"] = True
  16 + service_engine = ServiceEngine.query.filter_by(guid=guid).one_or_none()
  17 + if not service_engine:
  18 + raise Exception("服务引擎不存在!")
23 19
  20 + res["data"] = ModelVisitor.object_to_json(service_engine)
  21 + res["result"] = True
24 22 except Exception as e:
25 23 raise e
26   -
27 24 return res
28 25
  26 +
29 27 api_doc = {
30   - "tags": ["影像接口"],
  28 + "tags": ["引擎接口"],
31 29 "parameters": [
32 30 {"name": "guid",
33 31 "in": "formData",
34   - "type": "string"}
  32 + "type": "string"},
35 33 ],
36 34 "responses": {
37 35 200: {
... ... @@ -41,6 +39,4 @@ class Api(ApiTemplate):
41 39 }
42 40 }
43 41 }
44   - }
45   -
46   -
  42 + }
\ No newline at end of file
... ...
... ... @@ -19,8 +19,7 @@ class Api(ApiTemplate):
19 19
20 20 service_engines = ServiceEngine.query
21 21 if name:
22   - service_engines = service_engines.filter_by(name=name)
23   -
  22 + service_engines = service_engines.filter(ServiceEngine.name.like("%" + name + "%"))
24 23 if s_type:
25 24 service_engines = service_engines.filter_by(type=s_type)
26 25 res["data"] = {}
... ...
... ... @@ -15,18 +15,18 @@ class Api(ApiTemplate):
15 15 res = {}
16 16 try:
17 17 url = self.para.get("url")
  18 + name = self.para.get("name")
18 19 response:requests.Response = requests.get(url)
19 20 if response.status_code != 200:
20 21 raise Exception("服务引擎连接失败!")
21 22 service_engine = ServiceEngine(guid=uuid.uuid1().__str__(),
22   - name=response.json().get("Name"),
  23 + name=name if name else response.json().get("Name"),
23 24 url=url,
24 25 type=response.json().get("Type"),
25 26 create_time=datetime.datetime.now()
26 27 )
27 28 db.session.add(service_engine)
28 29 db.session.commit()
29   -
30 30 res["result"] = True
31 31 except Exception as e:
32 32 raise Exception("引擎已注册!")
... ... @@ -40,6 +40,10 @@ class Api(ApiTemplate):
40 40 "in": "formData",
41 41 "type": "string",
42 42 "description": "服务地址"},
  43 + {"name": "name",
  44 + "in": "formData",
  45 + "type": "string",
  46 + "description": "name"},
43 47 ],
44 48 "responses": {
45 49 200: {
... ...
1   -#!/usr/bin/env python
2   -#
3   -# Autogenerated by Thrift Compiler (0.14.2)
4   -#
5   -# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
6   -#
7   -# options string: py
8   -#
9   -
10   -import sys
11   -import pprint
12   -if sys.version_info[0] > 2:
13   - from urllib.parse import urlparse
14   -else:
15   - from urlparse import urlparse
16   -from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
17   -from thrift.protocol.TBinaryProtocol import TBinaryProtocol
18   -
19   -from app.modules.image.ImageDataService import ImageDataService
20   -from app.modules.image.ImageDataService.ttypes import *
21   -
22   -if len(sys.argv) <= 1 or sys.argv[1] == '--help':
23   - print('')
24   - print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
25   - print('')
26   - print('Functions:')
27   - print(' string getData(string path, queryRange, originRange, bands, i32 width, i32 height)')
28   - print(' string getInfo(string path)')
29   - print(' bool buildOverview(string path)')
30   - print(' string getImageList(string path)')
31   - print('')
32   - sys.exit(0)
33   -
34   -pp = pprint.PrettyPrinter(indent=2)
35   -host = 'localhost'
36   -port = 9090
37   -uri = ''
38   -framed = False
39   -ssl = False
40   -validate = True
41   -ca_certs = None
42   -keyfile = None
43   -certfile = None
44   -http = False
45   -argi = 1
46   -
47   -if sys.argv[argi] == '-h':
48   - parts = sys.argv[argi + 1].split(':')
49   - host = parts[0]
50   - if len(parts) > 1:
51   - port = int(parts[1])
52   - argi += 2
53   -
54   -if sys.argv[argi] == '-u':
55   - url = urlparse(sys.argv[argi + 1])
56   - parts = url[1].split(':')
57   - host = parts[0]
58   - if len(parts) > 1:
59   - port = int(parts[1])
60   - else:
61   - port = 80
62   - uri = url[2]
63   - if url[4]:
64   - uri += '?%s' % url[4]
65   - http = True
66   - argi += 2
67   -
68   -if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
69   - framed = True
70   - argi += 1
71   -
72   -if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
73   - ssl = True
74   - argi += 1
75   -
76   -if sys.argv[argi] == '-novalidate':
77   - validate = False
78   - argi += 1
79   -
80   -if sys.argv[argi] == '-ca_certs':
81   - ca_certs = sys.argv[argi+1]
82   - argi += 2
83   -
84   -if sys.argv[argi] == '-keyfile':
85   - keyfile = sys.argv[argi+1]
86   - argi += 2
87   -
88   -if sys.argv[argi] == '-certfile':
89   - certfile = sys.argv[argi+1]
90   - argi += 2
91   -
92   -cmd = sys.argv[argi]
93   -args = sys.argv[argi + 1:]
94   -
95   -if http:
96   - transport = THttpClient.THttpClient(host, port, uri)
97   -else:
98   - if ssl:
99   - socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
100   - else:
101   - socket = TSocket.TSocket(host, port)
102   - if framed:
103   - transport = TTransport.TFramedTransport(socket)
104   - else:
105   - transport = TTransport.TBufferedTransport(socket)
106   -protocol = TBinaryProtocol(transport)
107   -client = ImageDataService.Client(protocol)
108   -transport.open()
109   -
110   -if cmd == 'getData':
111   - if len(args) != 6:
112   - print('getData requires 6 args')
113   - sys.exit(1)
114   - pp.pprint(client.getData(args[0], eval(args[1]), eval(args[2]), eval(args[3]), eval(args[4]), eval(args[5]),))
115   -
116   -elif cmd == 'getInfo':
117   - if len(args) != 1:
118   - print('getInfo requires 1 args')
119   - sys.exit(1)
120   - pp.pprint(client.getInfo(args[0],))
121   -
122   -elif cmd == 'buildOverview':
123   - if len(args) != 1:
124   - print('buildOverview requires 1 args')
125   - sys.exit(1)
126   - pp.pprint(client.buildOverview(args[0],))
127   -
128   -elif cmd == 'getImageList':
129   - if len(args) != 1:
130   - print('getImageList requires 1 args')
131   - sys.exit(1)
132   - pp.pprint(client.getImageList(args[0],))
133   -
134   -else:
135   - print('Unrecognized method %s' % cmd)
136   - sys.exit(1)
137   -
138   -transport.close()
1   -#
2   -# Autogenerated by Thrift Compiler (0.14.2)
3   -#
4   -# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5   -#
6   -# options string: py
7   -#
8   -
9   -from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
10   -from thrift.protocol.TProtocol import TProtocolException
11   -from thrift.TRecursive import fix_spec
12   -
13   -import sys
14   -import logging
15   -from .ttypes import *
16   -from thrift.Thrift import TProcessor
17   -from thrift.transport import TTransport
18   -all_structs = []
19   -
20   -
21   -class Iface(object):
22   - def getData(self, path, queryRange, originRange, bands, width, height):
23   - """
24   - Parameters:
25   - - path
26   - - queryRange
27   - - originRange
28   - - bands
29   - - width
30   - - height
31   -
32   - """
33   - pass
34   -
35   - def getInfo(self, path):
36   - """
37   - Parameters:
38   - - path
39   -
40   - """
41   - pass
42   -
43   - def buildOverview(self, path):
44   - """
45   - Parameters:
46   - - path
47   -
48   - """
49   - pass
50   -
51   - def getImageList(self, path):
52   - """
53   - Parameters:
54   - - path
55   -
56   - """
57   - pass
58   -
59   -
60   -class Client(Iface):
61   - def __init__(self, iprot, oprot=None):
62   - self._iprot = self._oprot = iprot
63   - if oprot is not None:
64   - self._oprot = oprot
65   - self._seqid = 0
66   -
67   - def getData(self, path, queryRange, originRange, bands, width, height):
68   - """
69   - Parameters:
70   - - path
71   - - queryRange
72   - - originRange
73   - - bands
74   - - width
75   - - height
76   -
77   - """
78   - self.send_getData(path, queryRange, originRange, bands, width, height)
79   - return self.recv_getData()
80   -
81   - def send_getData(self, path, queryRange, originRange, bands, width, height):
82   - self._oprot.writeMessageBegin('getData', TMessageType.CALL, self._seqid)
83   - args = getData_args()
84   - args.path = path
85   - args.queryRange = queryRange
86   - args.originRange = originRange
87   - args.bands = bands
88   - args.width = width
89   - args.height = height
90   - args.write(self._oprot)
91   - self._oprot.writeMessageEnd()
92   - self._oprot.trans.flush()
93   -
94   - def recv_getData(self):
95   - iprot = self._iprot
96   - (fname, mtype, rseqid) = iprot.readMessageBegin()
97   - if mtype == TMessageType.EXCEPTION:
98   - x = TApplicationException()
99   - x.read(iprot)
100   - iprot.readMessageEnd()
101   - raise x
102   - result = getData_result()
103   - result.read(iprot)
104   - iprot.readMessageEnd()
105   - if result.success is not None:
106   - return result.success
107   - raise TApplicationException(TApplicationException.MISSING_RESULT, "getData failed: unknown result")
108   -
109   - def getInfo(self, path):
110   - """
111   - Parameters:
112   - - path
113   -
114   - """
115   - self.send_getInfo(path)
116   - return self.recv_getInfo()
117   -
118   - def send_getInfo(self, path):
119   - self._oprot.writeMessageBegin('getInfo', TMessageType.CALL, self._seqid)
120   - args = getInfo_args()
121   - args.path = path
122   - args.write(self._oprot)
123   - self._oprot.writeMessageEnd()
124   - self._oprot.trans.flush()
125   -
126   - def recv_getInfo(self):
127   - iprot = self._iprot
128   - (fname, mtype, rseqid) = iprot.readMessageBegin()
129   - if mtype == TMessageType.EXCEPTION:
130   - x = TApplicationException()
131   - x.read(iprot)
132   - iprot.readMessageEnd()
133   - raise x
134   - result = getInfo_result()
135   - result.read(iprot)
136   - iprot.readMessageEnd()
137   - if result.success is not None:
138   - return result.success
139   - raise TApplicationException(TApplicationException.MISSING_RESULT, "getInfo failed: unknown result")
140   -
141   - def buildOverview(self, path):
142   - """
143   - Parameters:
144   - - path
145   -
146   - """
147   - self.send_buildOverview(path)
148   - return self.recv_buildOverview()
149   -
150   - def send_buildOverview(self, path):
151   - self._oprot.writeMessageBegin('buildOverview', TMessageType.CALL, self._seqid)
152   - args = buildOverview_args()
153   - args.path = path
154   - args.write(self._oprot)
155   - self._oprot.writeMessageEnd()
156   - self._oprot.trans.flush()
157   -
158   - def recv_buildOverview(self):
159   - iprot = self._iprot
160   - (fname, mtype, rseqid) = iprot.readMessageBegin()
161   - if mtype == TMessageType.EXCEPTION:
162   - x = TApplicationException()
163   - x.read(iprot)
164   - iprot.readMessageEnd()
165   - raise x
166   - result = buildOverview_result()
167   - result.read(iprot)
168   - iprot.readMessageEnd()
169   - if result.success is not None:
170   - return result.success
171   - raise TApplicationException(TApplicationException.MISSING_RESULT, "buildOverview failed: unknown result")
172   -
173   - def getImageList(self, path):
174   - """
175   - Parameters:
176   - - path
177   -
178   - """
179   - self.send_getImageList(path)
180   - return self.recv_getImageList()
181   -
182   - def send_getImageList(self, path):
183   - self._oprot.writeMessageBegin('getImageList', TMessageType.CALL, self._seqid)
184   - args = getImageList_args()
185   - args.path = path
186   - args.write(self._oprot)
187   - self._oprot.writeMessageEnd()
188   - self._oprot.trans.flush()
189   -
190   - def recv_getImageList(self):
191   - iprot = self._iprot
192   - (fname, mtype, rseqid) = iprot.readMessageBegin()
193   - if mtype == TMessageType.EXCEPTION:
194   - x = TApplicationException()
195   - x.read(iprot)
196   - iprot.readMessageEnd()
197   - raise x
198   - result = getImageList_result()
199   - result.read(iprot)
200   - iprot.readMessageEnd()
201   - if result.success is not None:
202   - return result.success
203   - raise TApplicationException(TApplicationException.MISSING_RESULT, "getImageList failed: unknown result")
204   -
205   -
206   -class Processor(Iface, TProcessor):
207   - def __init__(self, handler):
208   - self._handler = handler
209   - self._processMap = {}
210   - self._processMap["getData"] = Processor.process_getData
211   - self._processMap["getInfo"] = Processor.process_getInfo
212   - self._processMap["buildOverview"] = Processor.process_buildOverview
213   - self._processMap["getImageList"] = Processor.process_getImageList
214   - self._on_message_begin = None
215   -
216   - def on_message_begin(self, func):
217   - self._on_message_begin = func
218   -
219   - def process(self, iprot, oprot):
220   - (name, type, seqid) = iprot.readMessageBegin()
221   - if self._on_message_begin:
222   - self._on_message_begin(name, type, seqid)
223   - if name not in self._processMap:
224   - iprot.skip(TType.STRUCT)
225   - iprot.readMessageEnd()
226   - x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
227   - oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
228   - x.write(oprot)
229   - oprot.writeMessageEnd()
230   - oprot.trans.flush()
231   - return
232   - else:
233   - self._processMap[name](self, seqid, iprot, oprot)
234   - return True
235   -
236   - def process_getData(self, seqid, iprot, oprot):
237   - args = getData_args()
238   - args.read(iprot)
239   - iprot.readMessageEnd()
240   - result = getData_result()
241   - try:
242   - result.success = self._handler.getData(args.path, args.queryRange, args.originRange, args.bands, args.width, args.height)
243   - msg_type = TMessageType.REPLY
244   - except TTransport.TTransportException:
245   - raise
246   - except TApplicationException as ex:
247   - logging.exception('TApplication exception in handler')
248   - msg_type = TMessageType.EXCEPTION
249   - result = ex
250   - except Exception:
251   - logging.exception('Unexpected exception in handler')
252   - msg_type = TMessageType.EXCEPTION
253   - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
254   - oprot.writeMessageBegin("getData", msg_type, seqid)
255   - result.write(oprot)
256   - oprot.writeMessageEnd()
257   - oprot.trans.flush()
258   -
259   - def process_getInfo(self, seqid, iprot, oprot):
260   - args = getInfo_args()
261   - args.read(iprot)
262   - iprot.readMessageEnd()
263   - result = getInfo_result()
264   - try:
265   - result.success = self._handler.getInfo(args.path)
266   - msg_type = TMessageType.REPLY
267   - except TTransport.TTransportException:
268   - raise
269   - except TApplicationException as ex:
270   - logging.exception('TApplication exception in handler')
271   - msg_type = TMessageType.EXCEPTION
272   - result = ex
273   - except Exception:
274   - logging.exception('Unexpected exception in handler')
275   - msg_type = TMessageType.EXCEPTION
276   - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
277   - oprot.writeMessageBegin("getInfo", msg_type, seqid)
278   - result.write(oprot)
279   - oprot.writeMessageEnd()
280   - oprot.trans.flush()
281   -
282   - def process_buildOverview(self, seqid, iprot, oprot):
283   - args = buildOverview_args()
284   - args.read(iprot)
285   - iprot.readMessageEnd()
286   - result = buildOverview_result()
287   - try:
288   - result.success = self._handler.buildOverview(args.path)
289   - msg_type = TMessageType.REPLY
290   - except TTransport.TTransportException:
291   - raise
292   - except TApplicationException as ex:
293   - logging.exception('TApplication exception in handler')
294   - msg_type = TMessageType.EXCEPTION
295   - result = ex
296   - except Exception:
297   - logging.exception('Unexpected exception in handler')
298   - msg_type = TMessageType.EXCEPTION
299   - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
300   - oprot.writeMessageBegin("buildOverview", msg_type, seqid)
301   - result.write(oprot)
302   - oprot.writeMessageEnd()
303   - oprot.trans.flush()
304   -
305   - def process_getImageList(self, seqid, iprot, oprot):
306   - args = getImageList_args()
307   - args.read(iprot)
308   - iprot.readMessageEnd()
309   - result = getImageList_result()
310   - try:
311   - result.success = self._handler.getImageList(args.path)
312   - msg_type = TMessageType.REPLY
313   - except TTransport.TTransportException:
314   - raise
315   - except TApplicationException as ex:
316   - logging.exception('TApplication exception in handler')
317   - msg_type = TMessageType.EXCEPTION
318   - result = ex
319   - except Exception:
320   - logging.exception('Unexpected exception in handler')
321   - msg_type = TMessageType.EXCEPTION
322   - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
323   - oprot.writeMessageBegin("getImageList", msg_type, seqid)
324   - result.write(oprot)
325   - oprot.writeMessageEnd()
326   - oprot.trans.flush()
327   -
328   -# HELPER FUNCTIONS AND STRUCTURES
329   -
330   -
331   -class getData_args(object):
332   - """
333   - Attributes:
334   - - path
335   - - queryRange
336   - - originRange
337   - - bands
338   - - width
339   - - height
340   -
341   - """
342   -
343   -
344   - def __init__(self, path=None, queryRange=None, originRange=None, bands=None, width=None, height=None,):
345   - self.path = path
346   - self.queryRange = queryRange
347   - self.originRange = originRange
348   - self.bands = bands
349   - self.width = width
350   - self.height = height
351   -
352   - def read(self, iprot):
353   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
354   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
355   - return
356   - iprot.readStructBegin()
357   - while True:
358   - (fname, ftype, fid) = iprot.readFieldBegin()
359   - if ftype == TType.STOP:
360   - break
361   - if fid == 1:
362   - if ftype == TType.STRING:
363   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
364   - else:
365   - iprot.skip(ftype)
366   - elif fid == 2:
367   - if ftype == TType.LIST:
368   - self.queryRange = []
369   - (_etype3, _size0) = iprot.readListBegin()
370   - for _i4 in range(_size0):
371   - _elem5 = iprot.readDouble()
372   - self.queryRange.append(_elem5)
373   - iprot.readListEnd()
374   - else:
375   - iprot.skip(ftype)
376   - elif fid == 3:
377   - if ftype == TType.LIST:
378   - self.originRange = []
379   - (_etype9, _size6) = iprot.readListBegin()
380   - for _i10 in range(_size6):
381   - _elem11 = iprot.readDouble()
382   - self.originRange.append(_elem11)
383   - iprot.readListEnd()
384   - else:
385   - iprot.skip(ftype)
386   - elif fid == 4:
387   - if ftype == TType.LIST:
388   - self.bands = []
389   - (_etype15, _size12) = iprot.readListBegin()
390   - for _i16 in range(_size12):
391   - _elem17 = iprot.readI32()
392   - self.bands.append(_elem17)
393   - iprot.readListEnd()
394   - else:
395   - iprot.skip(ftype)
396   - elif fid == 5:
397   - if ftype == TType.I32:
398   - self.width = iprot.readI32()
399   - else:
400   - iprot.skip(ftype)
401   - elif fid == 6:
402   - if ftype == TType.I32:
403   - self.height = iprot.readI32()
404   - else:
405   - iprot.skip(ftype)
406   - else:
407   - iprot.skip(ftype)
408   - iprot.readFieldEnd()
409   - iprot.readStructEnd()
410   -
411   - def write(self, oprot):
412   - if oprot._fast_encode is not None and self.thrift_spec is not None:
413   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
414   - return
415   - oprot.writeStructBegin('getData_args')
416   - if self.path is not None:
417   - oprot.writeFieldBegin('path', TType.STRING, 1)
418   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
419   - oprot.writeFieldEnd()
420   - if self.queryRange is not None:
421   - oprot.writeFieldBegin('queryRange', TType.LIST, 2)
422   - oprot.writeListBegin(TType.DOUBLE, len(self.queryRange))
423   - for iter18 in self.queryRange:
424   - oprot.writeDouble(iter18)
425   - oprot.writeListEnd()
426   - oprot.writeFieldEnd()
427   - if self.originRange is not None:
428   - oprot.writeFieldBegin('originRange', TType.LIST, 3)
429   - oprot.writeListBegin(TType.DOUBLE, len(self.originRange))
430   - for iter19 in self.originRange:
431   - oprot.writeDouble(iter19)
432   - oprot.writeListEnd()
433   - oprot.writeFieldEnd()
434   - if self.bands is not None:
435   - oprot.writeFieldBegin('bands', TType.LIST, 4)
436   - oprot.writeListBegin(TType.I32, len(self.bands))
437   - for iter20 in self.bands:
438   - oprot.writeI32(iter20)
439   - oprot.writeListEnd()
440   - oprot.writeFieldEnd()
441   - if self.width is not None:
442   - oprot.writeFieldBegin('width', TType.I32, 5)
443   - oprot.writeI32(self.width)
444   - oprot.writeFieldEnd()
445   - if self.height is not None:
446   - oprot.writeFieldBegin('height', TType.I32, 6)
447   - oprot.writeI32(self.height)
448   - oprot.writeFieldEnd()
449   - oprot.writeFieldStop()
450   - oprot.writeStructEnd()
451   -
452   - def validate(self):
453   - return
454   -
455   - def __repr__(self):
456   - L = ['%s=%r' % (key, value)
457   - for key, value in self.__dict__.items()]
458   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
459   -
460   - def __eq__(self, other):
461   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
462   -
463   - def __ne__(self, other):
464   - return not (self == other)
465   -all_structs.append(getData_args)
466   -getData_args.thrift_spec = (
467   - None, # 0
468   - (1, TType.STRING, 'path', 'UTF8', None, ), # 1
469   - (2, TType.LIST, 'queryRange', (TType.DOUBLE, None, False), None, ), # 2
470   - (3, TType.LIST, 'originRange', (TType.DOUBLE, None, False), None, ), # 3
471   - (4, TType.LIST, 'bands', (TType.I32, None, False), None, ), # 4
472   - (5, TType.I32, 'width', None, None, ), # 5
473   - (6, TType.I32, 'height', None, None, ), # 6
474   -)
475   -
476   -
477   -class getData_result(object):
478   - """
479   - Attributes:
480   - - success
481   -
482   - """
483   -
484   -
485   - def __init__(self, success=None,):
486   - self.success = success
487   -
488   - def read(self, iprot):
489   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
490   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
491   - return
492   - iprot.readStructBegin()
493   - while True:
494   - (fname, ftype, fid) = iprot.readFieldBegin()
495   - if ftype == TType.STOP:
496   - break
497   - if fid == 0:
498   - if ftype == TType.STRING:
499   - self.success = iprot.readBinary()
500   - else:
501   - iprot.skip(ftype)
502   - else:
503   - iprot.skip(ftype)
504   - iprot.readFieldEnd()
505   - iprot.readStructEnd()
506   -
507   - def write(self, oprot):
508   - if oprot._fast_encode is not None and self.thrift_spec is not None:
509   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
510   - return
511   - oprot.writeStructBegin('getData_result')
512   - if self.success is not None:
513   - oprot.writeFieldBegin('success', TType.STRING, 0)
514   - oprot.writeBinary(self.success)
515   - oprot.writeFieldEnd()
516   - oprot.writeFieldStop()
517   - oprot.writeStructEnd()
518   -
519   - def validate(self):
520   - return
521   -
522   - def __repr__(self):
523   - L = ['%s=%r' % (key, value)
524   - for key, value in self.__dict__.items()]
525   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
526   -
527   - def __eq__(self, other):
528   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
529   -
530   - def __ne__(self, other):
531   - return not (self == other)
532   -all_structs.append(getData_result)
533   -getData_result.thrift_spec = (
534   - (0, TType.STRING, 'success', 'BINARY', None, ), # 0
535   -)
536   -
537   -
538   -class getInfo_args(object):
539   - """
540   - Attributes:
541   - - path
542   -
543   - """
544   -
545   -
546   - def __init__(self, path=None,):
547   - self.path = path
548   -
549   - def read(self, iprot):
550   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
551   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
552   - return
553   - iprot.readStructBegin()
554   - while True:
555   - (fname, ftype, fid) = iprot.readFieldBegin()
556   - if ftype == TType.STOP:
557   - break
558   - if fid == 1:
559   - if ftype == TType.STRING:
560   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
561   - else:
562   - iprot.skip(ftype)
563   - else:
564   - iprot.skip(ftype)
565   - iprot.readFieldEnd()
566   - iprot.readStructEnd()
567   -
568   - def write(self, oprot):
569   - if oprot._fast_encode is not None and self.thrift_spec is not None:
570   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
571   - return
572   - oprot.writeStructBegin('getInfo_args')
573   - if self.path is not None:
574   - oprot.writeFieldBegin('path', TType.STRING, 1)
575   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
576   - oprot.writeFieldEnd()
577   - oprot.writeFieldStop()
578   - oprot.writeStructEnd()
579   -
580   - def validate(self):
581   - return
582   -
583   - def __repr__(self):
584   - L = ['%s=%r' % (key, value)
585   - for key, value in self.__dict__.items()]
586   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
587   -
588   - def __eq__(self, other):
589   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
590   -
591   - def __ne__(self, other):
592   - return not (self == other)
593   -all_structs.append(getInfo_args)
594   -getInfo_args.thrift_spec = (
595   - None, # 0
596   - (1, TType.STRING, 'path', 'UTF8', None, ), # 1
597   -)
598   -
599   -
600   -class getInfo_result(object):
601   - """
602   - Attributes:
603   - - success
604   -
605   - """
606   -
607   -
608   - def __init__(self, success=None,):
609   - self.success = success
610   -
611   - def read(self, iprot):
612   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
613   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
614   - return
615   - iprot.readStructBegin()
616   - while True:
617   - (fname, ftype, fid) = iprot.readFieldBegin()
618   - if ftype == TType.STOP:
619   - break
620   - if fid == 0:
621   - if ftype == TType.STRING:
622   - self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
623   - else:
624   - iprot.skip(ftype)
625   - else:
626   - iprot.skip(ftype)
627   - iprot.readFieldEnd()
628   - iprot.readStructEnd()
629   -
630   - def write(self, oprot):
631   - if oprot._fast_encode is not None and self.thrift_spec is not None:
632   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
633   - return
634   - oprot.writeStructBegin('getInfo_result')
635   - if self.success is not None:
636   - oprot.writeFieldBegin('success', TType.STRING, 0)
637   - oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
638   - oprot.writeFieldEnd()
639   - oprot.writeFieldStop()
640   - oprot.writeStructEnd()
641   -
642   - def validate(self):
643   - return
644   -
645   - def __repr__(self):
646   - L = ['%s=%r' % (key, value)
647   - for key, value in self.__dict__.items()]
648   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
649   -
650   - def __eq__(self, other):
651   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
652   -
653   - def __ne__(self, other):
654   - return not (self == other)
655   -all_structs.append(getInfo_result)
656   -getInfo_result.thrift_spec = (
657   - (0, TType.STRING, 'success', 'UTF8', None, ), # 0
658   -)
659   -
660   -
661   -class buildOverview_args(object):
662   - """
663   - Attributes:
664   - - path
665   -
666   - """
667   -
668   -
669   - def __init__(self, path=None,):
670   - self.path = path
671   -
672   - def read(self, iprot):
673   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
674   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
675   - return
676   - iprot.readStructBegin()
677   - while True:
678   - (fname, ftype, fid) = iprot.readFieldBegin()
679   - if ftype == TType.STOP:
680   - break
681   - if fid == 1:
682   - if ftype == TType.STRING:
683   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
684   - else:
685   - iprot.skip(ftype)
686   - else:
687   - iprot.skip(ftype)
688   - iprot.readFieldEnd()
689   - iprot.readStructEnd()
690   -
691   - def write(self, oprot):
692   - if oprot._fast_encode is not None and self.thrift_spec is not None:
693   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
694   - return
695   - oprot.writeStructBegin('buildOverview_args')
696   - if self.path is not None:
697   - oprot.writeFieldBegin('path', TType.STRING, 1)
698   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
699   - oprot.writeFieldEnd()
700   - oprot.writeFieldStop()
701   - oprot.writeStructEnd()
702   -
703   - def validate(self):
704   - return
705   -
706   - def __repr__(self):
707   - L = ['%s=%r' % (key, value)
708   - for key, value in self.__dict__.items()]
709   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
710   -
711   - def __eq__(self, other):
712   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
713   -
714   - def __ne__(self, other):
715   - return not (self == other)
716   -all_structs.append(buildOverview_args)
717   -buildOverview_args.thrift_spec = (
718   - None, # 0
719   - (1, TType.STRING, 'path', 'UTF8', None, ), # 1
720   -)
721   -
722   -
723   -class buildOverview_result(object):
724   - """
725   - Attributes:
726   - - success
727   -
728   - """
729   -
730   -
731   - def __init__(self, success=None,):
732   - self.success = success
733   -
734   - def read(self, iprot):
735   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
736   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
737   - return
738   - iprot.readStructBegin()
739   - while True:
740   - (fname, ftype, fid) = iprot.readFieldBegin()
741   - if ftype == TType.STOP:
742   - break
743   - if fid == 0:
744   - if ftype == TType.BOOL:
745   - self.success = iprot.readBool()
746   - else:
747   - iprot.skip(ftype)
748   - else:
749   - iprot.skip(ftype)
750   - iprot.readFieldEnd()
751   - iprot.readStructEnd()
752   -
753   - def write(self, oprot):
754   - if oprot._fast_encode is not None and self.thrift_spec is not None:
755   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
756   - return
757   - oprot.writeStructBegin('buildOverview_result')
758   - if self.success is not None:
759   - oprot.writeFieldBegin('success', TType.BOOL, 0)
760   - oprot.writeBool(self.success)
761   - oprot.writeFieldEnd()
762   - oprot.writeFieldStop()
763   - oprot.writeStructEnd()
764   -
765   - def validate(self):
766   - return
767   -
768   - def __repr__(self):
769   - L = ['%s=%r' % (key, value)
770   - for key, value in self.__dict__.items()]
771   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
772   -
773   - def __eq__(self, other):
774   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
775   -
776   - def __ne__(self, other):
777   - return not (self == other)
778   -all_structs.append(buildOverview_result)
779   -buildOverview_result.thrift_spec = (
780   - (0, TType.BOOL, 'success', None, None, ), # 0
781   -)
782   -
783   -
784   -class getImageList_args(object):
785   - """
786   - Attributes:
787   - - path
788   -
789   - """
790   -
791   -
792   - def __init__(self, path=None,):
793   - self.path = path
794   -
795   - def read(self, iprot):
796   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
797   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
798   - return
799   - iprot.readStructBegin()
800   - while True:
801   - (fname, ftype, fid) = iprot.readFieldBegin()
802   - if ftype == TType.STOP:
803   - break
804   - if fid == 1:
805   - if ftype == TType.STRING:
806   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
807   - else:
808   - iprot.skip(ftype)
809   - else:
810   - iprot.skip(ftype)
811   - iprot.readFieldEnd()
812   - iprot.readStructEnd()
813   -
814   - def write(self, oprot):
815   - if oprot._fast_encode is not None and self.thrift_spec is not None:
816   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
817   - return
818   - oprot.writeStructBegin('getImageList_args')
819   - if self.path is not None:
820   - oprot.writeFieldBegin('path', TType.STRING, 1)
821   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
822   - oprot.writeFieldEnd()
823   - oprot.writeFieldStop()
824   - oprot.writeStructEnd()
825   -
826   - def validate(self):
827   - return
828   -
829   - def __repr__(self):
830   - L = ['%s=%r' % (key, value)
831   - for key, value in self.__dict__.items()]
832   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
833   -
834   - def __eq__(self, other):
835   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
836   -
837   - def __ne__(self, other):
838   - return not (self == other)
839   -all_structs.append(getImageList_args)
840   -getImageList_args.thrift_spec = (
841   - None, # 0
842   - (1, TType.STRING, 'path', 'UTF8', None, ), # 1
843   -)
844   -
845   -
846   -class getImageList_result(object):
847   - """
848   - Attributes:
849   - - success
850   -
851   - """
852   -
853   -
854   - def __init__(self, success=None,):
855   - self.success = success
856   -
857   - def read(self, iprot):
858   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
859   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
860   - return
861   - iprot.readStructBegin()
862   - while True:
863   - (fname, ftype, fid) = iprot.readFieldBegin()
864   - if ftype == TType.STOP:
865   - break
866   - if fid == 0:
867   - if ftype == TType.STRING:
868   - self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
869   - else:
870   - iprot.skip(ftype)
871   - else:
872   - iprot.skip(ftype)
873   - iprot.readFieldEnd()
874   - iprot.readStructEnd()
875   -
876   - def write(self, oprot):
877   - if oprot._fast_encode is not None and self.thrift_spec is not None:
878   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
879   - return
880   - oprot.writeStructBegin('getImageList_result')
881   - if self.success is not None:
882   - oprot.writeFieldBegin('success', TType.STRING, 0)
883   - oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
884   - oprot.writeFieldEnd()
885   - oprot.writeFieldStop()
886   - oprot.writeStructEnd()
887   -
888   - def validate(self):
889   - return
890   -
891   - def __repr__(self):
892   - L = ['%s=%r' % (key, value)
893   - for key, value in self.__dict__.items()]
894   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
895   -
896   - def __eq__(self, other):
897   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
898   -
899   - def __ne__(self, other):
900   - return not (self == other)
901   -all_structs.append(getImageList_result)
902   -getImageList_result.thrift_spec = (
903   - (0, TType.STRING, 'success', 'UTF8', None, ), # 0
904   -)
905   -fix_spec(all_structs)
906   -del all_structs
1   -__all__ = ['ttypes', 'constants', 'ImageDataService']
1   -#
2   -# Autogenerated by Thrift Compiler (0.14.2)
3   -#
4   -# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5   -#
6   -# options string: py
7   -#
8   -
9   -from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
10   -from thrift.protocol.TProtocol import TProtocolException
11   -from thrift.TRecursive import fix_spec
12   -
13   -import sys
14   -from .ttypes import *
1   -#
2   -# Autogenerated by Thrift Compiler (0.14.2)
3   -#
4   -# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5   -#
6   -# options string: py
7   -#
8   -
9   -from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
10   -from thrift.protocol.TProtocol import TProtocolException
11   -from thrift.TRecursive import fix_spec
12   -
13   -import sys
14   -
15   -from thrift.transport import TTransport
16   -all_structs = []
17   -fix_spec(all_structs)
18   -del all_structs
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/5/18
4   -#email: nheweijun@sina.com
5   -
6   -
7   -from flasgger import swag_from
8   -from flask import Blueprint
9   -from app.util import BlueprintApi
10   -from . import image_service_register
11   -from . import image_server_list
12   -from . import data_list
13   -from . import capabilities
14   -from . import image_tile,image_wms
15   -from . import image_tile_mask
16   -from . import image_wmts
17   -from . import image_delete
18   -from . import image_cancle
19   -from . import image_register,image_list,image_info,image_edit,image_overview
20   -from . import image_tag_create,image_tag_delete,image_tag_list
21   -from . import image_wms_temporary
22   -from . import image_wms_kv
23   -from . import image_build_pyramid
24   -from . import image_refresh
25   -
26   -class ImageServerInstance:
27   - pass
28   -
29   -class ImageManager(BlueprintApi):
30   -
31   - bp = Blueprint("ImageService", __name__, url_prefix="/API/Service/Image")
32   - # service_type = ["影像服务"]
33   -
34   - @staticmethod
35   - @bp.route('/Register', methods=['POST'])
36   - @swag_from(image_register.Api.api_doc)
37   - def image_register():
38   - """
39   - 影像注册
40   - """
41   - return image_register.Api().result
42   -
43   -
44   - @staticmethod
45   - @bp.route('/Delete', methods=['POST'])
46   - @swag_from(image_delete.Api.api_doc)
47   - def api_image_delete():
48   - """
49   - 影像删除
50   - """
51   - return image_delete.Api().result
52   -
53   - @staticmethod
54   - @bp.route('/Cancle', methods=['POST'])
55   - @swag_from(image_cancle.Api.api_doc)
56   - def api_image_cancle():
57   - """
58   - 影像取消注册
59   - """
60   - return image_cancle.Api().result
61   -
62   - @staticmethod
63   - @bp.route('/Edit', methods=['POST'])
64   - @swag_from(image_edit.Api.api_doc)
65   - def api_image_edit():
66   - """
67   - 影像Edit
68   - """
69   - return image_edit.Api().result
70   -
71   - @staticmethod
72   - @bp.route('/Info', methods=['POST'])
73   - @swag_from(image_info.Api.api_doc)
74   - def api_image_info():
75   - """
76   - 影像Info
77   - """
78   - return image_info.Api().result
79   -
80   -
81   - @staticmethod
82   - @bp.route('/Overview', methods=['POST'])
83   - @swag_from(image_overview.Api.api_doc)
84   - def api_image_overview():
85   - """
86   - 影像缩略图
87   - """
88   - return image_overview.Api().result
89   -
90   - @staticmethod
91   - @bp.route('/BuildPyramid', methods=['POST'])
92   - @swag_from(image_build_pyramid.Api.api_doc)
93   - def api_image_build_pyramid():
94   - """
95   - 创建影像金字塔
96   - """
97   - return image_build_pyramid.Api().result
98   -
99   - @staticmethod
100   - @bp.route('/Refresh', methods=['POST'])
101   - @swag_from(image_refresh.Api.api_doc)
102   - def api_image_refresh():
103   - """
104   - 影像刷新信息
105   - """
106   - return image_refresh.Api().result
107   -
108   -
109   - @staticmethod
110   - @bp.route('/TagCreate', methods=['POST'])
111   - @swag_from(image_tag_create.Api.api_doc)
112   - def api_image_tag_create():
113   - """
114   - Tag创建
115   - """
116   - return image_tag_create.Api().result
117   -
118   - @staticmethod
119   - @bp.route('/TagDelete', methods=['POST'])
120   - @swag_from(image_tag_delete.Api.api_doc)
121   - def api_image_tag_delete():
122   - """
123   - Tag删除
124   - """
125   - return image_tag_delete.Api().result
126   -
127   - @staticmethod
128   - @bp.route('/TagList', methods=['POST'])
129   - @swag_from(image_tag_list.Api.api_doc)
130   - def api_image_tag_list():
131   - """
132   - TagList
133   - """
134   - return image_tag_list.Api().result
135   -
136   -
137   - @staticmethod
138   - @bp.route('/ServiceRegister', methods=['POST'])
139   - @swag_from(image_service_register.Api.api_doc)
140   - def image_service_register():
141   - """
142   - 服务注册
143   - """
144   - return image_service_register.Api().result
145   -
146   -
147   -
148   - @staticmethod
149   - @bp.route('/ServerList', methods=['GET'])
150   - @swag_from(image_server_list.Api.api_doc)
151   - def image_server_list():
152   - """
153   - 服务器列表
154   - """
155   - return image_server_list.Api().result
156   -
157   -
158   - @staticmethod
159   - @bp.route('/DataList', methods=['POST'])
160   - @swag_from(data_list.Api.api_doc)
161   - def data_list():
162   - """
163   - 数据列表
164   - """
165   - return data_list.Api().result
166   -
167   - @staticmethod
168   - @bp.route('/Capabilities', methods=['GET','POST'])
169   - @swag_from(capabilities.Api.api_doc)
170   - def capabilities():
171   - """
172   - 能力文档
173   - """
174   - return capabilities.Api().result
175   -
176   - @staticmethod
177   - @bp.route('/ImageList', methods=['POST'])
178   - @swag_from(image_list.Api.api_doc)
179   - def image_list():
180   - """
181   - 影像列表
182   - """
183   - return image_list.Api().result
184   -
185   -
186   - @staticmethod
187   - @bp.route('/Tile/<guid>/<l>/<y>/<z>', methods=['GET'])
188   - # @swag_from(image_tile.Api.api_doc)
189   - def api_image_tile(guid,l,y,z):
190   - """
191   - 切片服务
192   - """
193   - return image_tile.Api(guid,l,y,z).result
194   -
195   -
196   -
197   -
198   -
199   - @staticmethod
200   - @bp.route('/Tile', methods=['GET','POST'])
201   - # @swag_from(image_tile.Api.api_doc)
202   - def api_image_tile_kv():
203   - """
204   - 切片服务
205   - """
206   - return image_tile.Api("1",1,1,1).result
207   -
208   - # @staticmethod
209   - # @bp.route('/TileMask/<guid>/<l>/<y>/<z>', methods=['GET'])
210   - # @swag_from(image_tile_mask.Api.api_doc)
211   - # def api_image_tile_mask(guid,l,y,z):
212   - # """
213   - # 切片服务
214   - # """
215   - # return image_tile_mask.Api(guid,l,y,z).result
216   - #
217   - # @staticmethod
218   - # @bp.route('/TileMask', methods=['GET','POST'])
219   - # @swag_from(image_tile_mask.Api.api_doc)
220   - # def api_image_tile_mask_kv():
221   - # """
222   - # 切片服务
223   - # """
224   - # return image_tile_mask.Api("1",1,1,1).result
225   -
226   -
227   -
228   - @staticmethod
229   - @bp.route('/<service_name>/WMS', methods=['GET','POST'])
230   - @swag_from(image_wms.Api.api_doc)
231   - def image_wms(service_name):
232   - """
233   - WMS服务
234   - """
235   - return image_wms.Api(service_name).result
236   -
237   - @staticmethod
238   - @bp.route('/<service_name>/WMTS', methods=['GET','POST'])
239   - @swag_from(image_wmts.Api.api_doc)
240   - def api_image_wmts(service_name):
241   - """
242   - 切片服务
243   - """
244   - return image_wmts.Api(service_name).result
245   -
246   -
247   -
248   - @staticmethod
249   - @bp.route('/WMS', methods=['GET','POST'])
250   - # @swag_from(image_wms_kv.Api.api_doc)
251   - def image_wms_kv():
252   - """
253   - WMS服务
254   - """
255   - return image_wms_kv.Api().result
256   -
257   -
258   - @staticmethod
259   - @bp.route('/WMSTem', methods=['GET','POST'])
260   - @swag_from(image_wms_temporary.Api.api_doc)
261   - def image_wms_temporary():
262   - """
263   - WMS服务预览
264   - """
265   - return image_wms_temporary.Api().result
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/4/6
4   -#email: nheweijun@sina.com
5   -
6   -
7   -from flask import Response
8   -from app.util.component.ApiTemplate import ApiTemplate
9   -from ..models import ImageService
10   -from ..models import Service,TileScheme
11   -import json
12   -import configure
13   -
14   -
15   -class Api(ApiTemplate):
16   -
17   - api_name = "影像能力文档"
18   -
19   - def process(self):
20   -
21   - guid = self.para.get("guid")
22   - image_service:ImageService = ImageService.query.filter_by(guid=guid).one_or_none()
23   - if not image_service:
24   - raise Exception("服务不存在!")
25   - service = Service.query.filter_by(guid=image_service.service_guid).one_or_none()
26   -
27   - if service.type.__eq__("ImageWMS"):
28   - xml = self.get_wms_capabilities(image_service)
29   -
30   - elif service.type.__eq__("ImageWMTS"):
31   - #arcgis能加载
32   - xml = self.get_wmts_capabilities(image_service,service)
33   - else:
34   - xml = ""
35   -
36   - r = Response(response=xml, status=200, mimetype="application/xml")
37   - r.headers["Content-Type"] = "text/xml; charset=utf-8"
38   - return r
39   -
40   - def get_wms_capabilities(self,image_service:ImageService):
41   -
42   - xml = '''<?xml version="1.0" encoding="utf-8" ?>
43   - <WMS_Capabilities version="1.2.0">
44   - <Service>
45   - <Name>WMS</Name>
46   - <Title>{service_title}</Title>
47   - <Abstract>{abstract}</Abstract>
48   - <Keywords>GIMS</Keywords>
49   - <OnlineResource/>
50   - <Fees>none</Fees>
51   - <AccessConstraints>none</AccessConstraints>
52   - </Service>
53   - <Capability>
54   - <Request>
55   - <GetCapabilities>
56   - <Format>text/xml</Format>
57   - <DCPType>
58   - <HTTP>
59   - <Get>
60   - <OnlineResource xlink:href="{url}" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
61   - </Get>
62   - </HTTP>
63   - </DCPType>
64   - </GetCapabilities>
65   - <GetMap>
66   - <Format>png</Format>
67   - <Format>jpeg</Format>
68   - <Format>gif</Format>
69   - <Format>image/png</Format>
70   - <Format>image/jpeg</Format>
71   - <Format>image/gif</Format>
72   - <DCPType>
73   - <HTTP>
74   - <Get>
75   - <OnlineResource xlink:href="{url}" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
76   - </Get>
77   - </HTTP>
78   - </DCPType>
79   - </GetMap>
80   - <Map>
81   - <Format>
82   - <PNG/>
83   - <GIF/>
84   - <JPG/>
85   - </Format>
86   - <DCPType>
87   - <HTTP>
88   - <Get onlineResource="{url}"/>
89   - </HTTP>
90   - </DCPType>
91   - </Map>
92   - <Capabilities>
93   - <Format>
94   - <WMS_XML/>
95   - </Format>
96   - <DCPType>
97   - <HTTP>
98   - <Get onlineResource="{url}"/>
99   - </HTTP>
100   - </DCPType>
101   - </Capabilities>
102   - <FeatureInfo>
103   - <Format>
104   - <XML/>
105   - <MIME/>
106   - </Format>
107   - <DCPType>
108   - <HTTP>
109   - <Get onlineResource="{url}"/>
110   - </HTTP>
111   - </DCPType>
112   - </FeatureInfo>
113   - </Request>
114   - <Exception>
115   - <Format>
116   - <WMS_XML/>
117   - <INIMAGE/>
118   - <BLANK/>
119   - </Format>
120   - </Exception>
121   - <Layer>
122   - <Name>{service_name}</Name>
123   - <Title>{service_title}</Title>
124   - <CRS>{crs}</CRS>
125   - <BoundingBox CRS="{crs}" maxx="{maxx}" maxy="{maxy}" minx="{minx}" miny="{miny}"/>
126   - <Layer queryable="1">
127   - <CRS>{crs}</CRS>
128   - <Name>{layer_name}</Name>
129   - <Title>{layer_title}</Title>
130   - <BoundingBox CRS="{crs}" maxx="{maxx}" maxy="{maxy}" minx="{minx}" miny="{miny}"/>
131   - </Layer>
132   - </Layer>
133   - </Capability>
134   - </WMS_Capabilities>'''
135   -
136   - extent = json.loads(image_service.extent)
137   - xml = xml.format(service_title=image_service.name,
138   - service_name=image_service.name,
139   - abstract= "None" ,
140   - crs="ESPG:4326",
141   - layer_name=image_service.name,
142   - layer_title=image_service.name,
143   - maxx=extent[2],
144   - maxy = extent[3],
145   - minx = extent[0],
146   - miny = extent[1],
147   - url="http://{}/API/Service/Image/WMS?guid={}".format(configure.deploy_ip_host,image_service.guid))
148   - return xml
149   -
150   - def get_wmts_capabilities(self, image_service: ImageService,service:Service):
151   - tile_scheme:TileScheme = TileScheme.query.filter_by(guid = image_service.scheme_guid).one_or_none()
152   - if not tile_scheme:
153   - raise Exception("切片方案不存在!")
154   -
155   - xml = '''<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">
156   - <!-- Service Identification -->
157   - <ows:ServiceIdentification>
158   - <ows:Title>{title}</ows:Title>
159   - <ows:ServiceType>OGC WMTS</ows:ServiceType>
160   - <ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
161   - </ows:ServiceIdentification>
162   -
163   - <!-- Operations Metadata -->
164   - <ows:OperationsMetadata>
165   - <ows:Operation name="GetCapabilities">
166   - <ows:DCP>
167   - <ows:HTTP>
168   - <ows:Get xlink:href="{capabilities_url}">
169   - <ows:Constraint name="GetEncoding">
170   - <ows:AllowedValues>
171   - <ows:Value>RESTful</ows:Value>
172   - </ows:AllowedValues>
173   - </ows:Constraint>
174   - </ows:Get>
175   -
176   - <!-- add KVP binding in 10.1 -->
177   - <ows:Get xlink:href="{tile_url}?">
178   - <ows:Constraint name="GetEncoding">
179   - <ows:AllowedValues>
180   - <ows:Value>KVP</ows:Value>
181   - </ows:AllowedValues>
182   - </ows:Constraint>
183   - </ows:Get>
184   - </ows:HTTP>
185   - </ows:DCP>
186   - </ows:Operation>
187   - <ows:Operation name="GetTile">
188   - <ows:DCP>
189   - <ows:HTTP>
190   - <ows:Get xlink:href="{tile_url}">
191   - <ows:Constraint name="GetEncoding">
192   - <ows:AllowedValues>
193   - <ows:Value>RESTful</ows:Value>
194   - </ows:AllowedValues>
195   - </ows:Constraint>
196   - </ows:Get>
197   - <ows:Get xlink:href="{tile_url}?">
198   - <ows:Constraint name="GetEncoding">
199   - <ows:AllowedValues>
200   - <ows:Value>KVP</ows:Value>
201   - </ows:AllowedValues>
202   - </ows:Constraint>
203   - </ows:Get>
204   - </ows:HTTP>
205   - </ows:DCP>
206   - </ows:Operation>
207   - </ows:OperationsMetadata>
208   -
209   - <Contents>
210   -
211   - <!-- Layer -->
212   -
213   -
214   - <Layer>
215   - <ows:Title>{title}</ows:Title>
216   - <ows:Identifier>{title}</ows:Identifier>
217   - <ows:BoundingBox crs="{crs}">
218   - <ows:LowerCorner>{xmin} {ymin}</ows:LowerCorner>
219   - <ows:UpperCorner>{xmax} {ymax}</ows:UpperCorner>
220   - </ows:BoundingBox>
221   -
222   - <Style isDefault="true">
223   - <ows:Title>Default Style</ows:Title>
224   - <ows:Identifier>default</ows:Identifier>
225   - </Style>
226   - <Format>image/png</Format>
227   - <TileMatrixSetLink>
228   - <TileMatrixSet>{tile_name}</TileMatrixSet>
229   - </TileMatrixSetLink>
230   -
231   - <ResourceURL format="image/png" resourceType="tile" template="{tile_url}"/>
232   -
233   - </Layer>
234   -
235   - <!-- TileMatrixSet -->
236   -
237   -
238   - <TileMatrixSet>
239   -
240   - <TileMatrix>
241   - <ows:Title>{tile_title}</ows:Title>
242   - <ows:Abstract>{tile_description}</ows:Abstract>
243   - <ows:Identifier>{tile_name}</ows:Identifier>
244   - <ows:SupportedCRS>{crs}</ows:SupportedCRS>
245   -
246   - {tile_matrix}
247   -
248   - </TileMatrix>
249   -
250   - </TileMatrixSet>
251   -
252   -
253   - </Contents>
254   - <ServiceMetadataURL xlink:href="{capabilities_url}"/>
255   - </Capabilities>'''
256   -
257   -
258   -
259   -
260   - tile_matrix_each = '''
261   - <TileMatrix>
262   - <ows:Identifier>{lev}</ows:Identifier>
263   - <ScaleDenominator>{scale}</ScaleDenominator>
264   - <TopLeftCorner>{top_left}</TopLeftCorner>
265   - <TileWidth>{cols}</TileWidth>
266   - <TileHeight>{rows}</TileHeight>
267   - </TileMatrix>
268   - '''
269   -
270   - tile_matrix = ""
271   - top_left = tile_scheme.top_left
272   - for level in json.loads(tile_scheme.levels):
273   - tile_matrix = "{}{}".format(tile_matrix,tile_matrix_each.format(lev=level["level"],
274   - scale=level["scale"],
275   - top_left=top_left,
276   - cols=tile_scheme.cols,
277   - rows=tile_scheme.rows))
278   -
279   - extent = json.loads(image_service.extent)
280   -
281   - xml = xml.format(capabilities_url = "http://{}/API/Service/Image/Capabilities?guid={}".format(configure.deploy_ip_host,image_service.guid),
282   - tile_url = "http://{}/API/Service/Image/Tile?guid={}".format(configure.deploy_ip_host,image_service.guid),
283   - crs = tile_scheme.crs,
284   - xmin = extent[0],
285   - ymin = extent[1],
286   - xmax = extent[2],
287   - ymax = extent[3],
288   - # TileMatrix = "{TileMatrix}",
289   - # TileRow = "{TileRow}",
290   - # TileCol = "{TileCol}",
291   - guid = image_service.guid,
292   - title = service.title,
293   - tile_title = tile_scheme.name,
294   - tile_name = tile_scheme.name,
295   - tile_description = tile_scheme.description,
296   - tile_matrix=tile_matrix
297   - )
298   -
299   - return xml
300   -
301   -
302   - api_doc = {
303   - "tags": ["影像接口"],
304   - "parameters": [
305   - {"name": "guid",
306   - "in": "formData",
307   - "type": "string",
308   - "description": "服务guid"},
309   - ],
310   - "responses": {
311   - 200: {
312   - "schema": {
313   - "properties": {
314   - }
315   - }
316   - }
317   - }
318   -}
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   -
9   -import json
10   -from app.util.component.FileProcess import FileProcess
11   -import datetime
12   -from app.modules.service.image.util.ThriftConnect import ThriftConnect
13   -import os
14   -from app.models import db
15   -from app.modules.service.models import Image
16   -from .util.ImageType import ImageType
17   -
18   -class Api(ApiTemplate):
19   -
20   - api_name = "影像数据列表"
21   -
22   - def process(self):
23   -
24   -
25   - # 返回结果
26   - res = {}
27   -
28   - try:
29   - data_server = self.para.get("data_server")
30   -
31   - path = self.para.get("path")
32   -
33   -
34   - if data_server.__eq__("本地服务器"):
35   - project_path = (os.path.dirname(os.path.abspath(__file__)))
36   -
37   - base_path = os.path.join(project_path, "data")
38   - if path:
39   - base_path = os.path.normpath(path)
40   -
41   - data_list: list = []
42   - for f in os.listdir(base_path):
43   -
44   - file_path = os.path.normpath(os.path.join(base_path, f))
45   - file_size, real_size = FileProcess.get_file_size(file_path)
46   -
47   - fctime = datetime.datetime.fromtimestamp(os.path.getctime(file_path)).strftime('%Y-%m-%d %H:%M:%S')
48   -
49   - file_info = {"name": f, "path": file_path, "size": file_size, "create_time": fctime,"real_size": real_size}
50   -
51   - if file_path.lower().endswith("tiff") or file_path.lower().endswith("tif") or file_path.lower().endswith("img") or os.path.isdir(file_path):
52   -
53   - exist_image: Image = Image.query.filter_by(path=os.path.normpath(file_info.get("path")),
54   - size=file_info.get("real_size")).one_or_none()
55   - file_info["exist"] = False
56   - if exist_image:
57   - if exist_image.server.__contains__(data_server):
58   - file_info["exist"] = True
59   -
60   - file_info["type"] = ImageType.get_type(file_path)
61   - data_list.append(file_info)
62   -
63   -
64   - info_dir = []
65   - info_img = []
66   - for dat in data_list:
67   -
68   - if dat["type"].__eq__("dir"):
69   - info_dir.append(dat)
70   - else:
71   - info_img.append(dat)
72   -
73   - info_dir = sorted(info_dir,key = lambda x: x["name"])
74   - info_img = sorted(info_img,key = lambda x: x["name"])
75   - info_dir.extend(info_img)
76   -
77   - res["data"] = info_dir
78   -
79   - else:
80   - thrift_connect = ThriftConnect(data_server)
81   - info= json.loads(thrift_connect.client.getImageList(path))
82   - thrift_connect.close()
83   -
84   -
85   - info_dir = []
86   - info_img = []
87   - for inf in info:
88   - if inf["path"].lower().endswith("tiff") or inf["path"].lower().endswith("tif") or inf["path"].lower().endswith("img"):
89   -
90   - exist_image = Image.query.filter_by(path=inf.get("path"),
91   - size=inf.get("real_size")).one_or_none()
92   - inf["exist"] = False
93   - if exist_image:
94   - if exist_image.server.__contains__(data_server):
95   - inf["exist"] = True
96   -
97   - if inf["type"].__eq__("dir"):
98   - info_dir.append(inf)
99   - else:
100   - info_img.append(inf)
101   -
102   - info_dir = sorted(info_dir, key = lambda x: x["name"])
103   - info_img = sorted(info_img, key = lambda x: x["name"])
104   - info_dir.extend(info_img)
105   -
106   - res["data"] = info_dir
107   -
108   - res["result"] = True
109   -
110   - except Exception as e:
111   - raise e
112   -
113   - return res
114   -
115   - api_doc = {
116   - "tags": ["影像接口"],
117   - "parameters": [
118   - {"name": "data_server",
119   - "in": "formData",
120   - "type": "string",
121   - "description": "data_server"},
122   - {"name": "path",
123   - "in": "formData",
124   - "type": "string",
125   - "description": "path"}
126   - ],
127   - "responses": {
128   - 200: {
129   - "schema": {
130   - "properties": {
131   - }
132   - }
133   - }
134   - }
135   - }
136   -
1   -<?xml version="1.0" encoding="utf-8" ?><CacheInfo xsi:type='typens:CacheInfo' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://www.esri.com/schemas/ArcGIS/10.1'><TileCacheInfo xsi:type='typens:TileCacheInfo'><SpatialReference xsi:type='typens:GeographicCoordinateSystem'><WKT>GEOGCS[&quot;GCS_China_Geodetic_Coordinate_System_2000&quot;,DATUM[&quot;D_China_2000&quot;,SPHEROID[&quot;CGCS2000&quot;,6378137.0,298.257222101]],PRIMEM[&quot;Greenwich&quot;,0.0],UNIT[&quot;Degree&quot;,0.0174532925199433],METADATA[&quot;China&quot;,73.66,7.16,134.85,53.59,0.0,0.0174532925199433,0.0,1067],AUTHORITY[&quot;EPSG&quot;,4490]]</WKT><XOrigin>-400</XOrigin><YOrigin>-400</YOrigin><XYScale>11258999068426.24</XYScale><ZOrigin>-100000</ZOrigin><ZScale>10000</ZScale><MOrigin>-100000</MOrigin><MScale>10000</MScale><XYTolerance>8.9831528411952133e-009</XYTolerance><ZTolerance>0.001</ZTolerance><MTolerance>0.001</MTolerance><HighPrecision>true</HighPrecision><LeftLongitude>-180</LeftLongitude><WKID>4490</WKID><LatestWKID>4490</LatestWKID></SpatialReference><TileOrigin xsi:type='typens:PointN'><X>-400</X><Y>399.99999999999977</Y></TileOrigin><TileCols>256</TileCols><TileRows>256</TileRows><DPI>96</DPI><PreciseDPI>96</PreciseDPI><LODInfos xsi:type='typens:ArrayOfLODInfo'><LODInfo xsi:type='typens:LODInfo'><LevelID>0</LevelID><Scale>1154287.473</Scale><Resolution>0.0027465820315218724</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>1</LevelID><Scale>577143.73640000005</Scale><Resolution>0.0013732910155229902</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>2</LevelID><Scale>288571.86820000003</Scale><Resolution>0.00068664550776149512</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>3</LevelID><Scale>144285.93410000001</Scale><Resolution>0.00034332275388074756</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>4</LevelID><Scale>72142.967059999995</Scale><Resolution>0.00017166137696416836</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>5</LevelID><Scale>36071.483529999998</Scale><Resolution>8.5830688482084179e-005</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>6</LevelID><Scale>18035.741760000001</Scale><Resolution>4.2915344229144793e-005</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>7</LevelID><Scale>9017.8708819999993</Scale><Resolution>2.1457672119331316e-005</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>8</LevelID><Scale>4508.9354409999996</Scale><Resolution>1.0728836059665658e-005</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>9</LevelID><Scale>2254.4677200000001</Scale><Resolution>5.3644180286430992e-006</Resolution></LODInfo><LODInfo xsi:type='typens:LODInfo'><LevelID>10</LevelID><Scale>1127.23386</Scale><Resolution>2.6822090143215496e-006</Resolution></LODInfo></LODInfos></TileCacheInfo><TileImageInfo xsi:type='typens:TileImageInfo'><CacheTileFormat>PNG32</CacheTileFormat><CompressionQuality>0</CompressionQuality><Antialiasing>false</Antialiasing></TileImageInfo><CacheStorageInfo xsi:type='typens:CacheStorageInfo'><StorageFormat>esriMapCacheStorageModeCompact</StorageFormat><PacketSize>128</PacketSize></CacheStorageInfo></CacheInfo>
\ No newline at end of file
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   -import datetime
9   -from app.modules.service.image.util.ThriftConnect import ThriftConnect
10   -from app.models import db
11   -from app.modules.service.models import Image
12   -from app.modules.data.models import Task
13   -import multiprocessing
14   -import uuid
15   -import configure
16   -from app.util.component.PGUtil import PGUtil
17   -from .util.Cache import Cache
18   -import json
19   -from osgeo import gdal
20   -from osgeo.gdal import *
21   -import traceback
22   -import os
23   -from app.util.component.TaskController import TaskController
24   -from app.util.component.TaskWriter import TaskWriter
25   -
26   -class Api(ApiTemplate):
27   -
28   - api_name = "创建影像金字塔"
29   -
30   - def process(self):
31   -
32   - # 返回结果
33   - res = {}
34   - try:
35   - image_guid = self.para.get("guid")
36   - task_guid = uuid.uuid1().__str__()
37   - image = Image.query.filter_by(guid=image_guid).one_or_none()
38   - if not image:
39   - raise Exception("数据不存在!")
40   - if image.has_pyramid==-1:
41   - raise Exception("数据正在创建金字塔!")
42   -
43   - image_service_info, zoo, servers = Cache.cache_data(None)
44   -
45   - image_servers = image.server.split(",")
46   - image_servers = [ser for ser in image_servers if ser in servers]
47   -
48   - if len(image_servers)==0:
49   - raise Exception("暂时没有可用数据服务器提供该影像相关服务!")
50   -
51   - #创建金字塔的进程
52   - build_process = multiprocessing.Process(target=self.build_pyramid_task,
53   - args=(image_guid,task_guid,image_servers,image.path))
54   - build_process.start()
55   -
56   - task = Task(guid=task_guid,
57   - name="{}创建金字塔".format(image.name),
58   - create_time=datetime.datetime.now(),
59   - state=0,
60   - task_type=5,
61   - creator=self.para.get("creator"),
62   - process="创建金字塔",
63   - task_pid=build_process.pid,
64   - parameter=image_guid)
65   -
66   - db.session.add(task)
67   - db.session.commit()
68   -
69   -
70   - res["data"] = "创建金字塔任务已提交!"
71   -
72   - res["result"] = True
73   -
74   - except Exception as e:
75   - raise e
76   -
77   - return res
78   -
79   - def build_pyramid_task(self,image_guid,task_guid,data_servers,path):
80   -
81   - task_writer = None
82   -
83   - try:
84   - #任务控制,等待执行
85   - TaskController.wait(task_guid)
86   - task_writer = TaskWriter(task_guid)
87   -
88   - #进入创建金字塔的状态
89   - task_writer.session.query(Image).filter_by(guid=image_guid).update({"has_pyramid": -1})
90   - task_writer.update_task({"state": 2})
91   -
92   - #所有数据节点的影像都要建金字塔
93   - update_size = None
94   - overview_count = None
95   - for data_server in data_servers:
96   - if data_server=="本地服务器":
97   - result = self.buildOverview(path)
98   - update_size = os.path.getsize(path)
99   - else:
100   - thrift_connect = ThriftConnect(data_server)
101   - image_info = json.loads(thrift_connect.client.getInfo(path))
102   - if image_info.get("overview_count") > 0:
103   - overview_count = image_info.get("overview_count")
104   - continue
105   - result = thrift_connect.client.buildOverview(path)
106   - update_size = json.loads(thrift_connect.client.getInfo(path)).get("size")
107   - thrift_connect.close()
108   -
109   - task_writer.update_task({"state":1,"update_time":datetime.datetime.now()})
110   -
111   - image:Image = task_writer.session.query(Image).filter_by(guid=image_guid).one_or_none()
112   -
113   - if not overview_count:
114   - overview_count = 0
115   - raster_x_size = image.raster_x_size
116   - raster_y_size = image.raster_y_size
117   - while raster_x_size * raster_y_size > 65536:
118   - raster_x_size /= 2.0
119   - raster_y_size /= 2.0
120   - overview_count += 1
121   -
122   - image.has_pyramid = 1
123   - image.overview_count = overview_count
124   - if update_size:
125   - image.size = update_size
126   - except:
127   - task_writer.session.query(Image).filter_by(guid=image_guid).update({"has_pyramid": 0})
128   - task_writer.update_task({"state": -1,"update_time":datetime.datetime.now()})
129   - finally:
130   - task_writer.session.commit()
131   - task_writer.close()
132   -
133   - def buildOverview(self,path):
134   - image: Dataset = gdal.Open(path, 1)
135   - result =True
136   - try:
137   - overviews=[]
138   - raster_x_size = image.RasterXSize
139   - raster_y_size = image.RasterYSize
140   - while raster_x_size*raster_y_size>65536:
141   - raster_x_size /= 2.0
142   - raster_y_size /= 2.0
143   - overviews.append(round(image.RasterXSize/raster_x_size))
144   - band: Band = image.GetRasterBand(1)
145   - if len(overviews) == band.GetOverviewCount():
146   - pass
147   - else:
148   - image.BuildOverviews("AVERAGE",overviews)
149   - except Exception as e:
150   - print(traceback.format_exc())
151   - result = False
152   - finally:
153   - del image
154   - return result
155   -
156   - api_doc = {
157   - "tags": ["影像接口"],
158   - "parameters": [
159   - {"name": "guid",
160   - "in": "formData",
161   - "type": "string",
162   - "description": "guid"},
163   - ],
164   - "responses": {
165   - 200: {
166   - "schema": {
167   - "properties": {
168   - }
169   - }
170   - }
171   - }
172   - }
173   -
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   -import json
9   -from ..models import Image
10   -import datetime
11   -from app.models import db
12   -
13   -
14   -class Api(ApiTemplate):
15   -
16   - api_name = "注册影像数据"
17   -
18   - def process(self):
19   -
20   - #可以注册一个目录
21   - #返回结果
22   - res = {}
23   -
24   - try:
25   - data_server = self.para.get("data_server")
26   - paths = json.loads(self.para.get("paths"))
27   -
28   - for path in paths:
29   -
30   - exist_image:Image = Image.query.filter_by(path=path.get("path"),
31   - size=path.get("real_size")).one_or_none()
32   - if exist_image:
33   - servers = exist_image.server.split(",")
34   - leave_servers = [ser for ser in servers if not ser.__eq__(data_server)]
35   - if len(leave_servers) ==0:
36   - db.session.delete(exist_image)
37   - else:
38   - Image.query.filter_by(path=path.get("path"),
39   - size=path.get("real_size")).update({"server":",".join(leave_servers),
40   - "update_time":datetime.datetime.now()})
41   - else:
42   - raise Exception("数据不存在!")
43   -
44   - db.session.commit()
45   - res["result"] = True
46   -
47   - except Exception as e:
48   - raise e
49   -
50   - return res
51   -
52   -
53   - api_doc = {
54   - "tags": ["影像接口"],
55   - "parameters": [
56   - {"name": "data_server",
57   - "in": "formData",
58   - "type": "string",
59   - "description": "data_server"},
60   - {"name": "paths",
61   - "in": "formData",
62   - "type": "string",
63   - "description": "paths"},
64   - ],
65   - "responses": {
66   - 200: {
67   - "schema": {
68   - "properties": {
69   - }
70   - }
71   - }
72   - }
73   - }
74   -
75   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/9/8
4   -#email: nheweijun@sina.com
5   -
6   -
7   -
8   -from app.util.component.ApiTemplate import ApiTemplate
9   -from app.modules.service.models import Image,db,ImageTag
10   -import datetime
11   -
12   -class Api(ApiTemplate):
13   -
14   - api_name = "修改影像数据"
15   -
16   - def process(self):
17   -
18   - # 返回结果
19   - res = {}
20   - try:
21   - para = self.para
22   - guid = self.para.get("guid")
23   - tag_guids = self.para.get("tag_guids")
24   -
25   - image = Image.query.filter_by(guid=guid)
26   - this_time = datetime.datetime.now()
27   -
28   - del para["guid"]
29   - if para.get("tag_guids"):
30   - del para["tag_guids"]
31   -
32   - if para or tag_guids:
33   - para["update_time"] = this_time
34   - image.update(para)
35   -
36   - if tag_guids:
37   - tags = ImageTag.query.filter(ImageTag.guid.in_(tag_guids.split(","))).all()
38   - img = Image.query.filter_by(guid=guid).one_or_none()
39   - img.image_tags = tags
40   -
41   -
42   - db.session.commit()
43   -
44   - res["result"] = True
45   - except Exception as e:
46   - raise e
47   -
48   - return res
49   -
50   -
51   - api_doc = {
52   - "tags": ["影像接口"],
53   - "parameters": [
54   - {"name": "guid",
55   - "in": "formData",
56   - "type": "string"},
57   - {"name": "alias",
58   - "in": "formData",
59   - "type": "string"},
60   - {"name": "collect_time",
61   - "in": "formData",
62   - "type": "string","description":"成像时间字符串"},
63   - {"name": "region",
64   - "in": "formData",
65   - "type": "string", "description": "所属区域"},
66   - {"name": "satellite",
67   - "in": "formData",
68   - "type": "string", "description": "卫星类型"},
69   - {"name": "crs",
70   - "in": "formData",
71   - "type": "string", "description": "空间参考"},
72   - {"name": "band_view",
73   - "in": "formData",
74   - "type": "string", "description": "波段设计[1,1,1]"},
75   - {"name": "tag_guids",
76   - "in": "formData",
77   - "type": "string", "description": "tags"},
78   - ],
79   - "responses": {
80   - 200: {
81   - "schema": {
82   - "properties": {
83   - }
84   - }
85   - }
86   - }
87   - }
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   -
10   -from app.modules.service.models import Image,ImageTag
11   -from app.util.component.FileProcess import FileProcess
12   -
13   -class Api(ApiTemplate):
14   -
15   - api_name = "影像数据Info"
16   -
17   - def process(self):
18   -
19   - # 返回结果
20   - res = {}
21   - try:
22   -
23   - guid = self.para.get("guid")
24   -
25   - image = Image.query.filter_by(guid=guid).one_or_none()
26   - if not image:
27   - raise Exception("数据不存在!")
28   - tags:ImageTag = image.image_tags
29   - # tag_names = [tag.name for tag in tags]
30   -
31   - res["data"] = ModelVisitor.object_to_json(image)
32   -
33   - #格式化数据
34   -
35   - res["data"]["size"] = FileProcess.get_text_size(res["data"]["size"])
36   - res["data"]["cell_x_size"] = round(res["data"]["cell_x_size"],3)
37   - res["data"]["cell_y_size"] = round(res["data"]["cell_y_size"], 3)
38   -
39   - res["data"]["image_tags"] = ModelVisitor.objects_to_jsonarray(tags)
40   - res["result"] = True
41   - except Exception as e:
42   - raise e
43   -
44   - return res
45   -
46   -
47   - api_doc = {
48   - "tags": ["影像接口"],
49   - "parameters": [
50   - {"name": "guid",
51   - "in": "formData",
52   - "type": "string"},
53   - ],
54   - "responses": {
55   - 200: {
56   - "schema": {
57   - "properties": {
58   - }
59   - }
60   - }
61   - }
62   - }
63   -
64   -
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.util.component.FileProcess import FileProcess
10   -from app.modules.service.models import Image,ImageTag
11   -from sqlalchemy import or_
12   -import datetime
13   -
14   -class Api(ApiTemplate):
15   -
16   - api_name = "影像数据List"
17   -
18   - def process(self):
19   -
20   - # 返回结果
21   - res = {}
22   - try:
23   - page_index = int(self.para.get("page_index", "0"))
24   - page_size = int(self.para.get("page_size", "10"))
25   -
26   - alias = self.para.get("alias")
27   - name = self.para.get("name")
28   - band = self.para.get("band")
29   - region = self.para.get("region")
30   - tag_guids = self.para.get("tag_guids")
31   - collect_time = self.para.get("collect_time")
32   -
33   - type = self.para.get("type")
34   -
35   - images = Image.query.order_by(Image.update_time.desc())
36   -
37   - # 并集
38   - if alias and name:
39   - images = images.filter(or_(Image.alias.like("%" + alias + "%") , Image.name.like("%" + name + "%")))
40   - else:
41   - if alias:
42   - images = images.filter(Image.alias.like("%" + alias + "%"))
43   - if name:
44   - images = images.filter(Image.name.like("%" + name + "%"))
45   - if band:
46   - images = images.filter(Image.band_view.like("%" + str(band) + "%"))
47   -
48   - if type:
49   - images = images.filter_by(type=type)
50   -
51   - if region:
52   - images = images.filter(Image.region.in_(region.split(",")))
53   -
54   - if collect_time:
55   - begin,end = collect_time.split(",")
56   - begin:datetime.datetime= datetime.datetime.strptime(begin,"%Y-%m-%d")
57   -
58   - end = datetime.datetime.strptime(end, "%Y-%m-%d")
59   - images = images.filter(Image.collect_time.__ge__(begin)).filter(Image.collect_time.__le__(end))
60   -
61   - if tag_guids:
62   - tag_guids = tag_guids.split(",")
63   - tags = ImageTag.query.filter(ImageTag.guid.in_(tag_guids)).all()
64   - images_guid = []
65   - for tag in tags:
66   - images_guid.extend([img.guid for img in tag.images.all()])
67   - images = images.filter(Image.guid.in_(images_guid))
68   -
69   -
70   -
71   -
72   - res["data"] = {}
73   - res["data"]["count"] = images.count()
74   - imgs = images.limit(page_size).offset(page_index * page_size).all()
75   - res["data"]["list"] = ModelVisitor.objects_to_jsonarray(imgs)
76   -
77   - #格式化数据
78   - for info in res["data"]["list"]:
79   - info["size"] = FileProcess.get_text_size(info["size"])
80   - info["cell_x_size"] = round(info["cell_x_size"],3)
81   - info["cell_y_size"] = round(info["cell_y_size"], 3)
82   - res["result"] = True
83   -
84   - except Exception as e:
85   - raise e
86   -
87   - return res
88   -
89   -
90   - api_doc = {
91   - "tags": ["影像接口"],
92   - "parameters": [
93   - {"name": "page_index",
94   - "in": "formData",
95   - "type": "int",
96   - "description": "页"},
97   - {"name": "page_size",
98   - "in": "formData",
99   - "type": "int",
100   - "description": "页大小"},
101   - {"name": "alias",
102   - "in": "formData",
103   - "type": "string"},
104   - {"name": "name",
105   - "in": "formData",
106   - "type": "string"},
107   - {"name": "collect_time",
108   - "in": "formData",
109   - "type": "string"},
110   - {"name": "region",
111   - "in": "formData",
112   - "type": "string"},
113   - {"name": "type",
114   - "in": "formData",
115   - "type": "string"},
116   - {"name": "band",
117   - "in": "formData",
118   - "type": "string"},
119   - {"name": "tag_guids",
120   - "in": "formData",
121   - "type": "string"},
122   - ],
123   - "responses": {
124   - 200: {
125   - "schema": {
126   - "properties": {
127   - }
128   - }
129   - }
130   - }
131   - }
132   -
133   -
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.StructuredPrint import StructurePrint
9   -
10   -from app.modules.service.models import Image
11   -
12   -import random
13   -
14   -import numpy
15   -import json
16   -from flask import Response
17   -from kazoo.client import KazooClient
18   -import configure
19   -import traceback
20   -
21   -from .util.ImageData import ImageData
22   -from .util.Opencv import Opencv
23   -from app.util.component.ModelVisitor import ModelVisitor
24   -
25   -class Api(ApiTemplate):
26   -
27   - api_name = "影像数据预览功能"
28   -
29   - def process(self):
30   - from app import GLOBAL_DIC
31   -
32   - # 返回结果
33   - res = {}
34   -
35   - try:
36   -
37   - #获取
38   - zoo = GLOBAL_DIC.get("zookeeper")
39   - if zoo is None:
40   - zoo :KazooClient = KazooClient(hosts=configure.zookeeper, timeout=100)
41   - zoo.start()
42   - GLOBAL_DIC["zookeeper"] = zoo
43   - StructurePrint().print("连接zoo")
44   - else :
45   - if not zoo.connected:
46   - zoo.start()
47   -
48   - guid = self.para.get("guid")
49   -
50   - width = int(self.para.get("width") if self.para.get("width") else 512)
51   - height = int(self.para.get("height") if self.para.get("height") else 512)
52   - format = self.para.get("format") if self.para.get("format") else "image/jpeg"
53   -
54   - image = Image.query.filter_by(guid=guid).one_or_none()
55   - # 该影像的服务器,随机选取一个
56   - image_servers = image.server.split(",")
57   - image_servers = [ser for ser in image_servers if zoo.exists("/rpc/{}".format(ser)) or ser.__eq__("本地服务器") ]
58   - if len(image_servers) > 0:
59   - indx = int(random.random() * len(image_servers))
60   - image_server = image_servers[indx]
61   - else:
62   - image_server = "None"
63   -
64   - bands = json.loads(image.band_view)
65   -
66   -
67   -
68   - #计算查询范围,保持正常比例
69   - query_extent = json.loads(image.extent)
70   - if query_extent[2]-query_extent[0] > query_extent[3]-query_extent[1]:
71   - offset = ((query_extent[2]-query_extent[0]) - (query_extent[3]-query_extent[1])) / 2.0
72   - query_extent = [query_extent[0],query_extent[1] - offset ,query_extent[2],query_extent[3] + offset]
73   - else:
74   - offset = ((query_extent[3] - query_extent[1]) - (query_extent[2] - query_extent[0])) / 2.0
75   - query_extent = [query_extent[0] - offset, query_extent[1], query_extent[2] + offset, query_extent[3]]
76   -
77   - image_data = ImageData(image_server, ModelVisitor.object_to_json(image))
78   -
79   - pixel_array_t = image_data.get_data(query_extent, bands, height, width)
80   -
81   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
82   -
83   - for ii in [0, 1, 2]:
84   - # opencv 颜色排序为BGR
85   - pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
86   -
87   - # 将图片生成在内存中,然后直接返回response
88   - im_data = Opencv.create_image(format, pixel_array, 30)
89   -
90   - except Exception as e:
91   - StructurePrint().print(traceback.format_exc())
92   - raise e
93   -
94   - return Response(im_data, mimetype=format)
95   -
96   - api_doc = {
97   - "tags": ["影像接口"],
98   - "parameters": [
99   - {"name": "guid",
100   - "in": "formData",
101   - "type": "string"},
102   - {"name": "height",
103   - "in": "formData",
104   - "type": "string"},
105   - {"name": "width",
106   - "in": "formData",
107   - "type": "string"},
108   - {"name": "format",
109   - "in": "formData",
110   - "type": "string",
111   - "enum":["image/jpeg","image/png"]},
112   - ],
113   - "responses": {
114   - 200: {
115   - "schema": {
116   - "properties": {
117   - }
118   - }
119   - }
120   - }
121   - }
122   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/7/19
4   -#email: nheweijun@sina.com
5   -
6   -
7   -from osgeo import gdal,osr
8   -from osgeo.gdal import Dataset,Band
9   -from app.util.component.ApiTemplate import ApiTemplate
10   -from app.modules.service.image.util.ThriftConnect import ThriftConnect
11   -import json
12   -from ..models import Image
13   -import datetime
14   -from app.models import db
15   -import uuid
16   -import os
17   -from .util.ImageType import ImageType
18   -from .util.Cache import Cache
19   -
20   -class Api(ApiTemplate):
21   -
22   - api_name = "refresh影像数据"
23   -
24   - def process(self):
25   -
26   - #可以注册一个目录
27   - #返回结果
28   - res = {}
29   -
30   - try:
31   - guid = self.para.get("guid")
32   - image:Image = Image.query.filter_by(guid=guid).one_or_none()
33   -
34   - image_service_info, zoo, servers = Cache.cache_data(None)
35   - image_servers = image.server.split(",")
36   - image_servers = [ser for ser in image_servers if ser in servers]
37   -
38   - data_server = image_servers[0]
39   -
40   -
41   - if data_server.__eq__("本地服务器"):
42   -
43   - img: Dataset = gdal.Open(image.path, 0)
44   - geo = img.GetGeoTransform()
45   -
46   - origin = osr.SpatialReference()
47   - origin.ImportFromWkt(img.GetProjection())
48   -
49   - authority_code = origin.GetAuthorityCode(None)
50   - band_count = img.RasterCount
51   - band: Band = img.GetRasterBand(1)
52   - count = band.GetOverviewCount()
53   - nodatavalue = band.GetNoDataValue()
54   - left_top = (geo[0], geo[3])
55   -
56   - right_buttom = (geo[0] + geo[1] * img.RasterXSize, geo[3] + geo[5] * img.RasterYSize)
57   - origin_extent = [left_top[0], right_buttom[1], right_buttom[0], left_top[1]]
58   -
59   - update_info = {"band_count": band_count,
60   - "band_view":image.band_view if band_count>=3 else "[1,1,1]",
61   - "overview_count": count,
62   - "raster_x_size": image.RasterXSize,
63   - "raster_y_size": image.RasterYSize,
64   - "cell_x_size": geo[1],
65   - "cell_y_size": geo[5],
66   - "extent": origin_extent,
67   - "null_value": nodatavalue,
68   - "size":os.path.getsize(image.path),
69   - "crs_wkt": image.GetProjection(),
70   - "crs": authority_code,
71   - "crs_proj4": origin.ExportToProj4(),
72   - "update_time":datetime.datetime.now()
73   - }
74   -
75   - del img
76   -
77   - else:
78   - thrift_connect = ThriftConnect(data_server)
79   -
80   - info = json.loads(thrift_connect.client.getInfo(image.path))
81   - thrift_connect.close()
82   -
83   - update_info = {"band_count": info.get("band_count"),
84   - "band_view":image.band_view if info.get("band_count")>=3 else "[1,1,1]",
85   - "overview_count": info.get("overview_count"),
86   - "raster_x_size" : info["xy_size"][0],
87   - "raster_y_size" : info["xy_size"][1],
88   - "cell_x_size" : info.get("cell_x_size"),
89   - "cell_y_size" : abs(info.get("cell_y_size")),
90   - "extent": json.dumps(info["origin_extent"]),
91   - "null_value": info.get("null_value"),
92   - "size":info.get("size"),
93   - "crs" : str(info.get("crs")),
94   - "crs_wkt" : info.get("crs_wkt"),
95   - "crs_proj4" : info.get("crs_proj4"),
96   - "update_time":datetime.datetime.now()
97   - }
98   - Image.query.filter_by(guid=guid).update(update_info)
99   - db.session.commit()
100   - except:
101   - raise Exception("刷新影像数据信息失败!")
102   -
103   - res["result"] = True
104   - return res
105   -
106   - api_doc = {
107   - "tags": ["影像接口"],
108   - "parameters": [
109   - {"name": "guid",
110   - "in": "formData",
111   - "type": "string",
112   - "description": "image_guid"},
113   - ],
114   - "responses": {
115   - 200: {
116   - "schema": {
117   - "properties": {
118   - }
119   - }
120   - }
121   - }
122   - }
123   -
124   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/7/19
4   -#email: nheweijun@sina.com
5   -
6   -
7   -from osgeo import gdal,osr
8   -from osgeo.gdal import Dataset,Band
9   -from app.util.component.ApiTemplate import ApiTemplate
10   -from app.modules.service.image.util.ThriftConnect import ThriftConnect
11   -import json
12   -from ..models import Image
13   -import datetime
14   -from app.models import db
15   -import uuid
16   -import os
17   -from ..models import ImageTag
18   -from .util.ImageType import ImageType
19   -
20   -class Api(ApiTemplate):
21   -
22   - api_name = "注册影像数据"
23   -
24   - def process(self):
25   -
26   - #可以注册一个目录
27   - #返回结果
28   - res = {}
29   -
30   - try:
31   - data_server = self.para.get("data_server")
32   - paths = json.loads(self.para.get("paths"))
33   - tag_guids = self.para.get("tag_guids")
34   - if tag_guids:
35   - tags = db.session.query(ImageTag).filter(ImageTag.guid.in_(tag_guids.split(","))).all()
36   - else:
37   - tags = []
38   -
39   -
40   - #注册某影像
41   - infos = []
42   -
43   - if data_server.__eq__("本地服务器"):
44   -
45   - image_paths = list(self.recur_paths_local(paths))
46   -
47   - for image_info in image_paths:
48   -
49   - image: Dataset = gdal.Open(image_info["path"], 0)
50   - geo = image.GetGeoTransform()
51   -
52   - origin = osr.SpatialReference()
53   - origin.ImportFromWkt(image.GetProjection())
54   -
55   - authority_code = origin.GetAuthorityCode(None)
56   - band_count = image.RasterCount
57   - band: Band = image.GetRasterBand(1)
58   - count = band.GetOverviewCount()
59   - nodatavalue = band.GetNoDataValue()
60   - left_top = (geo[0], geo[3])
61   -
62   - right_buttom = (geo[0] + geo[1] * image.RasterXSize, geo[3] + geo[5] * image.RasterYSize)
63   -
64   -
65   - origin_extent = [left_top[0], right_buttom[1], right_buttom[0], left_top[1]]
66   -
67   -
68   - info = {"band_count": band_count,
69   - "band_view":"[1,2,3]" if band_count>=3 else "[1,1,1]",
70   - "overview_count": count,
71   - "path":image_info["path"],
72   - "xy_size": [image.RasterXSize, image.RasterYSize],
73   - "origin_extent": origin_extent,
74   - "null_value": nodatavalue,
75   - "size":os.path.getsize(image_info["path"]),
76   - "crs_wkt": image.GetProjection(),
77   - "crs": authority_code,
78   - "crs_proj4": origin.ExportToProj4(),
79   - "cell_x_size": geo[1],
80   - "cell_y_size": geo[5]
81   - }
82   -
83   - infos.append(info)
84   - del image
85   -
86   - #分布式下,从thrift获取信息
87   - else:
88   - thrift_connect = ThriftConnect(data_server)
89   - image_paths = list(self.recur_paths_remote(paths,thrift_connect.client))
90   - for image_info in image_paths:
91   - infos.append(json.loads(thrift_connect.client.getInfo(image_info["path"])))
92   - thrift_connect.close()
93   -
94   - this_time = datetime.datetime.now()
95   -
96   -
97   - for info in infos:
98   -
99   - exist_image = Image.query.filter_by(path=os.path.normpath(info.get("path")), size=info.get("size")).one_or_none()
100   - if exist_image:
101   - if exist_image.server.__contains__(data_server):
102   - pass
103   - else:
104   - Image.query.filter_by(path=os.path.normpath(info.get("path")),
105   - size=info.get("size")).update({"server":"{},{}".format(exist_image.server,data_server)})
106   - else:
107   - img:Image = Image(guid= uuid.uuid1().__str__(),
108   - overview_count=info.get("overview_count"),
109   - has_pyramid = 1 if info.get("overview_count")>0 else 0,
110   - raster_x_size=info["xy_size"][0],
111   - raster_y_size=info["xy_size"][1],
112   - cell_x_size = info.get("cell_x_size"),
113   - cell_y_size = abs(info.get("cell_y_size")),
114   - name=os.path.basename(info.get("path")),
115   - alias = os.path.basename(info.get("path")),
116   - extent=json.dumps(info["origin_extent"]),
117   - null_value=info.get("null_value"),
118   - server=data_server,
119   - path = os.path.normpath(info.get("path")),
120   - size=info.get("size"),
121   - crs = str(info.get("crs")),
122   - crs_wkt = info.get("crs_wkt"),
123   - crs_proj4= info.get("crs_proj4"),
124   - band_count=info.get("band_count"),
125   - band_view = "[1,2,3]" if info.get("band_count")>=3 else "[1,1,1]",
126   - create_time=this_time,
127   - update_time=this_time,
128   - type = ImageType.get_type(info.get("path"))
129   - )
130   - for tag in tags:
131   - img.image_tags.append(tag)
132   - db.session.add(img)
133   - db.session.commit()
134   - res["result"] = True
135   -
136   - except Exception as e:
137   - raise e
138   -
139   - return res
140   -
141   - def recur_paths_local(self,paths):
142   - for path in paths:
143   - if path["type"].__eq__("dir"):
144   - data_list: list = []
145   - for f in os.listdir(path["path"]):
146   - file_path = os.path.normpath(os.path.join(path["path"], f))
147   - file_info = {"name": f, "path": file_path}
148   - if file_path.lower().endswith("tiff") or file_path.lower().endswith("tif"):
149   - file_info["type"] = "tif"
150   - data_list.append(file_info)
151   - elif file_path.lower().endswith("img"):
152   - file_info["type"] = "img"
153   - data_list.append(file_info)
154   - elif os.path.isdir(file_path):
155   - file_info["type"] = "dir"
156   - data_list.append(file_info)
157   - for p in self.recur_paths_local(data_list):
158   - yield p
159   - else:
160   - yield path
161   -
162   - def recur_paths_remote(self,paths,client):
163   - for path in paths:
164   - if path["type"].__eq__("dir"):
165   - path_list = json.loads(client.getImageList(path["path"]))
166   - for p in self.recur_paths_remote(path_list,client):
167   - yield p
168   - else:
169   - yield path
170   - api_doc = {
171   - "tags": ["影像接口"],
172   - "parameters": [
173   - {"name": "data_server",
174   - "in": "formData",
175   - "type": "string",
176   - "description": "data_server"},
177   - {"name": "paths",
178   - "in": "formData",
179   - "type": "string",
180   - "description": "paths"},
181   - {"name": "tags",
182   - "in": "formData",
183   - "type": "string",
184   - "description": "tags以,相隔"}
185   - ],
186   - "responses": {
187   - 200: {
188   - "schema": {
189   - "properties": {
190   - }
191   - }
192   - }
193   - }
194   - }
195   -
196   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/7/19
4   -#email: nheweijun@sina.com
5   -
6   -from app.util.component.ApiTemplate import ApiTemplate
7   -
8   -from kazoo.client import KazooClient
9   -import configure
10   -class Api(ApiTemplate):
11   -
12   - api_name = "获取数据服务器列表"
13   -
14   - def process(self):
15   -
16   - # 返回结果
17   - res = {}
18   - res["data"] = []
19   - try:
20   - zoo :KazooClient = KazooClient(hosts=configure.zookeeper, timeout=1)
21   - zoo.start()
22   - sers = zoo.get_children("/rpc")
23   -
24   - for p in sers:
25   - bl = str( zoo.get("/rpc/{}".format(p))[0] , encoding = "utf-8")
26   - res["data"].append({"name": p, "belong": bl})
27   - zoo.close()
28   - except Exception as e:
29   - pass
30   - res["data"].append({"name": "本地服务器", "belong": ""})
31   - res["result"] = True
32   - return res
33   -
34   - api_doc = {
35   - "tags": ["影像接口"],
36   - "parameters": [
37   - ],
38   - "responses": {
39   - 200: {
40   - "schema": {
41   - "properties": {
42   - }
43   - }
44   - }
45   - }
46   - }
47   -
48   -if __name__ == '__main__':
49   - zoo: KazooClient = KazooClient(hosts="172.26.99.168:2181", timeout=100)
50   - zoo.start()
51   - print(zoo.get_children("/rpc"))
52   - zoo.stop()
53   - zoo.close()
\ No newline at end of file
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 ..models import Service,ImageService,Image,db,ServiceFunction,TileScheme
9   -import datetime
10   -import json
11   -import configure
12   -import uuid
13   -import os
14   -import cv2
15   -import numpy
16   -import random
17   -from kazoo.client import KazooClient
18   -from .util.ImageData import ImageData
19   -from .util.MyThread import MyThread
20   -from app.util.component.ModelVisitor import ModelVisitor
21   -class Api(ApiTemplate):
22   -
23   - api_name = "修改影像服务"
24   -
25   - def process(self):
26   -
27   - # 返回结果
28   - res = {}
29   -
30   - try:
31   -
32   - guid = self.para.get("guid")
33   - service = Service.query.filter_by(guid=guid)
34   - this_time = datetime.datetime.now()
35   - image_guids = self.para.get("image_guids")
36   - functions = self.para.get("functions")
37   -
38   - service_update = {}
39   - image_update = {}
40   -
41   - for key in self.para.keys():
42   - if key in ["name","title","state","description","catalog_guid"]:
43   - service_update[key] = self.para.get(key)
44   - if key in ["name","scheme_guid"]:
45   - image_update[key] = self.para.get(key)
46   -
47   - #修改切片方案的处理
48   - if self.para.get("scheme_guid"):
49   - tilesche = TileScheme.query.filter_by(guid=self.para.get("scheme_guid")).one_or_none()
50   - image_update["scheme"] = json.dumps(ModelVisitor.object_to_json(tilesche))
51   -
52   - image_service = ImageService.query.filter_by(service_guid=guid)
53   -
54   - # 修改功能
55   - if functions:
56   - new_types = functions.split(",")
57   - old_functions = ServiceFunction.query.filter_by(service_guid=guid).all()
58   - for function in old_functions:
59   - if function.type not in new_types:
60   - db.session.delete(function)
61   - for new_type in new_types:
62   - if new_type not in [fun.type for fun in old_functions]:
63   - service_function = ServiceFunction(guid=uuid.uuid1().__str__(),type=new_type,
64   - service_guid=guid)
65   - db.session.add(service_function)
66   -
67   - #修改影像
68   - image_service_exetent = []
69   - if image_guids:
70   - imgservice:ImageService = image_service.one_or_none()
71   - imgservice.images = []
72   -
73   - for g in image_guids.split(","):
74   - image = Image.query.filter_by(guid=g).one_or_none()
75   - if image:
76   - image_extent = json.loads(image.extent)
77   - if not image_service_exetent:
78   - image_service_exetent = image_extent
79   - else:
80   - image_service_exetent[0] = min(image_extent[0], image_service_exetent[0])
81   - image_service_exetent[1] = min(image_extent[1], image_service_exetent[1])
82   - image_service_exetent[2] = max(image_extent[2], image_service_exetent[2])
83   - image_service_exetent[3] = max(image_extent[3], image_service_exetent[3])
84   - imgservice.images.append(image)
85   - image_update["extent"] = json.dumps(image_service_exetent)
86   -
87   - if image_update:
88   - image_service.update(image_update)
89   -
90   - if service_update or image_update or functions:
91   - service_update["update_time"] = this_time
92   -
93   - if image_guids:
94   - overview_file = self.get_overview(image_guids,image_service_exetent)
95   - service_update["overview"] = "http://{}/API/Service/Overview/{}".format(configure.deploy_ip_host, overview_file)
96   -
97   - service.update(service_update)
98   -
99   - db.session.commit()
100   - res["result"] = True
101   -
102   - except Exception as e:
103   - db.session.rollback()
104   - raise e
105   -
106   - return res
107   -
108   - def get_overview(self,guids,image_service_exetent):
109   - from app import GLOBAL_DIC
110   -
111   - intersect_image = Image.query.filter(Image.guid.in_(guids.split(","))).all()
112   - query_extent = image_service_exetent
113   -
114   - if query_extent[2] - query_extent[0] > query_extent[3] - query_extent[1]:
115   - offset = ((query_extent[2] - query_extent[0]) - (query_extent[3] - query_extent[1])) / 2.0
116   - query_extent = [query_extent[0], query_extent[1] - offset, query_extent[2],
117   - query_extent[3] + offset]
118   - else:
119   - offset = ((query_extent[3] - query_extent[1]) - (query_extent[2] - query_extent[0])) / 2.0
120   - query_extent = [query_extent[0] - offset, query_extent[1], query_extent[2] + offset,
121   - query_extent[3]]
122   -
123   - height = 512
124   - width = 512
125   -
126   -
127   - # 缓存zookeeper
128   - zoo = GLOBAL_DIC.get("zookeeper")
129   - if zoo is None:
130   - zoo: KazooClient = KazooClient(hosts=configure.zookeeper, timeout=100)
131   - zoo.start()
132   - GLOBAL_DIC["zookeeper"] = zoo
133   - else:
134   - if not zoo.connected:
135   - zoo.start()
136   -
137   - servers = GLOBAL_DIC.get("servers")
138   - if servers is None:
139   - servers = zoo.get_children("/rpc")
140   - servers.append("本地服务器")
141   - GLOBAL_DIC["servers"] = servers
142   - else:
143   - servers = GLOBAL_DIC.get("servers")
144   -
145   -
146   - if len(intersect_image) > 1:
147   -
148   - # 结果矩阵
149   - empty_list = [numpy.zeros((height, width), dtype=int) + 65536,
150   - numpy.zeros((height, width), dtype=int) + 65536,
151   - numpy.zeros((height, width), dtype=int) + 65536]
152   -
153   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
154   - thread_list = []
155   -
156   - for image in intersect_image:
157   - # 该影像的服务器,随机选取一个
158   - image_servers = image.server.split(",")
159   - image_servers = [ser for ser in image_servers if ser in servers]
160   - if len(image_servers) > 0:
161   - indx = int(random.random() * len(image_servers))
162   - image_server = image_servers[indx]
163   - else:
164   - image_server = "None"
165   - bands = json.loads(image.band_view)
166   -
167   - image_data = ImageData(image_server, ModelVisitor.object_to_json(image))
168   -
169   - thread: MyThread = MyThread(image_data.get_data, args=(query_extent, bands, height, width))
170   - thread.start()
171   - thread_list.append(thread)
172   -
173   - for thread in thread_list:
174   - thread.join()
175   - data = thread.get_result()
176   -
177   - # 掩膜在中央接口生成,合图
178   - mask = numpy.zeros((height, width), dtype=int)
179   - mask2 = numpy.zeros((height, width), dtype=int)
180   - jizhun = data[:, :, 0]
181   - mask[jizhun == 65536] = 1
182   - mask[jizhun != 65536] = 0
183   - mask2[jizhun == 65536] = 0
184   - mask2[jizhun != 65536] = 1
185   - # 掩膜计算
186   - for i, d in enumerate(empty_list):
187   - empty_list[i] = empty_list[i] * mask + data[:, :, i] * mask2
188   -
189   - for ii in [0, 1, 2]:
190   - # opencv 颜色排序为GBR
191   - pixel_array[:, :, 2 - ii] = empty_list[ii]
192   -
193   -
194   - elif len(intersect_image) == 1:
195   - # 该影像的服务器,随机选取一个
196   - image = intersect_image[0]
197   - image_servers = image.server.split(",")
198   - image_servers = [ser for ser in image_servers if ser in servers]
199   - if len(image_servers) > 0:
200   - indx = int(random.random() * len(image_servers))
201   - image_server = image_servers[indx]
202   - else:
203   - image_server = "None"
204   -
205   - bands = json.loads(image.band_view)
206   -
207   - image_data = ImageData(image_server,ModelVisitor.object_to_json(image))
208   -
209   - pixel_array_t = image_data.get_data(query_extent, bands, height, width)
210   -
211   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
212   - for ii in [0, 1, 2]:
213   - # opencv 颜色排序为GBR
214   - pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
215   - else:
216   - # 结果矩阵
217   - pixel_array = numpy.zeros((height, width, 3), dtype=int) + 65536
218   -
219   - dir_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "overview")
220   - gid = uuid.uuid1().__str__()
221   - store_file = os.path.join(dir_path, "{}.jpg".format(gid))
222   - cv2.imwrite(store_file, pixel_array, [cv2.IMWRITE_JPEG_QUALITY, 30])
223   -
224   - return "{}.jpg".format(gid)
225   -
226   - api_doc = {
227   - "tags": ["影像接口"],
228   - "parameters": [
229   -
230   - {"name": "guid",
231   - "in": "formData",
232   - "type": "string",
233   - "description": "[地图服务,切片服务,影像服务]guid"},
234   -
235   - {"name": "name",
236   - "in": "formData",
237   - "type": "string",
238   - "description": "[地图服务,切片服务,影像服务]"},
239   -
240   -
241   - {"name": "title",
242   - "in": "formData",
243   - "type": "string",
244   - "description": "[地图服务,切片服务,影像服务]"},
245   - {"name": "description",
246   - "in": "formData",
247   - "type": "string",
248   - "description": "[地图服务,切片服务,影像服务]"},
249   -
250   - {"name": "catalog_guid",
251   - "in": "formData",
252   - "type": "string",
253   - "description": "[地图服务,切片服务,影像服务]"},
254   -
255   - {"name": "functions",
256   - "in": "formData",
257   - "type": "string",
258   - "description": "[地图服务,切片服务,影像服务]以逗号相隔,可选WMTS,WMS"},
259   -
260   -
261   - {"name": "image_guids",
262   - "in": "formData",
263   - "type": "string","description":"修改该服务的影像,用逗号相隔"},
264   - ],
265   - "responses": {
266   - 200: {
267   - "schema": {
268   - "properties": {
269   - }
270   - }
271   - }
272   - }
273   - }
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/7/19
4   -#email: nheweijun@sina.com
5   -
6   -
7   -from ..models import db,Service,ImageService,Image,ServiceFunction,TileScheme
8   -from app.util.component.ApiTemplate import ApiTemplate
9   -from app.util.component.ModelVisitor import ModelVisitor
10   -import uuid
11   -
12   -import os
13   -import json
14   -import datetime
15   -from .image_wms import Api as RealApi
16   -import cv2
17   -import configure
18   -
19   -class Api(ApiTemplate):
20   -
21   - api_name = "注册影像服务"
22   -
23   - def para_check(self):
24   - if not self.para.get("function_types"):
25   - raise Exception("缺乏影像服务类型!")
26   - if self.para.get("function_types").__contains__("WMTS") and (not self.para.get("scheme_guid")):
27   - raise Exception("选择WMTS功能,但是缺乏切片方案!")
28   -
29   -
30   - def process(self):
31   -
32   - # 返回结果
33   - res = {}
34   -
35   - try:
36   - guids = self.para.get("image_guids").split(",")
37   - name = self.para.get("name")
38   - functions = self.para.get("functions")
39   -
40   -
41   - image_service_guid = uuid.uuid1().__str__()
42   - service_guid = uuid.uuid1().__str__()
43   -
44   - this_time = datetime.datetime.now()
45   -
46   - service = Service(
47   - guid = service_guid,
48   - name = name,
49   - title = self.para.get("title"),
50   - state = 1,
51   - create_time = this_time,
52   - update_time = this_time,
53   - description = self.para.get("description"),
54   - #node = Column(Integer),
55   - type = self.para.get("type"),
56   - catalog_guid = self.para.get("catalog_guid")
57   - )
58   -
59   - db.session.add(service)
60   -
61   - tile_scheme = TileScheme.query.filter_by(guid=self.para.get("scheme_guid")).one_or_none()
62   -
63   - image_service = ImageService(guid=image_service_guid,
64   - name=name,
65   - create_time=this_time,
66   - scheme_guid=self.para.get("scheme_guid"),
67   - scheme = json.dumps(ModelVisitor.object_to_json(tile_scheme)),
68   - crs = Image.query.filter_by(guid=guids[0]).one_or_none().crs,
69   - service_guid=service_guid
70   - )
71   -
72   - db.session.add(image_service)
73   -
74   - image_service_exetent = []
75   -
76   - for g in guids:
77   - image = Image.query.filter_by(guid=g).one_or_none()
78   - if image:
79   - image_extent = json.loads(image.extent)
80   - if not image_service_exetent:
81   - image_service_exetent = image_extent
82   - else:
83   - image_service_exetent[0] = min(image_extent[0],image_service_exetent[0])
84   - image_service_exetent[1] = min(image_extent[1], image_service_exetent[1])
85   - image_service_exetent[2] = max(image_extent[2], image_service_exetent[2])
86   - image_service_exetent[3] = max(image_extent[3], image_service_exetent[3])
87   -
88   - image_service.images.append(image)
89   - image_service.extent = json.dumps(image_service_exetent)
90   -
91   -
92   - for type in functions.split(","):
93   - service_function_guid = uuid.uuid1().__str__()
94   - service_function = ServiceFunction(guid=service_function_guid,
95   - service_guid=service_guid,
96   - type=type)
97   - db.session.add(service_function)
98   -
99   -
100   - #获得overview
101   - overview_file = self.get_overview(service,image_service)
102   - service.overview="http://{}/API/Service/Overview/{}".format(
103   - configure.deploy_ip_host,overview_file)
104   -
105   - db.session.commit()
106   - res["data"] = service_guid
107   - res["result"] = True
108   - except Exception as e:
109   - db.session.rollback()
110   - raise e
111   -
112   - return res
113   -
114   - def get_overview(self,service,image_service):
115   -
116   - api = RealApi(service.name)
117   -
118   -
119   - query_extent = json.loads(image_service.extent)
120   - if query_extent[2] - query_extent[0] > query_extent[3] - query_extent[1]:
121   - offset = ((query_extent[2] - query_extent[0]) - (query_extent[3] - query_extent[1])) / 2.0
122   - query_extent = [query_extent[0], query_extent[1] - offset, query_extent[2], query_extent[3] + offset]
123   - else:
124   - offset = ((query_extent[3] - query_extent[1]) - (query_extent[2] - query_extent[0])) / 2.0
125   - query_extent = [query_extent[0] - offset, query_extent[1], query_extent[2] + offset, query_extent[3]]
126   -
127   - bbox = ",".join([str(x) for x in query_extent])
128   -
129   - api.para = {"service_name":service.name,"bbox":bbox,"overview":1,"width":512,"height":512}
130   - res = api.process()
131   - dir_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "overview")
132   - gid = uuid.uuid1().__str__()
133   - store_file = os.path.join(dir_path, "{}.jpg".format(gid))
134   - cv2.imwrite(store_file, res, [cv2.IMWRITE_JPEG_QUALITY, 30])
135   -
136   - return "{}.jpg".format(gid)
137   -
138   -
139   -
140   -
141   - api_doc = {
142   - "tags": ["影像接口"],
143   - "parameters": [
144   -
145   - # 通用参数
146   - {"name": "name",
147   - "in": "formData",
148   - "type": "string",
149   - "required": "true",
150   - "description": "[地图服务,切片服务,影像服务]"},
151   - {"name": "title",
152   - "in": "formData",
153   - "type": "string",
154   - "description": "[地图服务,切片服务,影像服务]"},
155   - {"name": "description",
156   - "in": "formData",
157   - "type": "string",
158   - "description": "[地图服务,切片服务,影像服务]"},
159   - {"name": "type",
160   - "in": "formData",
161   - "type": "string",
162   - "enum": ["地图服务","切片服务","影像服务"],
163   - "required": "true",
164   - "description": "[地图服务,切片服务,影像服务]"},
165   - {"name": "catalog_guid",
166   - "in": "formData",
167   - "type": "string",
168   - "description": "[地图服务,切片服务,影像服务]"},
169   -
170   - # 影像参数
171   - {"name": "image_guids",
172   - "in": "formData",
173   - "type": "string",
174   - "description": "[影像服务]影像guids,以英文逗号相隔"},
175   - {"name": "scheme_guid",
176   - "in": "formData",
177   - "type": "string",
178   - "description": "[影像服务]切片方案"},
179   - {"name": "functions",
180   - "in": "formData",
181   - "type": "string",
182   - "description": "[影像服务]功能类型,以逗号相隔,可选WMTS,WMS"},
183   - {"name": "cql",
184   - "in": "formData",
185   - "type": "string",
186   - "description": "分层分级的CQL"},
187   - {"name": "cql_table_guid",
188   - "in": "formData",
189   - "type": "string",
190   - "description": "分层分级的CQL table_guid"},
191   -
192   - ],
193   - "responses": {
194   - 200: {
195   - "schema": {
196   - "properties": {
197   - }
198   - }
199   - }
200   - }
201   - }
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/9/8
4   -#email: nheweijun@sina.com
5   -
6   -
7   -from app.util.component.ApiTemplate import ApiTemplate
8   -from ..models import ImageTag
9   -import uuid
10   -from app.models import db
11   -class Api(ApiTemplate):
12   -
13   - api_name = "create tag"
14   -
15   - def process(self):
16   -
17   - # 返回结果
18   - res = {}
19   - try:
20   - tag_guid = uuid.uuid1().__str__()
21   -
22   - image_tag = ImageTag(guid=tag_guid,name=self.para.get("name"))
23   - db.session.add(image_tag)
24   - db.session.commit()
25   - res["data"] = tag_guid
26   - res["result"] = True
27   - except Exception as e:
28   - raise e
29   - return res
30   -
31   - api_doc = {
32   - "tags": ["影像接口"],
33   - "parameters": [
34   - {"name": "name",
35   - "in": "formData",
36   - "type": "string"},
37   - ],
38   - "responses": {
39   - 200: {
40   - "schema": {
41   - "properties": {
42   - }
43   - }
44   - }
45   - }
46   - }
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/9/8
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 ..models import ImageTag
10   -class Api(ApiTemplate):
11   -
12   - api_name = "获取tag列表"
13   -
14   - def process(self):
15   -
16   - # 返回结果
17   - res = {}
18   - try:
19   - image_tags = ImageTag.query.all()
20   -
21   - res["data"] = {}
22   - res["data"]["count"] = ImageTag.query.count()
23   - res["data"]["list"] = ModelVisitor.objects_to_jsonarray(image_tags)
24   - res["result"] = True
25   -
26   - except Exception as e:
27   - raise e
28   - return res
29   -
30   - api_doc = {
31   - "tags": ["影像接口"],
32   - "parameters": [
33   - ],
34   - "responses": {
35   - 200: {
36   - "schema": {
37   - "properties": {
38   - }
39   - }
40   - }
41   - }
42   - }
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/3/24
4   -#email: nheweijun@sina.com
5   -
6   -import traceback
7   -import numpy
8   -from flask import Response
9   -from .util.ImageData import ImageData
10   -
11   -from app.util.component.ApiTemplate import ApiTemplate
12   -from app.util.component.SliceScheme import SliceScheme
13   -from app.util.component.ParameterUtil import ParameterUtil
14   -import json
15   -import random
16   -import copy
17   -from .util.Opencv import Opencv
18   -from .util.Cache import Cache
19   -from .util.MyThread import MyThread
20   -
21   -class Api(ApiTemplate):
22   -
23   - api_name = "切片"
24   -
25   - def __init__(self,guid,level, row, col):
26   - super().__init__()
27   - self.guid = guid
28   - self.level = level
29   - self.row = row
30   - self.col = col
31   -
32   - def process(self):
33   -
34   - result = {}
35   - parameter: dict = self.para
36   -
37   - try:
38   - if parameter.get("guid"):
39   - self.guid = parameter.get("guid")
40   -
41   - image_service_info, zoo, servers = Cache.cache_data(self.guid)
42   -
43   - # bands = [1, 2, 3]
44   -
45   - # 转换参数
46   - parameter = ParameterUtil.to_lower(parameter)
47   -
48   - if parameter.get("tilematrix"):
49   - if parameter.get("tilematrix").__contains__(":"):
50   - self.level = int(parameter.get("tilematrix").split(":")[-1])
51   - else:
52   - self.level = int(parameter.get("tilematrix"))
53   - if parameter.get("tilerow"):
54   - self.row = int(parameter.get("tilerow"))
55   - if parameter.get("tilecol"):
56   - self.col = int(parameter.get("tilecol"))
57   -
58   - image_type = parameter.get("format") if parameter.get("format") else "image/png"
59   - quality = int(parameter.get("quality")) if parameter.get("quality") else 30
60   - slice_para = image_service_info["scheme"]
61   - extent = SliceScheme.get_polygon(slice_para, self.level, self.row, self.col)
62   -
63   - height, width = 256,256
64   -
65   -
66   - re = parameter.get("request")
67   - if re and re.__eq__("GetCapabilities"):
68   - return self.get_capabilities(image_service_info["service"])
69   -
70   - # 多线程获取分布式数据
71   -
72   - intersect_image = [im for im in image_service_info["images"] if self.determin_intersect(json.loads(im.extent),extent)]
73   -
74   - if len(intersect_image) > 1:
75   -
76   - # 结果矩阵
77   - pixel_array = numpy.zeros((height, width, 3), dtype=int) + 65536
78   -
79   - thread_list = []
80   -
81   - for image in intersect_image:
82   -
83   - # 该影像的服务器,随机选取一个
84   - image_servers = image.server.split(",")
85   - image_servers = [ser for ser in image_servers if ser in servers]
86   - if len(image_servers)>0:
87   - indx = int(random.random() * len(image_servers))
88   - image_server = image_servers[indx]
89   - else:
90   - image_server = "None"
91   -
92   - bands = json.loads(image.band_view)
93   -
94   - image_data = ImageData(image_server,image)
95   -
96   - thread: MyThread = MyThread(image_data.get_data,args=(extent, bands, height, width))
97   -
98   - thread.start()
99   - thread_list.append(thread)
100   -
101   - for thread in thread_list:
102   - thread.join()
103   - data = thread.get_result()
104   -
105   - # 掩膜在中央接口生成,合图
106   - mask = numpy.zeros((height, width, 3), dtype=int)
107   - mask_data = numpy.zeros((height, width, 3), dtype=int)
108   -
109   - mask[data == 65536] = 1
110   - mask[data != 65536] = 0
111   - mask_data[data == 65536] = 0
112   - mask_data[data != 65536] = 1
113   -
114   - # # 掩膜计算
115   - pixel_array = pixel_array * mask + data * mask_data
116   -
117   - # opencv 颜色排序为GBR
118   - d1 = copy.copy(pixel_array[:,:,0])
119   - pixel_array[:, :, 0] = pixel_array[:,:,2]
120   - pixel_array[:, :, 2] = d1
121   -
122   -
123   - elif len(intersect_image) == 1:
124   - # 该影像的服务器,随机选取一个
125   - image = intersect_image[0]
126   - image_servers = image.server.split(",")
127   - #判断可用服务器
128   - image_servers = [ser for ser in image_servers if ser in servers]
129   - if len(image_servers) > 0:
130   - indx = int(random.random() * len(image_servers))
131   - image_server = image_servers[indx]
132   - else:
133   - image_server = "None"
134   - # image_server = image_servers[0]
135   - bands = json.loads(image.band_view)
136   -
137   - image_data = ImageData(image_server, image)
138   - pixel_array_t: numpy.ndarray = image_data.get_data(extent, bands, height, width)
139   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
140   -
141   - for ii in [0, 1, 2]:
142   - # opencv 颜色排序为GBR
143   - pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
144   -
145   - else:
146   - # 结果矩阵
147   - pixel_array = numpy.zeros((height, width, 3), dtype=int) + 65536
148   -
149   -
150   - # 将图片生成在内存中,然后直接返回response
151   - im_data = Opencv.create_image(image_type, pixel_array, quality)
152   - return Response(im_data, mimetype=image_type.lower())
153   -
154   -
155   - except Exception as e:
156   - print(traceback.format_exc())
157   - result["result"] = False
158   - result["message"] = e.__str__()
159   - return result
160   -
161   -
162   -
163   -
164   -
165   -
166   - def get_capabilities(self):
167   - return {}
168   -
169   -
170   -
171   - def determin_intersect(self, extent1, extent2):
172   - if extent2[2] < extent1[0] or extent2[0] > extent1[2] or extent2[1] > extent1[
173   - 3] or extent2[3] < extent1[1]:
174   - return False
175   - else:
176   - return True
177   -
178   -
179   - api_doc = {
180   - "tags": ["影像接口"],
181   - "parameters": [
182   - {"name": "guid",
183   - "in": "formData",
184   - "type": "string"},
185   - {"name": "tilematrix",
186   - "in": "formData",
187   - "type": "string"},
188   - {"name": "tilerow",
189   - "in": "formData",
190   - "type": "string"},
191   - {"name": "tilecol",
192   - "in": "formData",
193   - "type": "string"},
194   - {"name": "format",
195   - "in": "formData",
196   - "type": "string"},
197   - {"name": "quality",
198   - "in": "formData",
199   - "type": "string"}
200   -
201   - ],
202   - "responses": {
203   - 200: {
204   - "schema": {
205   - "properties": {
206   - }
207   - }
208   - }
209   - }
210   - }
211   -
212   -
213   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/3/24
4   -#email: nheweijun@sina.com
5   -
6   -from app.util import *
7   -import traceback
8   -from osgeo import gdal
9   -from osgeo.gdal import *
10   -from numpy import ndarray
11   -import numpy
12   -from flask import Response
13   -
14   -import time
15   -import cv2
16   -from app.modules.service.models import ImageService,Image
17   -from ..models import db,TileScheme
18   -from app.util.component.ApiTemplate import ApiTemplate
19   -
20   -from app.util.component.SliceScheme import SliceScheme
21   -
22   -from app.util.component.ParameterUtil import ParameterUtil
23   -from app.util.component.GeometryAdapter import GeometryAdapter
24   -from app.util.component.Geometry2Raster import Geometry2Raster
25   -
26   -import json
27   -from kazoo.client import KazooClient
28   -
29   -from threading import Thread
30   -
31   -from app.modules.service.image.util.ThriftConnect import ThriftConnect
32   -from flask import current_app
33   -import gzip
34   -import random
35   -class Api(ApiTemplate):
36   -
37   - api_name = "切片"
38   -
39   - def __init__(self,guid,level, row, col):
40   - super().__init__()
41   - self.guid = guid
42   - self.level = level
43   - self.row = row
44   - self.col = col
45   -
46   - def process(self):
47   - from app import GLOBAL_DIC
48   - result = {}
49   - parameter: dict = self.para
50   -
51   -
52   -
53   -
54   -
55   - try:
56   - if parameter.get("guid"):
57   - self.guid = parameter.get("guid")
58   -
59   - #缓存服务信息
60   - image_service_info = GLOBAL_DIC.get(self.guid)
61   -
62   - if image_service_info is None:
63   - image_service:ImageService = ImageService.query.filter_by(guid = self.guid).one_or_none()
64   - images = image_service.images.all()
65   - scheme:TileScheme = TileScheme.query.filter_by(guid=image_service.scheme_guid).one_or_none()
66   -
67   - # test mask
68   - ring = ogr.Geometry(ogr.wkbLinearRing)
69   - ring.AddPoint(111.62, 29)
70   - ring.AddPoint(111.62, 29.03)
71   - ring.AddPoint(111.727, 29.03)
72   - ring.AddPoint(111.727, 29)
73   - ring.AddPoint(111.62, 29)
74   - # Create polygon
75   - mask_poly = ogr.Geometry(ogr.wkbPolygon)
76   - mask_poly.AddGeometry(ring)
77   -
78   - GLOBAL_DIC[self.guid] = {"service": image_service, "images": images,
79   - "scheme": json.loads(scheme.parameter),"mask":
80   - mask_poly}
81   -
82   -
83   - image_service_info = GLOBAL_DIC[self.guid]
84   - else:
85   - image_service_info = GLOBAL_DIC[self.guid]
86   -
87   - zoo = GLOBAL_DIC.get("zookeeper")
88   - if zoo is None:
89   - zoo :KazooClient = KazooClient(hosts=configure.zookeeper, timeout=100)
90   - zoo.start()
91   - GLOBAL_DIC["zookeeper"] = zoo
92   - else :
93   - if not zoo.connected:
94   - zoo.start()
95   -
96   - bands = [1, 2, 3]
97   -
98   -
99   - # 转换参数
100   - parameter = ParameterUtil.to_lower(parameter)
101   -
102   -
103   - if parameter.get("tilematrix"):
104   - if parameter.get("tilematrix").__contains__(":"):
105   - self.level = int(parameter.get("tilematrix").split(":")[-1])
106   - else:
107   - self.level = int(parameter.get("tilematrix"))
108   - if parameter.get("tilerow"):
109   - self.row = int(parameter.get("tilerow"))
110   - if parameter.get("tilecol"):
111   - self.col = int(parameter.get("tilecol"))
112   -
113   - image_type = parameter.get("format") if parameter.get("format") else "image/png"
114   - quality = int(parameter.get("quality")) if parameter.get("quality") else 30
115   - slice_para = image_service_info["scheme"]
116   - extent = SliceScheme.get_polygon(slice_para, self.level, self.row, self.col)
117   -
118   -
119   - height, width = 256,256
120   -
121   - # 多线程获取分布式数据
122   -
123   - intersect_image = [im for im in image_service_info["images"] if
124   - self.determin_intersect(json.loads(im.extent), extent,image_service_info["mask"])]
125   -
126   - masker_raster = Geometry2Raster.convert(image_service_info["mask"],extent,height)
127   -
128   - if len(intersect_image) > 1:
129   -
130   - # 结果矩阵
131   - empty_list = [numpy.zeros((height, width), dtype=int) + 65536,
132   - numpy.zeros((height, width), dtype=int) + 65536,
133   - numpy.zeros((height, width), dtype=int) + 65536]
134   -
135   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
136   - thread_list = []
137   -
138   - for image in intersect_image:
139   - # 该影像的服务器,随机选取一个
140   - image_servers = image.server.split(",")
141   - image_servers = [ser for ser in image_servers if zoo.exists("/rpc/{}".format(ser))]
142   - if len(image_servers)>0:
143   - indx = int(random.random() * len(image_servers))
144   - image_server = image_servers[indx]
145   - else:
146   - image_server = "None"
147   -
148   - thread: MyThread = MyThread(self.get_data,
149   - args=(image_server, image, extent, bands, height, width))
150   - thread.start()
151   - thread_list.append(thread)
152   -
153   - for thread in thread_list:
154   - thread.join()
155   - data = thread.get_result()
156   -
157   - # 掩膜在中央接口生成,合图
158   - mask = numpy.zeros((height, width), dtype=int)
159   - mask2 = numpy.zeros((height, width), dtype=int)
160   - jizhun = data[:, :, 0]
161   - mask[jizhun == 65536] = 1
162   - mask[jizhun != 65536] = 0
163   - mask2[jizhun == 65536] = 0
164   - mask2[jizhun != 65536] = 1
165   - # 掩膜计算
166   - for i, d in enumerate(empty_list):
167   - empty_list[i] = empty_list[i] * mask + data[:, :, i] * mask2
168   -
169   - e = numpy.zeros((height, width), dtype=int) + 65536
170   - e_mask = numpy.zeros((height, width), dtype=int)
171   - e_mask[masker_raster == 1] = 0
172   - e_mask[masker_raster == 0] = 1
173   -
174   - for ii in [0, 1, 2]:
175   - # opencv 颜色排序为GBR
176   - # pixel_array[:, :, 2 - ii] = empty_list[ii]
177   - #mask
178   - pixel_array[:, :, 2 - ii] = e * e_mask + empty_list[ii] * masker_raster
179   -
180   - elif len(intersect_image) == 1:
181   - # 该影像的服务器,随机选取一个
182   - image = intersect_image[0]
183   - image_servers = image.server.split(",")
184   - #判断可用服务器
185   - image_servers = [ser for ser in image_servers if zoo.exists("/rpc/{}".format(ser))]
186   - if len(image_servers) > 0:
187   - indx = int(random.random() * len(image_servers))
188   - image_server = image_servers[indx]
189   - else:
190   - image_server = "None"
191   - pixel_array_t = self.get_data(image_server, image, extent, bands, height, width)
192   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
193   -
194   - e = numpy.zeros((height, width), dtype=int) + 65536
195   - e_mask = numpy.zeros((height, width), dtype=int)
196   - e_mask[masker_raster == 1] = 0
197   - e_mask[masker_raster == 0] = 1
198   -
199   - for ii in [0, 1, 2]:
200   - # opencv 颜色排序为GBR
201   - # pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
202   - pixel_array[:, :, 2 - ii] = e * e_mask + pixel_array_t[:, :, ii] * masker_raster
203   - else:
204   - # 结果矩阵
205   - pixel_array = numpy.zeros((height, width, 3), dtype=int) + 65536
206   -
207   -
208   - # 将图片生成在内存中,然后直接返回response
209   - im_data = self.create_by_opencv(image_type, pixel_array, quality)
210   - return Response(im_data, mimetype=image_type.lower())
211   -
212   - except Exception as e:
213   - print(traceback.format_exc())
214   - result["result"] = False
215   - result["message"] = e.__str__()
216   - return result
217   -
218   - def determine_level(self, xysize, origin_extent, extent, max_level):
219   - '''
220   - 根据范围判断调用金字塔的哪一层
221   - :param xysize:
222   - :param origin_extent:
223   - :param extent:
224   - :param max_level:
225   - :return:
226   - '''
227   - x = xysize[0]
228   - y = xysize[1]
229   - level = -1
230   - pixel = x * y * (((extent[2] - extent[0]) * (extent[3] - extent[1])) / (
231   - (origin_extent[2] - origin_extent[0]) * (origin_extent[3] - origin_extent[1])))
232   - while pixel > 100000 and level < max_level - 1:
233   - level += 1
234   - x = x / 2
235   - y = y / 2
236   - pixel = x * y * (((extent[2] - extent[0]) * (extent[3] - extent[1])) / (
237   - (origin_extent[2] - origin_extent[0]) * (origin_extent[3] - origin_extent[1])))
238   - return level
239   -
240   - def create_by_opencv(self, image_type, pixel_array, quality):
241   -
242   - if image_type.__eq__("image/jpeg") or image_type.__eq__("image/jpg"):
243   - r, buf = cv2.imencode(".jpg", pixel_array, [cv2.IMWRITE_JPEG_QUALITY, quality])
244   - image_out = buf.tobytes()
245   - else:
246   - height, width = pixel_array[:, :, 0].shape
247   - four = numpy.zeros((height, width), dtype=int) + 255
248   - four[pixel_array[:, :, 0] == 65536] = 0
249   - r, buf = cv2.imencode(".png", numpy.dstack((pixel_array, four)))
250   - image_out = buf.tobytes()
251   - return image_out
252   -
253   - def get_data(self,image_server, image, extent, bands, height, width):
254   -
255   - if image_server.__eq__("本地服务器"):
256   - data = self.get_local_wms_data(image, extent, bands, height, width)
257   - elif image_server.__eq__("None"):
258   - data = numpy.zeros((height, width, 3), dtype=int) + 65536
259   - else:
260   - data = self.get_remote_wms_data(image_server,image, extent, bands, height, width)
261   - return data
262   -
263   - def get_remote_wms_data(self, image_server,image, extent, bands, height, width):
264   - '''
265   - 通过RPC获取远程数据
266   - :param image:
267   - :param extent:
268   - :param bands:
269   - :return:
270   - '''
271   -
272   - #需要做thrift连接的缓存,连接池
273   - thrift_connect = ThriftConnect(image_server)
274   - image_extent = image.extent
275   -
276   - data = thrift_connect.client.getData(image.path, extent, json.loads(image_extent), bands, width, height)
277   -
278   - thrift_connect.close()
279   -
280   - data = gzip.decompress(data)
281   - data = numpy.frombuffer(data, dtype='int64')
282   - data = data.reshape((height, width, 3))
283   -
284   - return data
285   -
286   - def get_local_wms_data(self, image, extent, bands, height, width):
287   - '''
288   - 获取本地数据
289   - :param image:
290   - :param extent:
291   - :param bands:
292   - :return:
293   - '''
294   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
295   - ceng = 0
296   - img: Dataset = gdal.Open(image.path, 0)
297   - t1 = time.time()
298   - for band in bands:
299   -
300   - # 自决定金字塔等级
301   - xysize = [img.RasterXSize, img.RasterYSize]
302   -
303   - origin_extent = image.extent
304   - band_data: Band = img.GetRasterBand(band)
305   -
306   - max_level = band_data.GetOverviewCount()
307   -
308   - # 超出空间范围
309   - if extent[2] < origin_extent[0] or extent[0] > origin_extent[2] or extent[1] > origin_extent[
310   - 3] or extent[3] < origin_extent[1]:
311   - empty = numpy.zeros((height, width), dtype=int) + 65536
312   - # 空间范围相交
313   - else:
314   - image_level = self.determine_level(xysize, origin_extent, extent, max_level)
315   -
316   - if image_level == -1:
317   - overview = band_data
318   - else:
319   - try:
320   - overview: Band = band_data.GetOverview(image_level)
321   - except:
322   - raise Exception("该影像不存在该级别的金字塔数据!")
323   - ox = overview.XSize
324   - oy = overview.YSize
325   -
326   - # 网格大小
327   - grid_x = (origin_extent[2] - origin_extent[0]) / (ox * 1.0)
328   - grid_y = (origin_extent[3] - origin_extent[1]) / (oy * 1.0)
329   -
330   - # 完全在影像范围内
331   - if extent[0] > origin_extent[0] and extent[1] > origin_extent[1] and extent[2] < \
332   - origin_extent[2] and extent[3] < origin_extent[3]:
333   -
334   - # 网格偏移量
335   - off_x = math.floor((extent[0] - origin_extent[0]) / grid_x)
336   - off_y = math.floor((origin_extent[3] - extent[3]) / grid_y)
337   -
338   - # 截取后网格个数
339   - x_g = math.ceil((extent[2] - extent[0]) / grid_x)
340   -
341   - y_g = math.ceil((extent[3] - extent[1]) / grid_y)
342   -
343   - empty = overview.ReadAsArray(off_x, off_y, x_g, y_g, width, height)
344   -
345   -
346   - # 部分相交
347   - else:
348   -
349   - inter_extent = [0, 0, 0, 0]
350   - inter_extent[0] = origin_extent[0] if origin_extent[0] > extent[0] else extent[0]
351   - inter_extent[1] = origin_extent[1] if origin_extent[1] > extent[1] else extent[1]
352   - inter_extent[2] = origin_extent[2] if origin_extent[2] < extent[2] else extent[2]
353   - inter_extent[3] = origin_extent[3] if origin_extent[3] < extent[3] else extent[3]
354   -
355   - # 网格偏移量
356   - off_x = math.floor((inter_extent[0] - origin_extent[0]) / grid_x)
357   - off_y = math.floor((origin_extent[3] - inter_extent[3]) / grid_y)
358   -
359   - # 截取后网格个数
360   - x_g = math.floor((inter_extent[2] - inter_extent[0]) / grid_x)
361   - y_g = math.floor((inter_extent[3] - inter_extent[1]) / grid_y)
362   -
363   - # 相对于出图的偏移量
364   -
365   - # 出图的网格大小
366   - out_grid_x = (extent[2] - extent[0]) / (width * 1.0)
367   - out_grid_y = (extent[3] - extent[1]) / (height * 1.0)
368   -
369   - out_off_x = int(math.ceil((inter_extent[0] - extent[0]) / out_grid_x))
370   - out_off_y = int(math.ceil((extent[3] - inter_extent[3]) / out_grid_y))
371   -
372   - out_x_g = int(math.floor((inter_extent[2] - inter_extent[0]) / out_grid_x))
373   - out_y_g = int(math.floor((inter_extent[3] - inter_extent[1]) / out_grid_y))
374   -
375   - # 相交部分在出图的哪个位置
376   -
377   - overview_raster: ndarray = overview.ReadAsArray(off_x, off_y, x_g, y_g, out_x_g,
378   - out_y_g)
379   -
380   - dat = numpy.zeros((height, width), dtype=int) + 65536
381   - dat[out_off_y:out_off_y + out_y_g, out_off_x:out_off_x + out_x_g] = overview_raster
382   -
383   - empty = dat
384   -
385   - pixel_array[:, :, ceng] = empty
386   - ceng += 1
387   - return pixel_array
388   -
389   -
390   - def determin_intersect(self, extent1, extent2, mask):
391   - g1 = GeometryAdapter.bbox_2_polygon(extent1)
392   - g2 = GeometryAdapter.bbox_2_polygon(extent2)
393   - if g1.Intersect(g2):
394   - return g2.Intersect(mask)
395   - else:
396   - return False
397   -
398   - api_doc = {
399   - "tags": ["影像接口"],
400   - "parameters": [
401   - {"name": "guid",
402   - "in": "formData",
403   - "type": "string"},
404   - {"name": "tilematrix",
405   - "in": "formData",
406   - "type": "string"},
407   - {"name": "tilerow",
408   - "in": "formData",
409   - "type": "string"},
410   - {"name": "tilecol",
411   - "in": "formData",
412   - "type": "string"},
413   - {"name": "format",
414   - "in": "formData",
415   - "type": "string"},
416   - {"name": "quality",
417   - "in": "formData",
418   - "type": "string"}
419   -
420   - ],
421   - "responses": {
422   - 200: {
423   - "schema": {
424   - "properties": {
425   - }
426   - }
427   - }
428   - }
429   - }
430   -
431   -class MyThread(Thread):
432   - def __init__(self,func,args=()):
433   - super(MyThread,self).__init__()
434   - self.func = func
435   - self.args = args
436   - def run(self):
437   - self.result = self.func(*self.args)
438   - def get_result(self):
439   - try:
440   - return self.result
441   - except Exception:
442   - return None
443   -
444   -
445   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/3/24
4   -#email: nheweijun@sina.com
5   -
6   -
7   -from app.util.component.ApiTemplate import ApiTemplate
8   -
9   -from .util.ImageWMSServer import ImageWMSServer
10   -
11   -class Api(ApiTemplate):
12   -
13   - api_name = "WMS"
14   -
15   -
16   - def __init__(self,service_name):
17   - super().__init__()
18   - self.service_name = service_name
19   -
20   - def process(self):
21   - try:
22   - instance = ImageWMSServer()
23   - response = instance.wms(self.service_name,self.para)
24   -
25   - except Exception as e:
26   - raise e
27   - return response
28   -
29   -
30   -
31   - api_doc = {
32   - "tags": ["影像接口"],
33   - "parameters": [
34   - {"name": "request",
35   - "in": "query",
36   - "type": "string",
37   - "enum":["GetMap","GetCapabilities"]},
38   - {"name": "bbox",
39   - "in": "query",
40   - "type": "string"},
41   - {"name": "width",
42   - "in": "query",
43   - "type": "string"},
44   - {"name": "height",
45   - "in": "query",
46   - "type": "string"},
47   - {"name": "format",
48   - "in": "query",
49   - "type": "string"},
50   - {"name": "quality",
51   - "in": "query",
52   - "type": "string"}
53   - ],
54   - "responses": {
55   - 200: {
56   - "schema": {
57   - "properties": {
58   - }
59   - }
60   - }
61   - }
62   - }
63   -
64   -
65   -
66   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/3/24
4   -#email: nheweijun@sina.com
5   -
6   -from app.util.component.ApiTemplate import ApiTemplate
7   -
8   -
9   -from .util.ImageWMSServer import ImageWMSServer
10   -class Api(ApiTemplate):
11   -
12   - api_name = "WMS"
13   -
14   - def process(self):
15   - try:
16   - instance = ImageWMSServer()
17   - if self.para.get("guid"):
18   - response = instance.wms(self.para.get("service_name"),self.para)
19   - else:
20   - response = instance.wms(self.para.get("guid"), self.para,type="guid")
21   - except Exception as e:
22   - raise e
23   - return response
24   -
25   - api_doc = {
26   - "tags": ["影像接口"],
27   - "parameters": [
28   - {"name": "guid",
29   - "in": "query",
30   - "type": "string"},
31   - {"name": "service_name",
32   - "in": "query",
33   - "type": "string"},
34   - {"name": "bbox",
35   - "in": "query",
36   - "type": "string"},
37   - {"name": "width",
38   - "in": "query",
39   - "type": "string"},
40   - {"name": "height",
41   - "in": "query",
42   - "type": "string"},
43   - {"name": "format",
44   - "in": "query",
45   - "type": "string"},
46   - {"name": "quality",
47   - "in": "query",
48   - "type": "string"}
49   - ],
50   - "responses": {
51   - 200: {
52   - "schema": {
53   - "properties": {
54   - }
55   - }
56   - }
57   - }
58   - }
59   -
60   -
61   -
62   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/3/24
4   -#email: nheweijun@sina.com
5   -
6   -import traceback
7   -
8   -import numpy
9   -from flask import Response
10   -import random
11   -
12   -from app.modules.service.models import Image
13   -from app.util.component.ApiTemplate import ApiTemplate
14   -
15   -from app.util.component.ParameterUtil import ParameterUtil
16   -import json
17   -
18   -from .util.MyThread import MyThread
19   -from .util.ImageData import ImageData
20   -from .util.Opencv import Opencv
21   -from .util.Cache import Cache
22   -from app.util.component.ModelVisitor import ModelVisitor
23   -from app.util.component.ParameterUtil import StructurePrint
24   -class Api(ApiTemplate):
25   -
26   - api_name = "发布服务时预览"
27   -
28   - def process(self):
29   -
30   -
31   - result = {}
32   - parameter: dict = self.para
33   -
34   - try:
35   -
36   - parameter = ParameterUtil.to_lower(parameter)
37   -
38   - image_guids = parameter.get("image_guids")
39   -
40   - get_extent = parameter.get("get_extent")
41   - if get_extent and (get_extent == True or get_extent.lower().__eq__("true")):
42   -
43   - sr_set = set()
44   -
45   -
46   - tmp_extent = []
47   - for g in image_guids.split(","):
48   - image = Image.query.filter_by(guid=g).one_or_none()
49   - if image:
50   - image_extent = json.loads(image.extent)
51   - if not tmp_extent:
52   - tmp_extent = image_extent
53   - else:
54   - tmp_extent[0] = min(image_extent[0], tmp_extent[0])
55   - tmp_extent[2] = max(image_extent[2], tmp_extent[2])
56   - tmp_extent[1] = min(image_extent[1], tmp_extent[1])
57   - tmp_extent[3] = max(image_extent[3], tmp_extent[3])
58   - sr_set.add(image.crs)
59   - if len(sr_set)>1:
60   - result["result"] = False
61   - result["msg"] = "影像坐标不一致"
62   - return result
63   -
64   - result["result"] = True
65   - result["data"] = tmp_extent
66   - return result
67   -
68   - bbox = parameter.get("bbox")
69   - width = int(parameter.get("width")) if parameter.get("width") else 256
70   - height = int(parameter.get("height")) if parameter.get("height") else 256
71   - image_type = parameter.get("format") if parameter.get("format") else "image/png"
72   - quality = int(parameter.get("quality")) if parameter.get("quality") else 30
73   -
74   - image_service_info ,zoo, servers = Cache.cache_data(None)
75   -
76   - extent = [float(x) for x in bbox.split(",")]
77   -
78   - images = Image.query.filter(Image.guid.in_(image_guids.split(","))).all()
79   -
80   - intersect_image = [im for im in images if self.determin_intersect(json.loads(im.extent),extent)]
81   -
82   - if len(intersect_image)>1:
83   -
84   - # 结果矩阵
85   - empty_list = [numpy.zeros((height,width), dtype=int) + 65536,
86   - numpy.zeros((height,width), dtype=int) + 65536,
87   - numpy.zeros((height,width), dtype=int) + 65536]
88   -
89   - pixel_array = numpy.zeros((height,width,3), dtype=int)
90   - thread_list = []
91   -
92   - for image in intersect_image:
93   - #该影像的服务器,随机选取一个
94   - image_servers = image.server.split(",")
95   - image_servers = [ser for ser in image_servers if ser in servers]
96   - if len(image_servers)>0:
97   - indx = int(random.random() * len(image_servers))
98   - image_server = image_servers[indx]
99   - else:
100   - image_server = "None"
101   - bands = json.loads(image.band_view)
102   -
103   - image_data = ImageData(image_server, ModelVisitor.object_to_json(image))
104   -
105   - thread: MyThread = MyThread(image_data.get_data, args=(extent,bands,height,width))
106   - thread.start()
107   - thread_list.append(thread)
108   -
109   -
110   - for thread in thread_list:
111   - thread.join()
112   - data = thread.get_result()
113   -
114   - # 掩膜在中央接口生成,合图
115   - mask = numpy.zeros((height,width), dtype=int)
116   - mask2 = numpy.zeros((height,width), dtype=int)
117   - jizhun = data[:, :, 0]
118   - mask[jizhun == 65536] = 1
119   - mask[jizhun != 65536] = 0
120   - mask2[jizhun == 65536] = 0
121   - mask2[jizhun != 65536] = 1
122   - # 掩膜计算
123   - for i, d in enumerate(empty_list):
124   - empty_list[i] = empty_list[i] * mask + data[:, :, i] * mask2
125   -
126   - for ii in [0, 1, 2]:
127   - # opencv 颜色排序为GBR
128   - pixel_array[:, :, 2 - ii] = empty_list[ii]
129   -
130   -
131   - elif len(intersect_image)==1:
132   - # 该影像的服务器,随机选取一个
133   - image = intersect_image[0]
134   - image_servers = image.server.split(",")
135   - image_servers = [ser for ser in image_servers if ser in servers]
136   - if len(image_servers) > 0:
137   - indx = int(random.random() * len(image_servers))
138   - image_server = image_servers[indx]
139   - else:
140   - image_server = "None"
141   -
142   - bands = json.loads(image.band_view)
143   -
144   - image_data = ImageData(image_server,ModelVisitor.object_to_json(image))
145   -
146   - pixel_array_t = image_data.get_data(extent,bands,height,width)
147   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
148   - for ii in [0, 1, 2]:
149   - # opencv 颜色排序为GBR
150   - pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
151   - else:
152   - # 结果矩阵
153   - pixel_array = numpy.zeros((height, width, 3), dtype=int)+65536
154   -
155   - # 将图片生成在内存中,然后直接返回response
156   - im_data = Opencv.create_image(image_type, pixel_array, quality)
157   -
158   - if self.para.get("overview"):
159   - return pixel_array
160   - return Response(im_data, mimetype=image_type.lower())
161   -
162   - except Exception as e:
163   - raise e
164   -
165   -
166   - def determin_intersect(self, extent1, extent2):
167   - if extent2[2] < extent1[0] or extent2[0] > extent1[2] or extent2[1] > extent1[
168   - 3] or extent2[3] < extent1[1]:
169   - return False
170   - else:
171   - return True
172   -
173   - api_doc = {
174   - "tags": ["影像接口"],
175   - "parameters": [
176   - {"name": "image_guids",
177   - "in": "query",
178   - "type": "string"},
179   - {"name": "get_extent",
180   - "in": "query",
181   - "type": "boolean",
182   - "enum":[True,False]},
183   - {"name": "bbox",
184   - "in": "query",
185   - "type": "string"},
186   - {"name": "width",
187   - "in": "query",
188   - "type": "string"},
189   - {"name": "height",
190   - "in": "query",
191   - "type": "string"},
192   - {"name": "format",
193   - "in": "query",
194   - "type": "string"},
195   - {"name": "quality",
196   - "in": "query",
197   - "type": "string"}
198   - ],
199   - "responses": {
200   - 200: {
201   - "schema": {
202   - "properties": {
203   - }
204   - }
205   - }
206   - }
207   - }
208   -
209   -
210   -
211   -
212   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/3/24
4   -#email: nheweijun@sina.com
5   -
6   -import traceback
7   -from app.util.component.ApiTemplate import ApiTemplate
8   -from .util.ImageWMTSServer import ImageWMTSServer
9   -class Api(ApiTemplate):
10   - api_name = "切片"
11   - def __init__(self,service_name):
12   - super().__init__()
13   - self.service_name = service_name
14   -
15   - def process(self):
16   - try:
17   - instance = ImageWMTSServer()
18   - response = instance.wmts(self.service_name,self.para)
19   - except Exception as e:
20   - print(traceback.format_exc())
21   - raise e
22   - return response
23   -
24   -
25   - api_doc = {
26   - "tags": ["影像接口"],
27   - "parameters": [
28   - {"name": "request",
29   - "in": "formData",
30   - "type": "string",
31   - "enum": ["GetTile", "GetCapabilities"]},
32   - {"name": "tilematrix",
33   - "in": "formData",
34   - "type": "string"},
35   - {"name": "tilerow",
36   - "in": "formData",
37   - "type": "string"},
38   - {"name": "tilecol",
39   - "in": "formData",
40   - "type": "string"},
41   - {"name": "format",
42   - "in": "formData",
43   - "type": "string"},
44   - {"name": "quality",
45   - "in": "formData",
46   - "type": "string"}
47   -
48   - ],
49   - "responses": {
50   - 200: {
51   - "schema": {
52   - "properties": {
53   - }
54   - }
55   - }
56   - }
57   - }
58   -
59   -
60   -
1   -#!/usr/bin/env python
2   -#
3   -# Autogenerated by Thrift Compiler (0.14.2)
4   -#
5   -# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
6   -#
7   -# options string: py
8   -#
9   -
10   -import sys
11   -import pprint
12   -if sys.version_info[0] > 2:
13   - from urllib.parse import urlparse
14   -else:
15   - from urlparse import urlparse
16   -from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
17   -from thrift.protocol.TBinaryProtocol import TBinaryProtocol
18   -
19   -from tutorial import Calculator
20   -from tutorial.ttypes import *
21   -
22   -if len(sys.argv) <= 1 or sys.argv[1] == '--help':
23   - print('')
24   - print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
25   - print('')
26   - print('Functions:')
27   - print(' getData(string path, queryRange, originRange, bands, i32 width, i32 height)')
28   - print(' Raster getInfo(string path)')
29   - print(' bool buildOverview(string path)')
30   - print(' getImageList(string path)')
31   - print('')
32   - sys.exit(0)
33   -
34   -pp = pprint.PrettyPrinter(indent=2)
35   -host = 'localhost'
36   -port = 9090
37   -uri = ''
38   -framed = False
39   -ssl = False
40   -validate = True
41   -ca_certs = None
42   -keyfile = None
43   -certfile = None
44   -http = False
45   -argi = 1
46   -
47   -if sys.argv[argi] == '-h':
48   - parts = sys.argv[argi + 1].split(':')
49   - host = parts[0]
50   - if len(parts) > 1:
51   - port = int(parts[1])
52   - argi += 2
53   -
54   -if sys.argv[argi] == '-u':
55   - url = urlparse(sys.argv[argi + 1])
56   - parts = url[1].split(':')
57   - host = parts[0]
58   - if len(parts) > 1:
59   - port = int(parts[1])
60   - else:
61   - port = 80
62   - uri = url[2]
63   - if url[4]:
64   - uri += '?%s' % url[4]
65   - http = True
66   - argi += 2
67   -
68   -if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
69   - framed = True
70   - argi += 1
71   -
72   -if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
73   - ssl = True
74   - argi += 1
75   -
76   -if sys.argv[argi] == '-novalidate':
77   - validate = False
78   - argi += 1
79   -
80   -if sys.argv[argi] == '-ca_certs':
81   - ca_certs = sys.argv[argi+1]
82   - argi += 2
83   -
84   -if sys.argv[argi] == '-keyfile':
85   - keyfile = sys.argv[argi+1]
86   - argi += 2
87   -
88   -if sys.argv[argi] == '-certfile':
89   - certfile = sys.argv[argi+1]
90   - argi += 2
91   -
92   -cmd = sys.argv[argi]
93   -args = sys.argv[argi + 1:]
94   -
95   -if http:
96   - transport = THttpClient.THttpClient(host, port, uri)
97   -else:
98   - if ssl:
99   - socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
100   - else:
101   - socket = TSocket.TSocket(host, port)
102   - if framed:
103   - transport = TTransport.TFramedTransport(socket)
104   - else:
105   - transport = TTransport.TBufferedTransport(socket)
106   -protocol = TBinaryProtocol(transport)
107   -client = Calculator.Client(protocol)
108   -transport.open()
109   -
110   -if cmd == 'getData':
111   - if len(args) != 6:
112   - print('getData requires 6 args')
113   - sys.exit(1)
114   - pp.pprint(client.getData(args[0], eval(args[1]), eval(args[2]), eval(args[3]), eval(args[4]), eval(args[5]),))
115   -
116   -elif cmd == 'getInfo':
117   - if len(args) != 1:
118   - print('getInfo requires 1 args')
119   - sys.exit(1)
120   - pp.pprint(client.getInfo(args[0],))
121   -
122   -elif cmd == 'buildOverview':
123   - if len(args) != 1:
124   - print('buildOverview requires 1 args')
125   - sys.exit(1)
126   - pp.pprint(client.buildOverview(args[0],))
127   -
128   -elif cmd == 'getImageList':
129   - if len(args) != 1:
130   - print('getImageList requires 1 args')
131   - sys.exit(1)
132   - pp.pprint(client.getImageList(args[0],))
133   -
134   -else:
135   - print('Unrecognized method %s' % cmd)
136   - sys.exit(1)
137   -
138   -transport.close()
注册登录 后发表评论