提交 874cc3806ba715875615fcf47f91f6ec57d025e2

作者 nheweijun
1 个父辈 fe04e634

2021.12.21 完成影像模块的剥离

正在显示 88 个修改的文件 包含 1176 行增加7476 行删除
... ... @@ -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()
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   - """
23   - Ahh, now onto the cool part, defining a service. Services just need a name
24   - and can optionally inherit from another service using the extends keyword.
25   -
26   - """
27   - def getData(self, path, queryRange, originRange, bands, width, height):
28   - """
29   - Parameters:
30   - - path
31   - - queryRange
32   - - originRange
33   - - bands
34   - - width
35   - - height
36   -
37   - """
38   - pass
39   -
40   - def getInfo(self, path):
41   - """
42   - Parameters:
43   - - path
44   -
45   - """
46   - pass
47   -
48   - def buildOverview(self, path):
49   - """
50   - Parameters:
51   - - path
52   -
53   - """
54   - pass
55   -
56   - def getImageList(self, path):
57   - """
58   - Parameters:
59   - - path
60   -
61   - """
62   - pass
63   -
64   -
65   -class Client(Iface):
66   - """
67   - Ahh, now onto the cool part, defining a service. Services just need a name
68   - and can optionally inherit from another service using the extends keyword.
69   -
70   - """
71   - def __init__(self, iprot, oprot=None):
72   - self._iprot = self._oprot = iprot
73   - if oprot is not None:
74   - self._oprot = oprot
75   - self._seqid = 0
76   -
77   - def getData(self, path, queryRange, originRange, bands, width, height):
78   - """
79   - Parameters:
80   - - path
81   - - queryRange
82   - - originRange
83   - - bands
84   - - width
85   - - height
86   -
87   - """
88   - self.send_getData(path, queryRange, originRange, bands, width, height)
89   - return self.recv_getData()
90   -
91   - def send_getData(self, path, queryRange, originRange, bands, width, height):
92   - self._oprot.writeMessageBegin('getData', TMessageType.CALL, self._seqid)
93   - args = getData_args()
94   - args.path = path
95   - args.queryRange = queryRange
96   - args.originRange = originRange
97   - args.bands = bands
98   - args.width = width
99   - args.height = height
100   - args.write(self._oprot)
101   - self._oprot.writeMessageEnd()
102   - self._oprot.trans.flush()
103   -
104   - def recv_getData(self):
105   - iprot = self._iprot
106   - (fname, mtype, rseqid) = iprot.readMessageBegin()
107   - if mtype == TMessageType.EXCEPTION:
108   - x = TApplicationException()
109   - x.read(iprot)
110   - iprot.readMessageEnd()
111   - raise x
112   - result = getData_result()
113   - result.read(iprot)
114   - iprot.readMessageEnd()
115   - if result.success is not None:
116   - return result.success
117   - raise TApplicationException(TApplicationException.MISSING_RESULT, "getData failed: unknown result")
118   -
119   - def getInfo(self, path):
120   - """
121   - Parameters:
122   - - path
123   -
124   - """
125   - self.send_getInfo(path)
126   - return self.recv_getInfo()
127   -
128   - def send_getInfo(self, path):
129   - self._oprot.writeMessageBegin('getInfo', TMessageType.CALL, self._seqid)
130   - args = getInfo_args()
131   - args.path = path
132   - args.write(self._oprot)
133   - self._oprot.writeMessageEnd()
134   - self._oprot.trans.flush()
135   -
136   - def recv_getInfo(self):
137   - iprot = self._iprot
138   - (fname, mtype, rseqid) = iprot.readMessageBegin()
139   - if mtype == TMessageType.EXCEPTION:
140   - x = TApplicationException()
141   - x.read(iprot)
142   - iprot.readMessageEnd()
143   - raise x
144   - result = getInfo_result()
145   - result.read(iprot)
146   - iprot.readMessageEnd()
147   - if result.success is not None:
148   - return result.success
149   - raise TApplicationException(TApplicationException.MISSING_RESULT, "getInfo failed: unknown result")
150   -
151   - def buildOverview(self, path):
152   - """
153   - Parameters:
154   - - path
155   -
156   - """
157   - self.send_buildOverview(path)
158   - return self.recv_buildOverview()
159   -
160   - def send_buildOverview(self, path):
161   - self._oprot.writeMessageBegin('buildOverview', TMessageType.CALL, self._seqid)
162   - args = buildOverview_args()
163   - args.path = path
164   - args.write(self._oprot)
165   - self._oprot.writeMessageEnd()
166   - self._oprot.trans.flush()
167   -
168   - def recv_buildOverview(self):
169   - iprot = self._iprot
170   - (fname, mtype, rseqid) = iprot.readMessageBegin()
171   - if mtype == TMessageType.EXCEPTION:
172   - x = TApplicationException()
173   - x.read(iprot)
174   - iprot.readMessageEnd()
175   - raise x
176   - result = buildOverview_result()
177   - result.read(iprot)
178   - iprot.readMessageEnd()
179   - if result.success is not None:
180   - return result.success
181   - raise TApplicationException(TApplicationException.MISSING_RESULT, "buildOverview failed: unknown result")
182   -
183   - def getImageList(self, path):
184   - """
185   - Parameters:
186   - - path
187   -
188   - """
189   - self.send_getImageList(path)
190   - return self.recv_getImageList()
191   -
192   - def send_getImageList(self, path):
193   - self._oprot.writeMessageBegin('getImageList', TMessageType.CALL, self._seqid)
194   - args = getImageList_args()
195   - args.path = path
196   - args.write(self._oprot)
197   - self._oprot.writeMessageEnd()
198   - self._oprot.trans.flush()
199   -
200   - def recv_getImageList(self):
201   - iprot = self._iprot
202   - (fname, mtype, rseqid) = iprot.readMessageBegin()
203   - if mtype == TMessageType.EXCEPTION:
204   - x = TApplicationException()
205   - x.read(iprot)
206   - iprot.readMessageEnd()
207   - raise x
208   - result = getImageList_result()
209   - result.read(iprot)
210   - iprot.readMessageEnd()
211   - if result.success is not None:
212   - return result.success
213   - raise TApplicationException(TApplicationException.MISSING_RESULT, "getImageList failed: unknown result")
214   -
215   -
216   -class Processor(Iface, TProcessor):
217   - def __init__(self, handler):
218   - self._handler = handler
219   - self._processMap = {}
220   - self._processMap["getData"] = Processor.process_getData
221   - self._processMap["getInfo"] = Processor.process_getInfo
222   - self._processMap["buildOverview"] = Processor.process_buildOverview
223   - self._processMap["getImageList"] = Processor.process_getImageList
224   - self._on_message_begin = None
225   -
226   - def on_message_begin(self, func):
227   - self._on_message_begin = func
228   -
229   - def process(self, iprot, oprot):
230   - (name, type, seqid) = iprot.readMessageBegin()
231   - if self._on_message_begin:
232   - self._on_message_begin(name, type, seqid)
233   - if name not in self._processMap:
234   - iprot.skip(TType.STRUCT)
235   - iprot.readMessageEnd()
236   - x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
237   - oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
238   - x.write(oprot)
239   - oprot.writeMessageEnd()
240   - oprot.trans.flush()
241   - return
242   - else:
243   - self._processMap[name](self, seqid, iprot, oprot)
244   - return True
245   -
246   - def process_getData(self, seqid, iprot, oprot):
247   - args = getData_args()
248   - args.read(iprot)
249   - iprot.readMessageEnd()
250   - result = getData_result()
251   - try:
252   - result.success = self._handler.getData(args.path, args.queryRange, args.originRange, args.bands, args.width, args.height)
253   - msg_type = TMessageType.REPLY
254   - except TTransport.TTransportException:
255   - raise
256   - except TApplicationException as ex:
257   - logging.exception('TApplication exception in handler')
258   - msg_type = TMessageType.EXCEPTION
259   - result = ex
260   - except Exception:
261   - logging.exception('Unexpected exception in handler')
262   - msg_type = TMessageType.EXCEPTION
263   - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
264   - oprot.writeMessageBegin("getData", msg_type, seqid)
265   - result.write(oprot)
266   - oprot.writeMessageEnd()
267   - oprot.trans.flush()
268   -
269   - def process_getInfo(self, seqid, iprot, oprot):
270   - args = getInfo_args()
271   - args.read(iprot)
272   - iprot.readMessageEnd()
273   - result = getInfo_result()
274   - try:
275   - result.success = self._handler.getInfo(args.path)
276   - msg_type = TMessageType.REPLY
277   - except TTransport.TTransportException:
278   - raise
279   - except TApplicationException as ex:
280   - logging.exception('TApplication exception in handler')
281   - msg_type = TMessageType.EXCEPTION
282   - result = ex
283   - except Exception:
284   - logging.exception('Unexpected exception in handler')
285   - msg_type = TMessageType.EXCEPTION
286   - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
287   - oprot.writeMessageBegin("getInfo", msg_type, seqid)
288   - result.write(oprot)
289   - oprot.writeMessageEnd()
290   - oprot.trans.flush()
291   -
292   - def process_buildOverview(self, seqid, iprot, oprot):
293   - args = buildOverview_args()
294   - args.read(iprot)
295   - iprot.readMessageEnd()
296   - result = buildOverview_result()
297   - try:
298   - result.success = self._handler.buildOverview(args.path)
299   - msg_type = TMessageType.REPLY
300   - except TTransport.TTransportException:
301   - raise
302   - except TApplicationException as ex:
303   - logging.exception('TApplication exception in handler')
304   - msg_type = TMessageType.EXCEPTION
305   - result = ex
306   - except Exception:
307   - logging.exception('Unexpected exception in handler')
308   - msg_type = TMessageType.EXCEPTION
309   - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
310   - oprot.writeMessageBegin("buildOverview", msg_type, seqid)
311   - result.write(oprot)
312   - oprot.writeMessageEnd()
313   - oprot.trans.flush()
314   -
315   - def process_getImageList(self, seqid, iprot, oprot):
316   - args = getImageList_args()
317   - args.read(iprot)
318   - iprot.readMessageEnd()
319   - result = getImageList_result()
320   - try:
321   - result.success = self._handler.getImageList(args.path)
322   - msg_type = TMessageType.REPLY
323   - except TTransport.TTransportException:
324   - raise
325   - except TApplicationException as ex:
326   - logging.exception('TApplication exception in handler')
327   - msg_type = TMessageType.EXCEPTION
328   - result = ex
329   - except Exception:
330   - logging.exception('Unexpected exception in handler')
331   - msg_type = TMessageType.EXCEPTION
332   - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
333   - oprot.writeMessageBegin("getImageList", msg_type, seqid)
334   - result.write(oprot)
335   - oprot.writeMessageEnd()
336   - oprot.trans.flush()
337   -
338   -# HELPER FUNCTIONS AND STRUCTURES
339   -
340   -
341   -class getData_args(object):
342   - """
343   - Attributes:
344   - - path
345   - - queryRange
346   - - originRange
347   - - bands
348   - - width
349   - - height
350   -
351   - """
352   -
353   -
354   - def __init__(self, path=None, queryRange=None, originRange=None, bands=None, width=None, height=None,):
355   - self.path = path
356   - self.queryRange = queryRange
357   - self.originRange = originRange
358   - self.bands = bands
359   - self.width = width
360   - self.height = height
361   -
362   - def read(self, iprot):
363   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
364   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
365   - return
366   - iprot.readStructBegin()
367   - while True:
368   - (fname, ftype, fid) = iprot.readFieldBegin()
369   - if ftype == TType.STOP:
370   - break
371   - if fid == 1:
372   - if ftype == TType.STRING:
373   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
374   - else:
375   - iprot.skip(ftype)
376   - elif fid == 2:
377   - if ftype == TType.LIST:
378   - self.queryRange = []
379   - (_etype38, _size35) = iprot.readListBegin()
380   - for _i39 in range(_size35):
381   - _elem40 = iprot.readDouble()
382   - self.queryRange.append(_elem40)
383   - iprot.readListEnd()
384   - else:
385   - iprot.skip(ftype)
386   - elif fid == 3:
387   - if ftype == TType.LIST:
388   - self.originRange = []
389   - (_etype44, _size41) = iprot.readListBegin()
390   - for _i45 in range(_size41):
391   - _elem46 = iprot.readDouble()
392   - self.originRange.append(_elem46)
393   - iprot.readListEnd()
394   - else:
395   - iprot.skip(ftype)
396   - elif fid == 4:
397   - if ftype == TType.LIST:
398   - self.bands = []
399   - (_etype50, _size47) = iprot.readListBegin()
400   - for _i51 in range(_size47):
401   - _elem52 = iprot.readI32()
402   - self.bands.append(_elem52)
403   - iprot.readListEnd()
404   - else:
405   - iprot.skip(ftype)
406   - elif fid == 5:
407   - if ftype == TType.I32:
408   - self.width = iprot.readI32()
409   - else:
410   - iprot.skip(ftype)
411   - elif fid == 6:
412   - if ftype == TType.I32:
413   - self.height = iprot.readI32()
414   - else:
415   - iprot.skip(ftype)
416   - else:
417   - iprot.skip(ftype)
418   - iprot.readFieldEnd()
419   - iprot.readStructEnd()
420   -
421   - def write(self, oprot):
422   - if oprot._fast_encode is not None and self.thrift_spec is not None:
423   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
424   - return
425   - oprot.writeStructBegin('getData_args')
426   - if self.path is not None:
427   - oprot.writeFieldBegin('path', TType.STRING, 1)
428   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
429   - oprot.writeFieldEnd()
430   - if self.queryRange is not None:
431   - oprot.writeFieldBegin('queryRange', TType.LIST, 2)
432   - oprot.writeListBegin(TType.DOUBLE, len(self.queryRange))
433   - for iter53 in self.queryRange:
434   - oprot.writeDouble(iter53)
435   - oprot.writeListEnd()
436   - oprot.writeFieldEnd()
437   - if self.originRange is not None:
438   - oprot.writeFieldBegin('originRange', TType.LIST, 3)
439   - oprot.writeListBegin(TType.DOUBLE, len(self.originRange))
440   - for iter54 in self.originRange:
441   - oprot.writeDouble(iter54)
442   - oprot.writeListEnd()
443   - oprot.writeFieldEnd()
444   - if self.bands is not None:
445   - oprot.writeFieldBegin('bands', TType.LIST, 4)
446   - oprot.writeListBegin(TType.I32, len(self.bands))
447   - for iter55 in self.bands:
448   - oprot.writeI32(iter55)
449   - oprot.writeListEnd()
450   - oprot.writeFieldEnd()
451   - if self.width is not None:
452   - oprot.writeFieldBegin('width', TType.I32, 5)
453   - oprot.writeI32(self.width)
454   - oprot.writeFieldEnd()
455   - if self.height is not None:
456   - oprot.writeFieldBegin('height', TType.I32, 6)
457   - oprot.writeI32(self.height)
458   - oprot.writeFieldEnd()
459   - oprot.writeFieldStop()
460   - oprot.writeStructEnd()
461   -
462   - def validate(self):
463   - return
464   -
465   - def __repr__(self):
466   - L = ['%s=%r' % (key, value)
467   - for key, value in self.__dict__.items()]
468   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
469   -
470   - def __eq__(self, other):
471   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
472   -
473   - def __ne__(self, other):
474   - return not (self == other)
475   -all_structs.append(getData_args)
476   -getData_args.thrift_spec = (
477   - None, # 0
478   - (1, TType.STRING, 'path', 'UTF8', None, ), # 1
479   - (2, TType.LIST, 'queryRange', (TType.DOUBLE, None, False), None, ), # 2
480   - (3, TType.LIST, 'originRange', (TType.DOUBLE, None, False), None, ), # 3
481   - (4, TType.LIST, 'bands', (TType.I32, None, False), None, ), # 4
482   - (5, TType.I32, 'width', None, None, ), # 5
483   - (6, TType.I32, 'height', None, None, ), # 6
484   -)
485   -
486   -
487   -class getData_result(object):
488   - """
489   - Attributes:
490   - - success
491   -
492   - """
493   -
494   -
495   - def __init__(self, success=None,):
496   - self.success = success
497   -
498   - def read(self, iprot):
499   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
500   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
501   - return
502   - iprot.readStructBegin()
503   - while True:
504   - (fname, ftype, fid) = iprot.readFieldBegin()
505   - if ftype == TType.STOP:
506   - break
507   - if fid == 0:
508   - if ftype == TType.LIST:
509   - self.success = []
510   - (_etype59, _size56) = iprot.readListBegin()
511   - for _i60 in range(_size56):
512   - _elem61 = []
513   - (_etype65, _size62) = iprot.readListBegin()
514   - for _i66 in range(_size62):
515   - _elem67 = iprot.readI16()
516   - _elem61.append(_elem67)
517   - iprot.readListEnd()
518   - self.success.append(_elem61)
519   - iprot.readListEnd()
520   - else:
521   - iprot.skip(ftype)
522   - else:
523   - iprot.skip(ftype)
524   - iprot.readFieldEnd()
525   - iprot.readStructEnd()
526   -
527   - def write(self, oprot):
528   - if oprot._fast_encode is not None and self.thrift_spec is not None:
529   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
530   - return
531   - oprot.writeStructBegin('getData_result')
532   - if self.success is not None:
533   - oprot.writeFieldBegin('success', TType.LIST, 0)
534   - oprot.writeListBegin(TType.LIST, len(self.success))
535   - for iter68 in self.success:
536   - oprot.writeListBegin(TType.I16, len(iter68))
537   - for iter69 in iter68:
538   - oprot.writeI16(iter69)
539   - oprot.writeListEnd()
540   - oprot.writeListEnd()
541   - oprot.writeFieldEnd()
542   - oprot.writeFieldStop()
543   - oprot.writeStructEnd()
544   -
545   - def validate(self):
546   - return
547   -
548   - def __repr__(self):
549   - L = ['%s=%r' % (key, value)
550   - for key, value in self.__dict__.items()]
551   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
552   -
553   - def __eq__(self, other):
554   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
555   -
556   - def __ne__(self, other):
557   - return not (self == other)
558   -all_structs.append(getData_result)
559   -getData_result.thrift_spec = (
560   - (0, TType.LIST, 'success', (TType.LIST, (TType.I16, None, False), False), None, ), # 0
561   -)
562   -
563   -
564   -class getInfo_args(object):
565   - """
566   - Attributes:
567   - - path
568   -
569   - """
570   -
571   -
572   - def __init__(self, path=None,):
573   - self.path = path
574   -
575   - def read(self, iprot):
576   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
577   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
578   - return
579   - iprot.readStructBegin()
580   - while True:
581   - (fname, ftype, fid) = iprot.readFieldBegin()
582   - if ftype == TType.STOP:
583   - break
584   - if fid == 1:
585   - if ftype == TType.STRING:
586   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
587   - else:
588   - iprot.skip(ftype)
589   - else:
590   - iprot.skip(ftype)
591   - iprot.readFieldEnd()
592   - iprot.readStructEnd()
593   -
594   - def write(self, oprot):
595   - if oprot._fast_encode is not None and self.thrift_spec is not None:
596   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
597   - return
598   - oprot.writeStructBegin('getInfo_args')
599   - if self.path is not None:
600   - oprot.writeFieldBegin('path', TType.STRING, 1)
601   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
602   - oprot.writeFieldEnd()
603   - oprot.writeFieldStop()
604   - oprot.writeStructEnd()
605   -
606   - def validate(self):
607   - return
608   -
609   - def __repr__(self):
610   - L = ['%s=%r' % (key, value)
611   - for key, value in self.__dict__.items()]
612   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
613   -
614   - def __eq__(self, other):
615   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
616   -
617   - def __ne__(self, other):
618   - return not (self == other)
619   -all_structs.append(getInfo_args)
620   -getInfo_args.thrift_spec = (
621   - None, # 0
622   - (1, TType.STRING, 'path', 'UTF8', None, ), # 1
623   -)
624   -
625   -
626   -class getInfo_result(object):
627   - """
628   - Attributes:
629   - - success
630   -
631   - """
632   -
633   -
634   - def __init__(self, success=None,):
635   - self.success = success
636   -
637   - def read(self, iprot):
638   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
639   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
640   - return
641   - iprot.readStructBegin()
642   - while True:
643   - (fname, ftype, fid) = iprot.readFieldBegin()
644   - if ftype == TType.STOP:
645   - break
646   - if fid == 0:
647   - if ftype == TType.STRUCT:
648   - self.success = Raster()
649   - self.success.read(iprot)
650   - else:
651   - iprot.skip(ftype)
652   - else:
653   - iprot.skip(ftype)
654   - iprot.readFieldEnd()
655   - iprot.readStructEnd()
656   -
657   - def write(self, oprot):
658   - if oprot._fast_encode is not None and self.thrift_spec is not None:
659   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
660   - return
661   - oprot.writeStructBegin('getInfo_result')
662   - if self.success is not None:
663   - oprot.writeFieldBegin('success', TType.STRUCT, 0)
664   - self.success.write(oprot)
665   - oprot.writeFieldEnd()
666   - oprot.writeFieldStop()
667   - oprot.writeStructEnd()
668   -
669   - def validate(self):
670   - return
671   -
672   - def __repr__(self):
673   - L = ['%s=%r' % (key, value)
674   - for key, value in self.__dict__.items()]
675   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
676   -
677   - def __eq__(self, other):
678   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
679   -
680   - def __ne__(self, other):
681   - return not (self == other)
682   -all_structs.append(getInfo_result)
683   -getInfo_result.thrift_spec = (
684   - (0, TType.STRUCT, 'success', [Raster, None], None, ), # 0
685   -)
686   -
687   -
688   -class buildOverview_args(object):
689   - """
690   - Attributes:
691   - - path
692   -
693   - """
694   -
695   -
696   - def __init__(self, path=None,):
697   - self.path = path
698   -
699   - def read(self, iprot):
700   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
701   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
702   - return
703   - iprot.readStructBegin()
704   - while True:
705   - (fname, ftype, fid) = iprot.readFieldBegin()
706   - if ftype == TType.STOP:
707   - break
708   - if fid == 1:
709   - if ftype == TType.STRING:
710   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
711   - else:
712   - iprot.skip(ftype)
713   - else:
714   - iprot.skip(ftype)
715   - iprot.readFieldEnd()
716   - iprot.readStructEnd()
717   -
718   - def write(self, oprot):
719   - if oprot._fast_encode is not None and self.thrift_spec is not None:
720   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
721   - return
722   - oprot.writeStructBegin('buildOverview_args')
723   - if self.path is not None:
724   - oprot.writeFieldBegin('path', TType.STRING, 1)
725   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
726   - oprot.writeFieldEnd()
727   - oprot.writeFieldStop()
728   - oprot.writeStructEnd()
729   -
730   - def validate(self):
731   - return
732   -
733   - def __repr__(self):
734   - L = ['%s=%r' % (key, value)
735   - for key, value in self.__dict__.items()]
736   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
737   -
738   - def __eq__(self, other):
739   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
740   -
741   - def __ne__(self, other):
742   - return not (self == other)
743   -all_structs.append(buildOverview_args)
744   -buildOverview_args.thrift_spec = (
745   - None, # 0
746   - (1, TType.STRING, 'path', 'UTF8', None, ), # 1
747   -)
748   -
749   -
750   -class buildOverview_result(object):
751   - """
752   - Attributes:
753   - - success
754   -
755   - """
756   -
757   -
758   - def __init__(self, success=None,):
759   - self.success = success
760   -
761   - def read(self, iprot):
762   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
763   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
764   - return
765   - iprot.readStructBegin()
766   - while True:
767   - (fname, ftype, fid) = iprot.readFieldBegin()
768   - if ftype == TType.STOP:
769   - break
770   - if fid == 0:
771   - if ftype == TType.BOOL:
772   - self.success = iprot.readBool()
773   - else:
774   - iprot.skip(ftype)
775   - else:
776   - iprot.skip(ftype)
777   - iprot.readFieldEnd()
778   - iprot.readStructEnd()
779   -
780   - def write(self, oprot):
781   - if oprot._fast_encode is not None and self.thrift_spec is not None:
782   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
783   - return
784   - oprot.writeStructBegin('buildOverview_result')
785   - if self.success is not None:
786   - oprot.writeFieldBegin('success', TType.BOOL, 0)
787   - oprot.writeBool(self.success)
788   - oprot.writeFieldEnd()
789   - oprot.writeFieldStop()
790   - oprot.writeStructEnd()
791   -
792   - def validate(self):
793   - return
794   -
795   - def __repr__(self):
796   - L = ['%s=%r' % (key, value)
797   - for key, value in self.__dict__.items()]
798   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
799   -
800   - def __eq__(self, other):
801   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
802   -
803   - def __ne__(self, other):
804   - return not (self == other)
805   -all_structs.append(buildOverview_result)
806   -buildOverview_result.thrift_spec = (
807   - (0, TType.BOOL, 'success', None, None, ), # 0
808   -)
809   -
810   -
811   -class getImageList_args(object):
812   - """
813   - Attributes:
814   - - path
815   -
816   - """
817   -
818   -
819   - def __init__(self, path=None,):
820   - self.path = path
821   -
822   - def read(self, iprot):
823   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
824   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
825   - return
826   - iprot.readStructBegin()
827   - while True:
828   - (fname, ftype, fid) = iprot.readFieldBegin()
829   - if ftype == TType.STOP:
830   - break
831   - if fid == 1:
832   - if ftype == TType.STRING:
833   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
834   - else:
835   - iprot.skip(ftype)
836   - else:
837   - iprot.skip(ftype)
838   - iprot.readFieldEnd()
839   - iprot.readStructEnd()
840   -
841   - def write(self, oprot):
842   - if oprot._fast_encode is not None and self.thrift_spec is not None:
843   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
844   - return
845   - oprot.writeStructBegin('getImageList_args')
846   - if self.path is not None:
847   - oprot.writeFieldBegin('path', TType.STRING, 1)
848   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
849   - oprot.writeFieldEnd()
850   - oprot.writeFieldStop()
851   - oprot.writeStructEnd()
852   -
853   - def validate(self):
854   - return
855   -
856   - def __repr__(self):
857   - L = ['%s=%r' % (key, value)
858   - for key, value in self.__dict__.items()]
859   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
860   -
861   - def __eq__(self, other):
862   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
863   -
864   - def __ne__(self, other):
865   - return not (self == other)
866   -all_structs.append(getImageList_args)
867   -getImageList_args.thrift_spec = (
868   - None, # 0
869   - (1, TType.STRING, 'path', 'UTF8', None, ), # 1
870   -)
871   -
872   -
873   -class getImageList_result(object):
874   - """
875   - Attributes:
876   - - success
877   -
878   - """
879   -
880   -
881   - def __init__(self, success=None,):
882   - self.success = success
883   -
884   - def read(self, iprot):
885   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
886   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
887   - return
888   - iprot.readStructBegin()
889   - while True:
890   - (fname, ftype, fid) = iprot.readFieldBegin()
891   - if ftype == TType.STOP:
892   - break
893   - if fid == 0:
894   - if ftype == TType.LIST:
895   - self.success = []
896   - (_etype73, _size70) = iprot.readListBegin()
897   - for _i74 in range(_size70):
898   - _elem75 = Image()
899   - _elem75.read(iprot)
900   - self.success.append(_elem75)
901   - iprot.readListEnd()
902   - else:
903   - iprot.skip(ftype)
904   - else:
905   - iprot.skip(ftype)
906   - iprot.readFieldEnd()
907   - iprot.readStructEnd()
908   -
909   - def write(self, oprot):
910   - if oprot._fast_encode is not None and self.thrift_spec is not None:
911   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
912   - return
913   - oprot.writeStructBegin('getImageList_result')
914   - if self.success is not None:
915   - oprot.writeFieldBegin('success', TType.LIST, 0)
916   - oprot.writeListBegin(TType.STRUCT, len(self.success))
917   - for iter76 in self.success:
918   - iter76.write(oprot)
919   - oprot.writeListEnd()
920   - oprot.writeFieldEnd()
921   - oprot.writeFieldStop()
922   - oprot.writeStructEnd()
923   -
924   - def validate(self):
925   - return
926   -
927   - def __repr__(self):
928   - L = ['%s=%r' % (key, value)
929   - for key, value in self.__dict__.items()]
930   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
931   -
932   - def __eq__(self, other):
933   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
934   -
935   - def __ne__(self, other):
936   - return not (self == other)
937   -all_structs.append(getImageList_result)
938   -getImageList_result.thrift_spec = (
939   - (0, TType.LIST, 'success', (TType.STRUCT, [Image, None], False), None, ), # 0
940   -)
941   -fix_spec(all_structs)
942   -del all_structs
1   -__all__ = ['ttypes', 'constants', 'Calculator']
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   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/9/27
4   -#email: nheweijun@sina.com
5   -
6   -
7   -# from .ttypes import RasterData
8   -
9   -from thrift.transport import TSocket
10   -from thrift.transport import TTransport
11   -from thrift.protocol import TBinaryProtocol
12   -
13   -from app.modules.service.image.tutorial import Calculator
14   -from app.modules.service.image.ImageDataService import ImageDataService
15   -import time
16   -
17   -def test1():
18   -
19   - host = "172.26.60.100"
20   - port = 8850
21   -
22   - transport: TSocket = TSocket.TSocket(host, port)
23   - transport = TTransport.TBufferedTransport(transport)
24   - protocol = TBinaryProtocol.TBinaryProtocol(transport)
25   - client = Calculator.Client(protocol)
26   -
27   -
28   - transport.open()
29   - import sys
30   - test = client.getData("江南_01.tif",[1340.27, -1911.31, 4351.79, 5410.6],[1340.27, -1911.31, 4351.79, 5410.6],[3,2,1],768,768)
31   - print(sys.getsizeof(test[1]))
32   - # print(test)
33   -
34   -def test2():
35   - host = "172.26.60.100"
36   - port = 9090
37   -
38   - transport: TSocket = TSocket.TSocket(host, port)
39   - transport = TTransport.TBufferedTransport(transport)
40   - protocol = TBinaryProtocol.TBinaryProtocol(transport)
41   - client = ImageDataService.Client(protocol)
42   -
43   - transport.open()
44   -
45   - test = client.getData("/usr/src/data/江南_01.tif", [1340.27, -1911.31, 4351.79, 5410.6], [1340.27, -1911.31, 4351.79, 5410.6],
46   - [1,2,3], 768, 768)
47   -
48   - import gzip,numpy
49   - data = gzip.decompress(test)
50   - # data = numpy.frombuffer(data, dtype='int64')
51   - # data = data.reshape((768, 768, 3))
52   -
53   - import sys
54   - print(sys.getsizeof(data))
55   - # print(test)
56   -
57   -if __name__ == '__main__':
58   - t1 = time.time()
59   - # test1()
60   - print(time.time()-t1)
61   - t2 = time.time()
62   - test2()
63   - print(time.time()-t2)
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   -
18   -
19   -class Image(object):
20   - """
21   - Structs are the basic complex data structures. They are comprised of fields
22   - which each have an integer identifier, a type, a symbolic name, and an
23   - optional default value.
24   -
25   - Fields can be declared "optional", which ensures they will not be included
26   - in the serialized output if they aren't set. Note that this requires some
27   - manual management in some languages.
28   -
29   - Attributes:
30   - - name
31   - - path
32   - - size
33   - - create_time
34   - - type
35   -
36   - """
37   -
38   -
39   - def __init__(self, name=None, path=None, size=None, create_time=None, type=None,):
40   - self.name = name
41   - self.path = path
42   - self.size = size
43   - self.create_time = create_time
44   - self.type = type
45   -
46   - def read(self, iprot):
47   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
48   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
49   - return
50   - iprot.readStructBegin()
51   - while True:
52   - (fname, ftype, fid) = iprot.readFieldBegin()
53   - if ftype == TType.STOP:
54   - break
55   - if fid == 1:
56   - if ftype == TType.STRING:
57   - self.name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
58   - else:
59   - iprot.skip(ftype)
60   - elif fid == 2:
61   - if ftype == TType.STRING:
62   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
63   - else:
64   - iprot.skip(ftype)
65   - elif fid == 3:
66   - if ftype == TType.STRING:
67   - self.size = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
68   - else:
69   - iprot.skip(ftype)
70   - elif fid == 4:
71   - if ftype == TType.STRING:
72   - self.create_time = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
73   - else:
74   - iprot.skip(ftype)
75   - elif fid == 5:
76   - if ftype == TType.STRING:
77   - self.type = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
78   - else:
79   - iprot.skip(ftype)
80   - else:
81   - iprot.skip(ftype)
82   - iprot.readFieldEnd()
83   - iprot.readStructEnd()
84   -
85   - def write(self, oprot):
86   - if oprot._fast_encode is not None and self.thrift_spec is not None:
87   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
88   - return
89   - oprot.writeStructBegin('Image')
90   - if self.name is not None:
91   - oprot.writeFieldBegin('name', TType.STRING, 1)
92   - oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name)
93   - oprot.writeFieldEnd()
94   - if self.path is not None:
95   - oprot.writeFieldBegin('path', TType.STRING, 2)
96   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
97   - oprot.writeFieldEnd()
98   - if self.size is not None:
99   - oprot.writeFieldBegin('size', TType.STRING, 3)
100   - oprot.writeString(self.size.encode('utf-8') if sys.version_info[0] == 2 else self.size)
101   - oprot.writeFieldEnd()
102   - if self.create_time is not None:
103   - oprot.writeFieldBegin('create_time', TType.STRING, 4)
104   - oprot.writeString(self.create_time.encode('utf-8') if sys.version_info[0] == 2 else self.create_time)
105   - oprot.writeFieldEnd()
106   - if self.type is not None:
107   - oprot.writeFieldBegin('type', TType.STRING, 5)
108   - oprot.writeString(self.type.encode('utf-8') if sys.version_info[0] == 2 else self.type)
109   - oprot.writeFieldEnd()
110   - oprot.writeFieldStop()
111   - oprot.writeStructEnd()
112   -
113   - def validate(self):
114   - return
115   -
116   - def __repr__(self):
117   - L = ['%s=%r' % (key, value)
118   - for key, value in self.__dict__.items()]
119   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
120   -
121   - def __eq__(self, other):
122   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
123   -
124   - def __ne__(self, other):
125   - return not (self == other)
126   -
127   -
128   -class RasterData(object):
129   - """
130   - Attributes:
131   - - R
132   - - G
133   - - B
134   -
135   - """
136   -
137   -
138   - def __init__(self, R=None, G=None, B=None,):
139   - self.R = R
140   - self.G = G
141   - self.B = B
142   -
143   - def read(self, iprot):
144   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
145   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
146   - return
147   - iprot.readStructBegin()
148   - while True:
149   - (fname, ftype, fid) = iprot.readFieldBegin()
150   - if ftype == TType.STOP:
151   - break
152   - if fid == 1:
153   - if ftype == TType.LIST:
154   - self.R = []
155   - (_etype3, _size0) = iprot.readListBegin()
156   - for _i4 in range(_size0):
157   - _elem5 = iprot.readI16()
158   - self.R.append(_elem5)
159   - iprot.readListEnd()
160   - else:
161   - iprot.skip(ftype)
162   - elif fid == 2:
163   - if ftype == TType.LIST:
164   - self.G = []
165   - (_etype9, _size6) = iprot.readListBegin()
166   - for _i10 in range(_size6):
167   - _elem11 = iprot.readI16()
168   - self.G.append(_elem11)
169   - iprot.readListEnd()
170   - else:
171   - iprot.skip(ftype)
172   - elif fid == 3:
173   - if ftype == TType.LIST:
174   - self.B = []
175   - (_etype15, _size12) = iprot.readListBegin()
176   - for _i16 in range(_size12):
177   - _elem17 = iprot.readI16()
178   - self.B.append(_elem17)
179   - iprot.readListEnd()
180   - else:
181   - iprot.skip(ftype)
182   - else:
183   - iprot.skip(ftype)
184   - iprot.readFieldEnd()
185   - iprot.readStructEnd()
186   -
187   - def write(self, oprot):
188   - if oprot._fast_encode is not None and self.thrift_spec is not None:
189   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
190   - return
191   - oprot.writeStructBegin('RasterData')
192   - if self.R is not None:
193   - oprot.writeFieldBegin('R', TType.LIST, 1)
194   - oprot.writeListBegin(TType.I16, len(self.R))
195   - for iter18 in self.R:
196   - oprot.writeI16(iter18)
197   - oprot.writeListEnd()
198   - oprot.writeFieldEnd()
199   - if self.G is not None:
200   - oprot.writeFieldBegin('G', TType.LIST, 2)
201   - oprot.writeListBegin(TType.I16, len(self.G))
202   - for iter19 in self.G:
203   - oprot.writeI16(iter19)
204   - oprot.writeListEnd()
205   - oprot.writeFieldEnd()
206   - if self.B is not None:
207   - oprot.writeFieldBegin('B', TType.LIST, 3)
208   - oprot.writeListBegin(TType.I16, len(self.B))
209   - for iter20 in self.B:
210   - oprot.writeI16(iter20)
211   - oprot.writeListEnd()
212   - oprot.writeFieldEnd()
213   - oprot.writeFieldStop()
214   - oprot.writeStructEnd()
215   -
216   - def validate(self):
217   - return
218   -
219   - def __repr__(self):
220   - L = ['%s=%r' % (key, value)
221   - for key, value in self.__dict__.items()]
222   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
223   -
224   - def __eq__(self, other):
225   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
226   -
227   - def __ne__(self, other):
228   - return not (self == other)
229   -
230   -
231   -class Raster(object):
232   - """
233   - Attributes:
234   - - band_count
235   - - overview_count
236   - - xy_size
237   - - origin_extent
238   - - null_value
239   - - sr_wkt
240   - - epsg
241   - - sr_proj4
242   - - size
243   - - path
244   - - cell_x_size
245   - - cell_y_size
246   -
247   - """
248   -
249   -
250   - def __init__(self, band_count=None, overview_count=None, xy_size=None, origin_extent=None, null_value=None, sr_wkt=None, epsg=None, sr_proj4=None, size=None, path=None, cell_x_size=None, cell_y_size=None,):
251   - self.band_count = band_count
252   - self.overview_count = overview_count
253   - self.xy_size = xy_size
254   - self.origin_extent = origin_extent
255   - self.null_value = null_value
256   - self.sr_wkt = sr_wkt
257   - self.epsg = epsg
258   - self.sr_proj4 = sr_proj4
259   - self.size = size
260   - self.path = path
261   - self.cell_x_size = cell_x_size
262   - self.cell_y_size = cell_y_size
263   -
264   - def read(self, iprot):
265   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
266   - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
267   - return
268   - iprot.readStructBegin()
269   - while True:
270   - (fname, ftype, fid) = iprot.readFieldBegin()
271   - if ftype == TType.STOP:
272   - break
273   - if fid == 1:
274   - if ftype == TType.I32:
275   - self.band_count = iprot.readI32()
276   - else:
277   - iprot.skip(ftype)
278   - elif fid == 2:
279   - if ftype == TType.I32:
280   - self.overview_count = iprot.readI32()
281   - else:
282   - iprot.skip(ftype)
283   - elif fid == 3:
284   - if ftype == TType.LIST:
285   - self.xy_size = []
286   - (_etype24, _size21) = iprot.readListBegin()
287   - for _i25 in range(_size21):
288   - _elem26 = iprot.readI32()
289   - self.xy_size.append(_elem26)
290   - iprot.readListEnd()
291   - else:
292   - iprot.skip(ftype)
293   - elif fid == 4:
294   - if ftype == TType.LIST:
295   - self.origin_extent = []
296   - (_etype30, _size27) = iprot.readListBegin()
297   - for _i31 in range(_size27):
298   - _elem32 = iprot.readDouble()
299   - self.origin_extent.append(_elem32)
300   - iprot.readListEnd()
301   - else:
302   - iprot.skip(ftype)
303   - elif fid == 5:
304   - if ftype == TType.DOUBLE:
305   - self.null_value = iprot.readDouble()
306   - else:
307   - iprot.skip(ftype)
308   - elif fid == 6:
309   - if ftype == TType.STRING:
310   - self.sr_wkt = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
311   - else:
312   - iprot.skip(ftype)
313   - elif fid == 7:
314   - if ftype == TType.STRING:
315   - self.epsg = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
316   - else:
317   - iprot.skip(ftype)
318   - elif fid == 8:
319   - if ftype == TType.STRING:
320   - self.sr_proj4 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
321   - else:
322   - iprot.skip(ftype)
323   - elif fid == 9:
324   - if ftype == TType.I32:
325   - self.size = iprot.readI32()
326   - else:
327   - iprot.skip(ftype)
328   - elif fid == 10:
329   - if ftype == TType.STRING:
330   - self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
331   - else:
332   - iprot.skip(ftype)
333   - elif fid == 11:
334   - if ftype == TType.DOUBLE:
335   - self.cell_x_size = iprot.readDouble()
336   - else:
337   - iprot.skip(ftype)
338   - elif fid == 12:
339   - if ftype == TType.DOUBLE:
340   - self.cell_y_size = iprot.readDouble()
341   - else:
342   - iprot.skip(ftype)
343   - else:
344   - iprot.skip(ftype)
345   - iprot.readFieldEnd()
346   - iprot.readStructEnd()
347   -
348   - def write(self, oprot):
349   - if oprot._fast_encode is not None and self.thrift_spec is not None:
350   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
351   - return
352   - oprot.writeStructBegin('Raster')
353   - if self.band_count is not None:
354   - oprot.writeFieldBegin('band_count', TType.I32, 1)
355   - oprot.writeI32(self.band_count)
356   - oprot.writeFieldEnd()
357   - if self.overview_count is not None:
358   - oprot.writeFieldBegin('overview_count', TType.I32, 2)
359   - oprot.writeI32(self.overview_count)
360   - oprot.writeFieldEnd()
361   - if self.xy_size is not None:
362   - oprot.writeFieldBegin('xy_size', TType.LIST, 3)
363   - oprot.writeListBegin(TType.I32, len(self.xy_size))
364   - for iter33 in self.xy_size:
365   - oprot.writeI32(iter33)
366   - oprot.writeListEnd()
367   - oprot.writeFieldEnd()
368   - if self.origin_extent is not None:
369   - oprot.writeFieldBegin('origin_extent', TType.LIST, 4)
370   - oprot.writeListBegin(TType.DOUBLE, len(self.origin_extent))
371   - for iter34 in self.origin_extent:
372   - oprot.writeDouble(iter34)
373   - oprot.writeListEnd()
374   - oprot.writeFieldEnd()
375   - if self.null_value is not None:
376   - oprot.writeFieldBegin('null_value', TType.DOUBLE, 5)
377   - oprot.writeDouble(self.null_value)
378   - oprot.writeFieldEnd()
379   - if self.sr_wkt is not None:
380   - oprot.writeFieldBegin('sr_wkt', TType.STRING, 6)
381   - oprot.writeString(self.sr_wkt.encode('utf-8') if sys.version_info[0] == 2 else self.sr_wkt)
382   - oprot.writeFieldEnd()
383   - if self.epsg is not None:
384   - oprot.writeFieldBegin('epsg', TType.STRING, 7)
385   - oprot.writeString(self.epsg.encode('utf-8') if sys.version_info[0] == 2 else self.epsg)
386   - oprot.writeFieldEnd()
387   - if self.sr_proj4 is not None:
388   - oprot.writeFieldBegin('sr_proj4', TType.STRING, 8)
389   - oprot.writeString(self.sr_proj4.encode('utf-8') if sys.version_info[0] == 2 else self.sr_proj4)
390   - oprot.writeFieldEnd()
391   - if self.size is not None:
392   - oprot.writeFieldBegin('size', TType.I32, 9)
393   - oprot.writeI32(self.size)
394   - oprot.writeFieldEnd()
395   - if self.path is not None:
396   - oprot.writeFieldBegin('path', TType.STRING, 10)
397   - oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path)
398   - oprot.writeFieldEnd()
399   - if self.cell_x_size is not None:
400   - oprot.writeFieldBegin('cell_x_size', TType.DOUBLE, 11)
401   - oprot.writeDouble(self.cell_x_size)
402   - oprot.writeFieldEnd()
403   - if self.cell_y_size is not None:
404   - oprot.writeFieldBegin('cell_y_size', TType.DOUBLE, 12)
405   - oprot.writeDouble(self.cell_y_size)
406   - oprot.writeFieldEnd()
407   - oprot.writeFieldStop()
408   - oprot.writeStructEnd()
409   -
410   - def validate(self):
411   - return
412   -
413   - def __repr__(self):
414   - L = ['%s=%r' % (key, value)
415   - for key, value in self.__dict__.items()]
416   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
417   -
418   - def __eq__(self, other):
419   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
420   -
421   - def __ne__(self, other):
422   - return not (self == other)
423   -
424   -
425   -class InvalidOperation(TException):
426   - """
427   - Structs can also be exceptions, if they are nasty.
428   -
429   - Attributes:
430   - - whatOp
431   - - why
432   -
433   - """
434   -
435   -
436   - def __init__(self, whatOp=None, why=None,):
437   - super(InvalidOperation, self).__setattr__('whatOp', whatOp)
438   - super(InvalidOperation, self).__setattr__('why', why)
439   -
440   - def __setattr__(self, *args):
441   - raise TypeError("can't modify immutable instance")
442   -
443   - def __delattr__(self, *args):
444   - raise TypeError("can't modify immutable instance")
445   -
446   - def __hash__(self):
447   - return hash(self.__class__) ^ hash((self.whatOp, self.why, ))
448   -
449   - @classmethod
450   - def read(cls, iprot):
451   - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and cls.thrift_spec is not None:
452   - return iprot._fast_decode(None, iprot, [cls, cls.thrift_spec])
453   - iprot.readStructBegin()
454   - whatOp = None
455   - why = None
456   - while True:
457   - (fname, ftype, fid) = iprot.readFieldBegin()
458   - if ftype == TType.STOP:
459   - break
460   - if fid == 1:
461   - if ftype == TType.I32:
462   - whatOp = iprot.readI32()
463   - else:
464   - iprot.skip(ftype)
465   - elif fid == 2:
466   - if ftype == TType.STRING:
467   - why = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
468   - else:
469   - iprot.skip(ftype)
470   - else:
471   - iprot.skip(ftype)
472   - iprot.readFieldEnd()
473   - iprot.readStructEnd()
474   - return cls(
475   - whatOp=whatOp,
476   - why=why,
477   - )
478   -
479   - def write(self, oprot):
480   - if oprot._fast_encode is not None and self.thrift_spec is not None:
481   - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
482   - return
483   - oprot.writeStructBegin('InvalidOperation')
484   - if self.whatOp is not None:
485   - oprot.writeFieldBegin('whatOp', TType.I32, 1)
486   - oprot.writeI32(self.whatOp)
487   - oprot.writeFieldEnd()
488   - if self.why is not None:
489   - oprot.writeFieldBegin('why', TType.STRING, 2)
490   - oprot.writeString(self.why.encode('utf-8') if sys.version_info[0] == 2 else self.why)
491   - oprot.writeFieldEnd()
492   - oprot.writeFieldStop()
493   - oprot.writeStructEnd()
494   -
495   - def validate(self):
496   - return
497   -
498   - def __str__(self):
499   - return repr(self)
500   -
501   - def __repr__(self):
502   - L = ['%s=%r' % (key, value)
503   - for key, value in self.__dict__.items()]
504   - return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
505   -
506   - def __eq__(self, other):
507   - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
508   -
509   - def __ne__(self, other):
510   - return not (self == other)
511   -all_structs.append(Image)
512   -Image.thrift_spec = (
513   - None, # 0
514   - (1, TType.STRING, 'name', 'UTF8', None, ), # 1
515   - (2, TType.STRING, 'path', 'UTF8', None, ), # 2
516   - (3, TType.STRING, 'size', 'UTF8', None, ), # 3
517   - (4, TType.STRING, 'create_time', 'UTF8', None, ), # 4
518   - (5, TType.STRING, 'type', 'UTF8', None, ), # 5
519   -)
520   -all_structs.append(RasterData)
521   -RasterData.thrift_spec = (
522   - None, # 0
523   - (1, TType.LIST, 'R', (TType.I16, None, False), None, ), # 1
524   - (2, TType.LIST, 'G', (TType.I16, None, False), None, ), # 2
525   - (3, TType.LIST, 'B', (TType.I16, None, False), None, ), # 3
526   -)
527   -all_structs.append(Raster)
528   -Raster.thrift_spec = (
529   - None, # 0
530   - (1, TType.I32, 'band_count', None, None, ), # 1
531   - (2, TType.I32, 'overview_count', None, None, ), # 2
532   - (3, TType.LIST, 'xy_size', (TType.I32, None, False), None, ), # 3
533   - (4, TType.LIST, 'origin_extent', (TType.DOUBLE, None, False), None, ), # 4
534   - (5, TType.DOUBLE, 'null_value', None, None, ), # 5
535   - (6, TType.STRING, 'sr_wkt', 'UTF8', None, ), # 6
536   - (7, TType.STRING, 'epsg', 'UTF8', None, ), # 7
537   - (8, TType.STRING, 'sr_proj4', 'UTF8', None, ), # 8
538   - (9, TType.I32, 'size', None, None, ), # 9
539   - (10, TType.STRING, 'path', 'UTF8', None, ), # 10
540   - (11, TType.DOUBLE, 'cell_x_size', None, None, ), # 11
541   - (12, TType.DOUBLE, 'cell_y_size', None, None, ), # 12
542   -)
543   -all_structs.append(InvalidOperation)
544   -InvalidOperation.thrift_spec = (
545   - None, # 0
546   - (1, TType.I32, 'whatOp', None, None, ), # 1
547   - (2, TType.STRING, 'why', 'UTF8', None, ), # 2
548   -)
549   -fix_spec(all_structs)
550   -del all_structs
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/10/18
4   -#email: nheweijun@sina.com
5   -
6   -
7   -from kazoo.client import KazooClient
8   -import configure
9   -import time
10   -from app.modules.service.models import ImageService
11   -from app.modules.service.models import TileScheme,Service
12   -from app.util.component.ModelVisitor import ModelVisitor
13   -from app.util.component.StructuredPrint import StructurePrint
14   -import json
15   -import traceback
16   -
17   -class Cache:
18   -
19   - @classmethod
20   - def cache_data(cls,guid_or_name,type="guid"):
21   -
22   - from app import GLOBAL_DIC
23   -
24   - # 缓存zookeeper
25   - zoo = GLOBAL_DIC.get("zookeeper")
26   - if zoo is None:
27   - zoo: KazooClient = KazooClient(hosts=configure.zookeeper, timeout=1)
28   - zoo.start()
29   - GLOBAL_DIC["zookeeper"] = zoo
30   - GLOBAL_DIC["zookeeper_updatetime"] = time.time()
31   - else:
32   - if not zoo.connected:
33   - try:
34   - zoo.start()
35   - except:
36   - pass
37   -
38   - # 更新zoo
39   - # if not GLOBAL_DIC.get("zookeeper_updatetime"):
40   - # GLOBAL_DIC["zookeeper_updatetime"] = time.time()
41   - # if time.time() - GLOBAL_DIC["zookeeper_updatetime"] > 15:
42   - # #释放,高并发下可行吗,线程安全问题,别人正在用,关闭不了
43   - # try:
44   - # # zoo.stop()
45   - # # zoo.close()
46   - # del zoo
47   - # except Exception as e:
48   - # StructurePrint().print("关闭zoo失败")
49   - # StructurePrint().print(e.__str__())
50   - # zoo: KazooClient = KazooClient(hosts=configure.zookeeper, timeout=1)
51   - # zoo.start()
52   - # GLOBAL_DIC["zookeeper"] = zoo
53   - # GLOBAL_DIC["zookeeper_updatetime"] = time.time()
54   -
55   - # 缓存数据服务器
56   - servers = GLOBAL_DIC.get("servers")
57   - if servers is None:
58   - servers = zoo.get_children("/rpc")
59   - servers.append("本地服务器")
60   - GLOBAL_DIC["servers"] = servers
61   - GLOBAL_DIC["servers_updatetime"] = time.time()
62   - else:
63   - servers = GLOBAL_DIC.get("servers")
64   -
65   - # 更新缓存
66   - if time.time() - GLOBAL_DIC["servers_updatetime"] > 15:
67   - servers = zoo.get_children("/rpc")
68   - servers.append("本地服务器")
69   - GLOBAL_DIC["servers"] = servers
70   - GLOBAL_DIC["servers_updatetime"] = time.time()
71   -
72   -
73   - # 缓存服务信息
74   - if guid_or_name:
75   - image_service_info = GLOBAL_DIC.get(guid_or_name)
76   - if image_service_info is None or time.time() - GLOBAL_DIC.get("service_updatetime") > 15:
77   - if type.__eq__("guid"):
78   - image_service: ImageService = ImageService.query.filter_by(guid=guid_or_name).one_or_none()
79   - else:
80   - image_service: ImageService = ImageService.query.filter_by(name=guid_or_name).one_or_none()
81   -
82   - images = image_service.images.all()
83   -
84   - if image_service.scheme_guid:
85   - scheme: TileScheme = TileScheme.query.filter_by(guid=image_service.scheme_guid).one_or_none()
86   -
87   - GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service),
88   - "images": ModelVisitor.objects_to_jsonarray(images),
89   - "scheme": json.loads(scheme.parameter)}
90   -
91   -
92   - # GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service),
93   - # "images": ModelVisitor.objects_to_jsonarray(images),
94   - # "scheme": json.loads(json.loads(image_service.scheme).get("parameter"))}
95   - else:
96   -
97   - GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service),
98   - "images": ModelVisitor.objects_to_jsonarray(images)}
99   -
100   -
101   - GLOBAL_DIC["service_updatetime"] = time.time()
102   - image_service_info = GLOBAL_DIC[guid_or_name]
103   - else:
104   - image_service_info = GLOBAL_DIC[guid_or_name]
105   - else:
106   - image_service_info = None
107   -
108   - return image_service_info,zoo,servers
109   -
110   -
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/10/15
4   -#email: nheweijun@sina.com
5   -
6   -from app.util import *
7   -from osgeo import gdal
8   -from osgeo.gdal import *
9   -from numpy import ndarray
10   -import numpy
11   -from app.modules.service.image.util.ThriftConnect import ThriftConnect,ThriftPool
12   -import json
13   -import gzip
14   -
15   -class ImageData:
16   -
17   -
18   - def __init__(self,image_server,image):
19   - self.image_server = image_server
20   - self.image = image
21   -
22   -
23   - def get_data(self, extent, bands, height, width):
24   - if self.image_server.__eq__("本地服务器"):
25   - data = self.get_local_wms_data(extent, bands, height, width)
26   - elif self.image_server.__eq__("None"):
27   - data = numpy.zeros((height, width, 3), dtype=int) + 65536
28   - else:
29   - data = self.get_remote_wms_data(extent, bands, height, width)
30   - return data
31   -
32   -
33   - def get_remote_wms_data(self, extent, bands, height, width):
34   - '''
35   - 通过RPC获取远程数据
36   - :param image:
37   - :param extent:
38   - :param bands:
39   - :return:
40   - '''
41   -
42   - # 需要做thrift连接的缓存,连接池
43   - thrift_connect = ThriftConnect(self.image_server)
44   - image_extent = self.image.get("extent")
45   -
46   - data = thrift_connect.client.getData(self.image.get("path"), extent, json.loads(image_extent), bands, width, height)
47   -
48   - thrift_connect.close()
49   -
50   - data = gzip.decompress(data)
51   - data = numpy.frombuffer(data, dtype='int64')
52   - data = data.reshape((height, width, 3))
53   -
54   - return data
55   -
56   -
57   - def get_remote_wms_data_cpp(self, image_server, image, extent, bands, height, width):
58   - '''
59   - 通过RPC获取远程数据
60   - :param image:
61   - :param extent:
62   - :param bands:
63   - :return:
64   - '''
65   -
66   - # 需要做thrift连接的缓存,连接池
67   - thrift_connect = ThriftConnect(image_server)
68   - image_extent = image.get("extent")
69   -
70   - data = thrift_connect.client.getData(image.get("path"), extent, json.loads(image_extent), bands, width, height)
71   -
72   - thrift_connect.close()
73   -
74   - return data
75   -
76   -
77   - def get_local_wms_data(self, extent, bands, height, width):
78   - '''
79   - 获取本地数据
80   - :param image:
81   - :param extent:
82   - :param bands:
83   - :return:
84   - '''
85   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
86   - ceng = 0
87   - img: Dataset = gdal.Open(self.image.get("path"), 0)
88   -
89   - for band in bands:
90   -
91   - # 自决定金字塔等级
92   - xysize = [img.RasterXSize, img.RasterYSize]
93   -
94   - origin_extent = json.loads(self.image.get("extent"))
95   - band_data: Band = img.GetRasterBand(band)
96   -
97   - max_level = band_data.GetOverviewCount()
98   -
99   - # 超出空间范围
100   - if extent[2] < origin_extent[0] or extent[0] > origin_extent[2] or extent[1] > origin_extent[
101   - 3] or extent[3] < origin_extent[1]:
102   - empty = numpy.zeros((height, width), dtype=int) + 65536
103   - # 空间范围相交
104   - else:
105   - image_level = self.determine_level(xysize, origin_extent, extent, max_level)
106   -
107   - if image_level == -1:
108   - overview = band_data
109   - else:
110   - try:
111   - overview: Band = band_data.GetOverview(image_level)
112   - except:
113   - raise Exception("该影像不存在该级别的金字塔数据!")
114   - ox = overview.XSize
115   - oy = overview.YSize
116   -
117   - # 网格大小
118   - grid_x = (origin_extent[2] - origin_extent[0]) / (ox * 1.0)
119   - grid_y = (origin_extent[3] - origin_extent[1]) / (oy * 1.0)
120   -
121   - # 完全在影像范围内
122   - if extent[0] > origin_extent[0] and extent[1] > origin_extent[1] and extent[2] < \
123   - origin_extent[2] and extent[3] < origin_extent[3]:
124   -
125   - # 网格偏移量
126   - off_x = math.floor((extent[0] - origin_extent[0]) / grid_x)
127   - off_y = math.floor((origin_extent[3] - extent[3]) / grid_y)
128   -
129   - # 截取后网格个数
130   - x_g = math.ceil((extent[2] - extent[0]) / grid_x)
131   -
132   - y_g = math.ceil((extent[3] - extent[1]) / grid_y)
133   -
134   - empty = overview.ReadAsArray(off_x, off_y, x_g, y_g, width, height)
135   -
136   -
137   - # 部分相交
138   - else:
139   -
140   - inter_extent = [0, 0, 0, 0]
141   - inter_extent[0] = origin_extent[0] if origin_extent[0] > extent[0] else extent[0]
142   - inter_extent[1] = origin_extent[1] if origin_extent[1] > extent[1] else extent[1]
143   - inter_extent[2] = origin_extent[2] if origin_extent[2] < extent[2] else extent[2]
144   - inter_extent[3] = origin_extent[3] if origin_extent[3] < extent[3] else extent[3]
145   -
146   - # 网格偏移量
147   - off_x = math.floor((inter_extent[0] - origin_extent[0]) / grid_x)
148   - off_y = math.floor((origin_extent[3] - inter_extent[3]) / grid_y)
149   -
150   - # 截取后网格个数
151   - x_g = math.floor((inter_extent[2] - inter_extent[0]) / grid_x)
152   - y_g = math.floor((inter_extent[3] - inter_extent[1]) / grid_y)
153   -
154   - # 相对于出图的偏移量
155   -
156   - # 出图的网格大小
157   - out_grid_x = (extent[2] - extent[0]) / (width * 1.0)
158   - out_grid_y = (extent[3] - extent[1]) / (height * 1.0)
159   -
160   - out_off_x = int(math.ceil((inter_extent[0] - extent[0]) / out_grid_x))
161   - out_off_y = int(math.ceil((extent[3] - inter_extent[3]) / out_grid_y))
162   -
163   - out_x_g = int(math.floor((inter_extent[2] - inter_extent[0]) / out_grid_x))
164   - out_y_g = int(math.floor((inter_extent[3] - inter_extent[1]) / out_grid_y))
165   -
166   - # 相交部分在出图的哪个位置
167   -
168   - overview_raster: ndarray = overview.ReadAsArray(off_x, off_y, x_g, y_g, out_x_g,
169   - out_y_g)
170   -
171   - dat = numpy.zeros((height, width), dtype=int) + 65536
172   - dat[out_off_y:out_off_y + out_y_g, out_off_x:out_off_x + out_x_g] = overview_raster
173   -
174   - empty = dat
175   -
176   - pixel_array[:, :, ceng] = empty
177   - ceng += 1
178   - return pixel_array
179   -
180   -
181   - def determine_level(self, xysize, origin_extent, extent, max_level):
182   - '''
183   - 根据范围判断调用金字塔的哪一层
184   - :param xysize:
185   - :param origin_extent:
186   - :param extent:
187   - :param max_level:
188   - :return:
189   - '''
190   - x = xysize[0]
191   - y = xysize[1]
192   - level = -1
193   - pixel = x * y * (((extent[2] - extent[0]) * (extent[3] - extent[1])) / (
194   - (origin_extent[2] - origin_extent[0]) * (origin_extent[3] - origin_extent[1])))
195   - while pixel > 100000 and level < max_level - 1:
196   - level += 1
197   - x = x / 2
198   - y = y / 2
199   - pixel = x * y * (((extent[2] - extent[0]) * (extent[3] - extent[1])) / (
200   - (origin_extent[2] - origin_extent[0]) * (origin_extent[3] - origin_extent[1])))
201   - return level
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/10/26
4   -#email: nheweijun@sina.com
5   -
6   -
7   -class ImageServer:
8   - pass
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/10/18
4   -#email: nheweijun@sina.com
5   -import os
6   -
7   -class ImageType:
8   -
9   - @classmethod
10   - def get_type(cls,path):
11   -
12   - if os.path.isdir(path):
13   - type = "dir"
14   - elif path.lower().endswith(".tiff") or path.lower().endswith(".tif"):
15   - type = "tif"
16   - elif path.lower().endswith(".img"):
17   - type = "img"
18   - else:
19   - type = None
20   - return type
21   -
22   -
23   -if __name__ == '__main__':
24   - print(ImageType.get_type("/da/d/ftif"))
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/10/26
4   -#email: nheweijun@sina.com
5   -
6   -
7   -import numpy
8   -from app.util.component.ParameterUtil import ParameterUtil
9   -from .Cache import Cache
10   -from app.modules.service.models import ImageService
11   -from flask import Response
12   -from .ImageData import ImageData
13   -from .MyThread import MyThread
14   -from .Opencv import Opencv
15   -import json
16   -import random
17   -import configure
18   -import threading
19   -from .ImageServer import ImageServer
20   -
21   -
22   -class ImageWMSServer(ImageServer):
23   -
24   - _instance_lock = threading.Lock()
25   - singleton = None
26   -
27   - def __init__(self):
28   - pass
29   -
30   - def __new__(cls, *args, **kwargs):
31   - if not cls.singleton:
32   - with ImageWMSServer._instance_lock:
33   - cls.singleton = super().__new__(cls)
34   - return cls.singleton
35   -
36   - def wms(self,service_name,parameter,type="name"):
37   -
38   - # 获取缓存信息
39   - image_service_info, zoo, servers = Cache.cache_data(service_name, type=type)
40   - # 转换参数
41   - parameter = ParameterUtil.to_lower(parameter)
42   - re = parameter.get("request")
43   - if re and re.__eq__("GetCapabilities"):
44   - return self.get_wms_capabilities(image_service_info["service"])
45   -
46   - bbox = parameter.get("bbox")
47   - width = int(parameter.get("width")) if parameter.get("width") else 256
48   - height = int(parameter.get("height")) if parameter.get("height") else 256
49   - image_type = parameter.get("format") if parameter.get("format") else "image/png"
50   - quality = int(parameter.get("quality")) if parameter.get("quality") else 30
51   -
52   - extent = [float(x) for x in bbox.split(",")]
53   -
54   - intersect_image = [im for im in image_service_info["images"] if
55   - self.determin_intersect(json.loads(im.get("extent")), extent)]
56   -
57   - if len(intersect_image) > 1:
58   -
59   - # 结果矩阵
60   - empty_list = [numpy.zeros((height, width), dtype=int) + 65536,
61   - numpy.zeros((height, width), dtype=int) + 65536,
62   - numpy.zeros((height, width), dtype=int) + 65536]
63   -
64   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
65   - thread_list = []
66   -
67   - for image in intersect_image:
68   - # 该影像的服务器,随机选取一个
69   - image_servers = image.get("server").split(",")
70   - image_servers = [ser for ser in image_servers if ser in servers]
71   - if len(image_servers) > 0:
72   - indx = int(random.random() * len(image_servers))
73   - image_server = image_servers[indx]
74   - else:
75   - image_server = "None"
76   - bands = json.loads(image.get("band_view"))
77   -
78   - image_data = ImageData(image_server, image)
79   -
80   - thread: MyThread = MyThread(image_data.get_data, args=(extent, bands, height, width))
81   - thread.start()
82   - thread_list.append(thread)
83   -
84   - for thread in thread_list:
85   - thread.join()
86   - data = thread.get_result()
87   -
88   - # 掩膜在中央接口生成,合图
89   - mask = numpy.zeros((height, width), dtype=int)
90   - mask2 = numpy.zeros((height, width), dtype=int)
91   - jizhun = data[:, :, 0]
92   - mask[jizhun == 65536] = 1
93   - mask[jizhun != 65536] = 0
94   - mask2[jizhun == 65536] = 0
95   - mask2[jizhun != 65536] = 1
96   - # 掩膜计算
97   - for i, d in enumerate(empty_list):
98   - empty_list[i] = empty_list[i] * mask + data[:, :, i] * mask2
99   -
100   - for ii in [0, 1, 2]:
101   - # opencv 颜色排序为GBR
102   - pixel_array[:, :, 2 - ii] = empty_list[ii]
103   -
104   -
105   - elif len(intersect_image) == 1:
106   - # 该影像的服务器,随机选取一个
107   - image = intersect_image[0]
108   - image_servers = image.get("server").split(",")
109   - image_servers = [ser for ser in image_servers if ser in servers]
110   - if len(image_servers) > 0:
111   - indx = int(random.random() * len(image_servers))
112   - image_server = image_servers[indx]
113   - else:
114   - image_server = "None"
115   -
116   - bands = json.loads(image.get("band_view"))
117   -
118   - image_data = ImageData(image_server, image)
119   -
120   - pixel_array_t = image_data.get_data(extent, bands, height, width)
121   -
122   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
123   - for ii in [0, 1, 2]:
124   - # opencv 颜色排序为GBR
125   - pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
126   - else:
127   - # 结果矩阵
128   - pixel_array = numpy.zeros((height, width, 3), dtype=int) + 65536
129   -
130   - # 将图片生成在内存中,然后直接返回response
131   - im_data = Opencv.create_image(image_type, pixel_array, quality)
132   -
133   - if parameter.get("overview"):
134   - return pixel_array
135   - return Response(im_data, mimetype=image_type.lower())
136   -
137   -
138   - def get_wms_capabilities(self, image_service: ImageService):
139   -
140   - xml = '''<?xml version="1.0" encoding="utf-8" ?>
141   - <WMS_Capabilities version="1.2.0">
142   - <Service>
143   - <Name>WMS</Name>
144   - <Title>{service_title}</Title>
145   - <Abstract>{abstract}</Abstract>
146   - <Keywords>GIMS</Keywords>
147   - <OnlineResource/>
148   - <Fees>none</Fees>
149   - <AccessConstraints>none</AccessConstraints>
150   - </Service>
151   - <Capability>
152   - <Request>
153   - <GetCapabilities>
154   - <Format>text/xml</Format>
155   - <DCPType>
156   - <HTTP>
157   - <Get>
158   - <OnlineResource xlink:href="{url}" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
159   - </Get>
160   - </HTTP>
161   - </DCPType>
162   - </GetCapabilities>
163   - <GetMap>
164   - <Format>png</Format>
165   - <Format>jpeg</Format>
166   - <Format>gif</Format>
167   - <Format>image/png</Format>
168   - <Format>image/jpeg</Format>
169   - <Format>image/gif</Format>
170   - <DCPType>
171   - <HTTP>
172   - <Get>
173   - <OnlineResource xlink:href="{url}" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"/>
174   - </Get>
175   - </HTTP>
176   - </DCPType>
177   - </GetMap>
178   - <Map>
179   - <Format>
180   - <PNG/>
181   - <GIF/>
182   - <JPG/>
183   - </Format>
184   - <DCPType>
185   - <HTTP>
186   - <Get onlineResource="{url}"/>
187   - </HTTP>
188   - </DCPType>
189   - </Map>
190   - <Capabilities>
191   - <Format>
192   - <WMS_XML/>
193   - </Format>
194   - <DCPType>
195   - <HTTP>
196   - <Get onlineResource="{url}"/>
197   - </HTTP>
198   - </DCPType>
199   - </Capabilities>
200   - <FeatureInfo>
201   - <Format>
202   - <XML/>
203   - <MIME/>
204   - </Format>
205   - <DCPType>
206   - <HTTP>
207   - <Get onlineResource="{url}"/>
208   - </HTTP>
209   - </DCPType>
210   - </FeatureInfo>
211   - </Request>
212   - <Exception>
213   - <Format>
214   - <WMS_XML/>
215   - <INIMAGE/>
216   - <BLANK/>
217   - </Format>
218   - </Exception>
219   - <Layer>
220   - <Name>{service_name}</Name>
221   - <Title>{service_title}</Title>
222   - <CRS>{crs}</CRS>
223   - <BoundingBox CRS="{crs}" maxx="{maxx}" maxy="{maxy}" minx="{minx}" miny="{miny}"/>
224   -
225   - <Layer queryable="1">
226   - <CRS>{crs}</CRS>
227   - <Name>{layer_name}</Name>
228   - <Title>{layer_title}</Title>
229   - <BoundingBox CRS="{crs}" maxx="{maxx}" maxy="{maxy}" minx="{minx}" miny="{miny}"/>
230   - </Layer>
231   - </Layer>
232   - </Capability>
233   - </WMS_Capabilities>'''
234   -
235   - extent = json.loads(image_service.get("extent"))
236   - xml = xml.format(service_title=image_service.get("name"),
237   - service_name=image_service.get("name"),
238   - abstract="None",
239   - crs="ESPG:4326",
240   - layer_name=image_service.get("name"),
241   - layer_title=image_service.get("name"),
242   - maxx=extent[2],
243   - maxy=extent[3],
244   - minx=extent[0],
245   - miny=extent[1],
246   - url="http://{}/API/Service/Image/WMS?guid={}".format(configure.deploy_ip_host,
247   - image_service.get("guid")))
248   -
249   - r = Response(response=xml, status=200, mimetype="application/xml")
250   - r.headers["Content-Type"] = "text/xml; charset=utf-8"
251   - return r
252   -
253   - def determin_intersect(self, extent1, extent2):
254   - if extent2[2] < extent1[0] or extent2[0] > extent1[2] or extent2[1] > extent1[
255   - 3] or extent2[3] < extent1[1]:
256   - return False
257   - else:
258   - return True
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/10/26
4   -#email: nheweijun@sina.com
5   -
6   -
7   -import numpy
8   -from app.util.component.ParameterUtil import ParameterUtil
9   -from .Cache import Cache
10   -from app.modules.service.models import ImageService
11   -from flask import Response
12   -from .ImageData import ImageData
13   -from .MyThread import MyThread
14   -from .Opencv import Opencv
15   -from app.modules.service.models import Service,TileScheme
16   -import json
17   -import random
18   -import copy
19   -import configure
20   -from app.util.component.SliceScheme import SliceScheme
21   -from app.util.component.ModelVisitor import ModelVisitor
22   -import threading
23   -from .ImageServer import ImageServer
24   -
25   -class ImageWMTSServer(ImageServer):
26   - _instance_lock = threading.Lock()
27   - singleton = None
28   -
29   - def __init__(self):
30   - pass
31   -
32   - def __new__(cls, *args, **kwargs):
33   - if not cls.singleton:
34   - with ImageWMTSServer._instance_lock:
35   - cls.singleton = super().__new__(cls)
36   - return cls.singleton
37   -
38   -
39   - def wmts(self,service_name,parameter,type="name"):
40   -
41   - image_service_info, zoo, servers = Cache.cache_data(service_name, type=type)
42   -
43   - # 转换参数
44   - parameter = ParameterUtil.to_lower(parameter)
45   -
46   - re = parameter.get("request")
47   - if re and re.__eq__("GetCapabilities"):
48   - service = Service.query.filter_by(guid=image_service_info["service"].get("service_guid")).one_or_none()
49   - return self.get_wmts_capabilities(image_service_info["service"], service)
50   -
51   - if parameter.get("tilematrix"):
52   - if parameter.get("tilematrix").__contains__(":"):
53   - self.level = int(parameter.get("tilematrix").split(":")[-1])
54   - else:
55   - self.level = int(parameter.get("tilematrix"))
56   - if parameter.get("tilerow"):
57   - self.row = int(parameter.get("tilerow"))
58   - if parameter.get("tilecol"):
59   - self.col = int(parameter.get("tilecol"))
60   -
61   - image_type = parameter.get("format") if parameter.get("format") else "image/png"
62   - quality = int(parameter.get("quality")) if parameter.get("quality") else 30
63   - slice_para = image_service_info["scheme"]
64   - extent = SliceScheme.get_polygon(slice_para, self.level, self.row, self.col)
65   -
66   - height, width = 256, 256
67   -
68   - # 多线程获取分布式数据
69   -
70   - intersect_image = [im for im in image_service_info["images"] if
71   - self.determin_intersect(json.loads(im.get("extent")), extent)]
72   -
73   - if len(intersect_image) > 1:
74   -
75   - # 结果矩阵
76   - pixel_array = numpy.zeros((height, width, 3), dtype=int) + 65536
77   -
78   - thread_list = []
79   -
80   - for image in intersect_image:
81   -
82   - # 该影像的服务器,随机选取一个
83   - image_servers = image.get("server").split(",")
84   - image_servers = [ser for ser in image_servers if ser in servers]
85   - if len(image_servers) > 0:
86   - indx = int(random.random() * len(image_servers))
87   - image_server = image_servers[indx]
88   - else:
89   - image_server = "None"
90   -
91   - bands = json.loads(image.get("band_view"))
92   -
93   - image_data = ImageData(image_server, image)
94   -
95   - thread: MyThread = MyThread(image_data.get_data, args=(extent, bands, height, width))
96   -
97   - thread.start()
98   - thread_list.append(thread)
99   -
100   - for thread in thread_list:
101   - thread.join()
102   - data = thread.get_result()
103   -
104   - # 掩膜在中央接口生成,合图
105   - mask = numpy.zeros((height, width, 3), dtype=int)
106   - mask_data = numpy.zeros((height, width, 3), dtype=int)
107   -
108   - mask[data == 65536] = 1
109   - mask[data != 65536] = 0
110   - mask_data[data == 65536] = 0
111   - mask_data[data != 65536] = 1
112   -
113   - # # 掩膜计算
114   - pixel_array = pixel_array * mask + data * mask_data
115   -
116   - # opencv 颜色排序为GBR
117   - d1 = copy.copy(pixel_array[:, :, 0])
118   - pixel_array[:, :, 0] = pixel_array[:, :, 2]
119   - pixel_array[:, :, 2] = d1
120   -
121   -
122   - elif len(intersect_image) == 1:
123   - # 该影像的服务器,随机选取一个
124   - image = intersect_image[0]
125   - image_servers = image.get("server").split(",")
126   - # 判断可用服务器
127   - image_servers = [ser for ser in image_servers if ser in servers]
128   - if len(image_servers) > 0:
129   - indx = int(random.random() * len(image_servers))
130   - image_server = image_servers[indx]
131   - else:
132   - image_server = "None"
133   - # image_server = image_servers[0]
134   - bands = json.loads(image.get("band_view"))
135   -
136   - image_data = ImageData(image_server, image)
137   - pixel_array_t: numpy.ndarray = image_data.get_data(extent, bands, height, width)
138   - pixel_array = numpy.zeros((height, width, 3), dtype=int)
139   -
140   - for ii in [0, 1, 2]:
141   - # opencv 颜色排序为GBR
142   - pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
143   -
144   - else:
145   - # 结果矩阵
146   - pixel_array = numpy.zeros((height, width, 3), dtype=int) + 65536
147   -
148   - # 将图片生成在内存中,然后直接返回response
149   - im_data = Opencv.create_image(image_type, pixel_array, quality)
150   - return Response(im_data, mimetype=image_type.lower())
151   -
152   -
153   - def get_wmts_capabilities(self, image_service, service: Service):
154   - tile_scheme: TileScheme = TileScheme.query.filter_by(guid=image_service.get("scheme_guid")).one_or_none()
155   - if not tile_scheme:
156   - raise Exception("切片方案不存在!")
157   - tile_scheme = ModelVisitor.object_to_json(tile_scheme)
158   -
159   - 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">
160   - <!-- Service Identification -->
161   - <ows:ServiceIdentification>
162   - <ows:Title>{title}</ows:Title>
163   - <ows:ServiceType>OGC WMTS</ows:ServiceType>
164   - <ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
165   - </ows:ServiceIdentification>
166   -
167   - <!-- Operations Metadata -->
168   - <ows:OperationsMetadata>
169   - <ows:Operation name="GetCapabilities">
170   - <ows:DCP>
171   - <ows:HTTP>
172   - <ows:Get xlink:href="{capabilities_url}">
173   - <ows:Constraint name="GetEncoding">
174   - <ows:AllowedValues>
175   - <ows:Value>RESTful</ows:Value>
176   - </ows:AllowedValues>
177   - </ows:Constraint>
178   - </ows:Get>
179   -
180   - <!-- add KVP binding in 10.1 -->
181   - <ows:Get xlink:href="{tile_url}?">
182   - <ows:Constraint name="GetEncoding">
183   - <ows:AllowedValues>
184   - <ows:Value>KVP</ows:Value>
185   - </ows:AllowedValues>
186   - </ows:Constraint>
187   - </ows:Get>
188   - </ows:HTTP>
189   - </ows:DCP>
190   - </ows:Operation>
191   - <ows:Operation name="GetTile">
192   - <ows:DCP>
193   - <ows:HTTP>
194   - <ows:Get xlink:href="{tile_url}">
195   - <ows:Constraint name="GetEncoding">
196   - <ows:AllowedValues>
197   - <ows:Value>RESTful</ows:Value>
198   - </ows:AllowedValues>
199   - </ows:Constraint>
200   - </ows:Get>
201   - <ows:Get xlink:href="{tile_url}?">
202   - <ows:Constraint name="GetEncoding">
203   - <ows:AllowedValues>
204   - <ows:Value>KVP</ows:Value>
205   - </ows:AllowedValues>
206   - </ows:Constraint>
207   - </ows:Get>
208   - </ows:HTTP>
209   - </ows:DCP>
210   - </ows:Operation>
211   - </ows:OperationsMetadata>
212   -
213   - <Contents>
214   -
215   - <!-- Layer -->
216   -
217   -
218   - <Layer>
219   - <ows:Title>{title}</ows:Title>
220   - <ows:Identifier>{title}</ows:Identifier>
221   - <ows:BoundingBox crs="{crs}">
222   - <ows:LowerCorner>{xmin} {ymin}</ows:LowerCorner>
223   - <ows:UpperCorner>{xmax} {ymax}</ows:UpperCorner>
224   - </ows:BoundingBox>
225   -
226   - <Style isDefault="true">
227   - <ows:Title>Default Style</ows:Title>
228   - <ows:Identifier>default</ows:Identifier>
229   - </Style>
230   - <Format>image/png</Format>
231   - <TileMatrixSetLink>
232   - <TileMatrixSet>{tile_name}</TileMatrixSet>
233   - </TileMatrixSetLink>
234   -
235   - <ResourceURL format="image/png" resourceType="tile" template="{tile_url}"/>
236   -
237   - </Layer>
238   -
239   - <!-- TileMatrixSet -->
240   -
241   -
242   - <TileMatrixSet>
243   -
244   - <TileMatrix>
245   - <ows:Title>{tile_title}</ows:Title>
246   - <ows:Abstract>{tile_description}</ows:Abstract>
247   - <ows:Identifier>{tile_name}</ows:Identifier>
248   - <ows:SupportedCRS>{crs}</ows:SupportedCRS>
249   -
250   - {tile_matrix}
251   -
252   - </TileMatrix>
253   -
254   - </TileMatrixSet>
255   -
256   -
257   - </Contents>
258   - <ServiceMetadataURL xlink:href="{capabilities_url}"/>
259   - </Capabilities>'''
260   -
261   - tile_matrix_each = '''
262   - <TileMatrix>
263   - <ows:Identifier>{lev}</ows:Identifier>
264   - <ScaleDenominator>{scale}</ScaleDenominator>
265   - <TopLeftCorner>{top_left}</TopLeftCorner>
266   - <TileWidth>{cols}</TileWidth>
267   - <TileHeight>{rows}</TileHeight>
268   - </TileMatrix>
269   - '''
270   -
271   - tile_matrix = ""
272   - top_left = tile_scheme.get("top_left")
273   - for level in json.loads(tile_scheme.get("levels")):
274   - tile_matrix = "{}{}".format(tile_matrix, tile_matrix_each.format(lev=level["level"],
275   - scale=level["scale"],
276   - top_left=top_left,
277   - cols=tile_scheme.get("cols"),
278   - rows=tile_scheme.get("rows")))
279   -
280   - extent = json.loads(image_service.get("extent"))
281   -
282   - xml = xml.format(
283   - capabilities_url="http://{}/API/Service/Image/Capabilities?guid={}".format(configure.deploy_ip_host,
284   - image_service.get("guid")),
285   - tile_url="http://{}/API/Service/Image/Tile?guid={}".format(configure.deploy_ip_host, image_service.get("guid")),
286   - crs=tile_scheme.get("crs"),
287   - xmin=extent[0],
288   - ymin=extent[1],
289   - xmax=extent[2],
290   - ymax=extent[3],
291   - # TileMatrix = "{TileMatrix}",
292   - # TileRow = "{TileRow}",
293   - # TileCol = "{TileCol}",
294   - guid=image_service.get("guid"),
295   - title=service.title,
296   - tile_title=tile_scheme.get("name"),
297   - tile_name=tile_scheme.get("name"),
298   - tile_description=tile_scheme.get("description"),
299   - tile_matrix=tile_matrix
300   - )
301   -
302   - r = Response(response=xml, status=200, mimetype="application/xml")
303   - r.headers["Content-Type"] = "text/xml; charset=utf-8"
304   -
305   - return r
306   -
307   -
308   -
309   - def determin_intersect(self, extent1, extent2):
310   - if extent2[2] < extent1[0] or extent2[0] > extent1[2] or extent2[1] > extent1[
311   - 3] or extent2[3] < extent1[1]:
312   - return False
313   - else:
314   - return True
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/10/18
4   -#email: nheweijun@sina.com
5   -
6   -from threading import Thread
7   -class MyThread(Thread):
8   - def __init__(self,func,args=()):
9   - super(MyThread,self).__init__()
10   - self.func = func
11   - self.args = args
12   - def run(self):
13   - self.result = self.func(*self.args)
14   - def get_result(self):
15   - try:
16   - return self.result
17   - except Exception:
18   - return None
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/10/18
4   -#email: nheweijun@sina.com
5   -import cv2
6   -import numpy
7   -
8   -class Opencv:
9   -
10   - @classmethod
11   - def create_image(cls,image_type, pixel_array, quality):
12   -
13   - if image_type.__eq__("image/jpeg") or image_type.__eq__("image/jpg"):
14   - r, buf = cv2.imencode(".jpg", pixel_array, [cv2.IMWRITE_JPEG_QUALITY, quality])
15   - image_out = buf.tobytes()
16   - else:
17   - height, width = pixel_array[:, :, 0].shape
18   - four = numpy.zeros((height,width), dtype=int) + 255
19   - four[pixel_array[:, :, 0] == 65536] = 0
20   - r, buf = cv2.imencode(".png", numpy.dstack((pixel_array, four)))
21   - image_out = buf.tobytes()
22   - return image_out
\ 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   -from thrift.transport import TSocket
7   -from thrift.transport import TTransport
8   -from thrift.protocol import TBinaryProtocol
9   -from app.modules.service.image.ImageDataService import ImageDataService
10   -
11   -class ThriftConnect:
12   - '''
13   - thrift连接类
14   - '''
15   -
16   - client = None
17   - transport = None
18   -
19   - def __init__(self,data_server):
20   - host = data_server.split(":")[0]
21   - port = int(data_server.split(":")[1])
22   - socket: TSocket = TSocket.TSocket(host, port)
23   - self.transport = TTransport.TBufferedTransport(socket)
24   - protocol = TBinaryProtocol.TBinaryProtocol(self.transport)
25   - self.client = ImageDataService.Client(protocol)
26   - self.transport.open()
27   -
28   - def close(self):
29   - self.transport.close()
30   -
31   -class ThriftConnectCpp:
32   - '''
33   - thrift连接类
34   - '''
35   -
36   - client = None
37   - transport = None
38   -
39   - def __init__(self,data_server):
40   - host = data_server.split(":")[0]
41   - port = int(data_server.split(":")[1])
42   - self.transport: TSocket = TSocket.TSocket(host, port)
43   - self.transport = TTransport.TBufferedTransport(self.transport)
44   - protocol = TBinaryProtocol.TBinaryProtocol(self.transport)
45   - # self.client = ImageDataService.Client(protocol)
46   - self.transport.open()
47   -
48   - def close(self):
49   - self.transport.close()
50   -
51   -class ThriftPool:
52   - '''
53   - thrift线程池
54   - '''
55   - clients = []
56   - transports = []
57   - host = None
58   - port = None
59   - index = -1
60   -
61   - def __init__(self,data_server):
62   - self.host = data_server.split(":")[0]
63   - self.port = int(data_server.split(":")[1])
64   -
65   - def get_client(self):
66   - if len(self.clients) < 20:
67   - socket: TSocket = TSocket.TSocket(self.host, self.port)
68   - transport = TTransport.TBufferedTransport(socket)
69   - protocol = TBinaryProtocol.TBinaryProtocol(transport)
70   - client = ImageDataService.Client(protocol)
71   - self.clients.append(client)
72   - self.transports.append(transport)
73   - return client,transport
74   - else:
75   - self.index += 1
76   - if self.index == 20:
77   - self.index = 0
78   - return self.clients[self.index],self.transports[self.index]
79   -
80   -
81   - def close(self):
82   - pass
\ No newline at end of file
1   -# coding=utf-8
2   -#author: 4N
3   -#createtime: 2021/9/14
4   -#email: nheweijun@sina.com
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/12/15
  4 +#email: nheweijun@sina.com
  5 +
  6 +from flasgger import swag_from
  7 +from flask import Blueprint
  8 +from app.util import BlueprintApi
  9 +from . import image_service_delete,image_service_register,image_service_edit,image_build_pyramid
  10 +
  11 +class DataManager(BlueprintApi):
  12 +
  13 + bp = Blueprint("ImageService", __name__, url_prefix="/API/Service/ImageService")
  14 + service_type = []
  15 +
  16 +
  17 + @staticmethod
  18 + @bp.route('/BuildPyramid', methods=['POST'])
  19 + @swag_from(image_build_pyramid.Api.api_doc)
  20 + def api_image_build_pyramid():
  21 + """
  22 + 创建影像金字塔
  23 + """
  24 + return image_build_pyramid.Api().result
  25 +
  26 + @staticmethod
  27 + @bp.route('/Register', methods=['POST'])
  28 + @swag_from(image_service_register.Api.api_doc)
  29 + def api_image_service_register():
  30 + """
  31 + 注册ImageService
  32 + """
  33 + return image_service_register.Api().result
  34 +
  35 + @staticmethod
  36 + @bp.route('/Edit', methods=['POST'])
  37 + @swag_from(image_service_edit.Api.api_doc)
  38 + def api_image_service_edit():
  39 + """
  40 + 修改ImageService
  41 + """
  42 + return image_service_edit.Api().result
  43 +
  44 + @staticmethod
  45 + @bp.route('/Delete', methods=['POST'])
  46 + @swag_from(image_service_delete.Api.api_doc)
  47 + def api_image_service_delete():
  48 + """
  49 + ImageService Delete
  50 + """
  51 + return image_service_delete.Api().result
... ...
  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 +from app.models import db
  10 +from app.modules.data.models import Task
  11 +import multiprocessing
  12 +import uuid
  13 +import datetime
  14 +import requests
  15 +from app.util.component.TaskController import TaskController
  16 +from app.util.component.TaskWriter import TaskWriter
  17 +class Api(ApiTemplate):
  18 +
  19 + api_name = "创建影像金字塔"
  20 +
  21 + def process(self):
  22 +
  23 + # 返回结果
  24 + res = {}
  25 + try:
  26 + task_guid = uuid.uuid1().__str__()
  27 +
  28 +
  29 + pyramid_process = multiprocessing.Process(target=self.task, args=(task_guid,self.para))
  30 + pyramid_process.start()
  31 +
  32 + task = Task(guid=task_guid,
  33 + name="{}构建影像金字塔".format(self.para.get("alias")),
  34 + create_time=datetime.datetime.now(),
  35 + state=0,
  36 + task_type=5,
  37 + creator=self.para.get("creator"),
  38 + process="影像创建金字塔中",
  39 + task_pid=pyramid_process.pid)
  40 +
  41 + db.session.add(task)
  42 + db.session.commit()
  43 +
  44 + res["data"] = "创建影像金字塔任务已提交!"
  45 + res["result"] = True
  46 +
  47 + except Exception as e:
  48 + raise Exception("数据库错误!")
  49 +
  50 + return res
  51 +
  52 +
  53 + def task(self,task_guid,para):
  54 + task_writer = None
  55 + try:
  56 +
  57 + #任务控制,等待执行
  58 + TaskController.wait(task_guid)
  59 + task_writer = TaskWriter(task_guid)
  60 +
  61 + task_writer.update_task({"state":2,"update_time":datetime.datetime.now(),"process" : "创建中"})
  62 + task_writer.update_process("开始创建...")
  63 +
  64 + url = "{}/API/Service/Image/BuildPyramid".format(para.get("url"))
  65 + response:requests.Response = requests.post(url,data=self.para)
  66 + if not response.json().get("result"):
  67 + raise Exception("由于{},影像服务修改失败!".format(response.json().get("msg")))
  68 +
  69 + task_writer.update_task({"state":1,"update_time":datetime.datetime.now(),"process" : "创建完成"})
  70 + task_writer.update_process("创建完成!")
  71 +
  72 + except Exception as e:
  73 + try:
  74 + task_writer.update_task({"state": -1,"update_time":datetime.datetime.now(),"process": "下载失败"})
  75 + task_writer.update_process( e.__str__())
  76 + task_writer.update_process("任务中止!")
  77 + except Exception as ee:
  78 + StructurePrint().print(ee.__str__())
  79 + raise e
  80 + finally:
  81 + try:
  82 + task_writer.close()
  83 + except Exception as e:
  84 + StructurePrint().print(e.__str__())
  85 +
  86 +
  87 + api_doc = {
  88 + "tags": ["影像服务接口"],
  89 + "parameters": [
  90 + {"name": "guid",
  91 + "in": "formData",
  92 + "type": "string",
  93 + "description": "guid"},
  94 + {"name": "url",
  95 + "in": "formData",
  96 + "type": "string",
  97 + "description": "url"},
  98 + {"name": "alias",
  99 + "in": "formData",
  100 + "type": "string",
  101 + "description": "影像alias"},
  102 + ],
  103 + "responses": {
  104 + 200: {
  105 + "schema": {
  106 + "properties": {
  107 + }
  108 + }
  109 + }
  110 + }
  111 + }
  112 +
... ...
1 1 # coding=utf-8
2 2 #author: 4N
3   -#createtime: 2021/9/8
  3 +#createtime: 2021/9/17
4 4 #email: nheweijun@sina.com
5 5
6 6
7 7 from app.util.component.ApiTemplate import ApiTemplate
8   -from app.models import db
9   -from ..models import ImageTag
  8 +import requests
  9 +
10 10 class Api(ApiTemplate):
11 11
12   - api_name = "delete tag"
  12 + api_name = "删除ImageService服务"
13 13
14 14 def process(self):
15   -
16 15 # 返回结果
17 16 res = {}
18 17 try:
19   - image_tag = ImageTag.query.filter_by(guid=self.para.get("guid")).one_or_none()
20   - if image_tag:
21   - db.session.delete(image_tag)
22   - db.session.commit()
  18 + url = "{}/API/Service/Delete".format(self.para.get("url"))
  19 + response:requests.Response = requests.post(url,data=self.para)
  20 + if not response.json().get("result"):
  21 + raise Exception("由于{},影像服务删除失败!".format(response.json().get("msg")))
23 22 res["result"] = True
24 23 except Exception as e:
25 24 raise e
26 25 return res
27 26
28 27 api_doc = {
29   - "tags": ["影像接口"],
  28 + "tags": ["影像服务接口"],
30 29 "parameters": [
31 30 {"name": "guid",
32 31 "in": "formData",
33   - "type": "string"},
  32 + "type": "string",
  33 + "description": "guid"},
  34 + {"name": "url",
  35 + "in": "formData",
  36 + "type": "string",
  37 + "description": "url"},
34 38 ],
35 39 "responses": {
36 40 200: {
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/17
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.util.component.ApiTemplate import ApiTemplate
  8 +import requests
  9 +
  10 +class Api(ApiTemplate):
  11 +
  12 + api_name = "修改ImageService服务"
  13 +
  14 + def process(self):
  15 + # 返回结果
  16 + res = {}
  17 + try:
  18 + url = "{}/API/Service/Edit".format(self.para.get("url"))
  19 + response:requests.Response = requests.post(url,data=self.para)
  20 + if not response.json().get("result"):
  21 + raise Exception("由于{},影像服务修改失败!".format(response.json().get("msg")))
  22 + res["result"] = True
  23 + except Exception as e:
  24 + raise e
  25 + return res
  26 +
  27 + api_doc = {
  28 + "tags": ["影像服务接口"],
  29 + "parameters": [
  30 +
  31 + {"name": "guid",
  32 + "in": "formData",
  33 + "type": "string",
  34 + "description": "服务guid"},
  35 +
  36 + {"name": "type",
  37 + "in": "formData",
  38 + "type": "string",
  39 + "enum": ["地图服务","切片服务","影像服务"],
  40 + "description": "[地图服务,切片服务,影像服务]"},
  41 +
  42 + {"name": "url",
  43 + "in": "formData",
  44 + "type": "string",
  45 + "description": "服务地址"},
  46 +
  47 + {"name": "name",
  48 + "in": "formData",
  49 + "type": "string",
  50 + "description": "[地图服务,切片服务,影像服务]"},
  51 + {"name": "title",
  52 + "in": "formData",
  53 + "type": "string",
  54 + "description": "[地图服务,切片服务,影像服务]"},
  55 + {"name": "description",
  56 + "in": "formData",
  57 + "type": "string",
  58 + "description": "[地图服务,切片服务,影像服务]"},
  59 +
  60 + {"name": "catalog_guid",
  61 + "in": "formData",
  62 + "type": "string",
  63 + "description": "[地图服务,切片服务,影像服务]"},
  64 +
  65 + {"name": "functions",
  66 + "in": "formData",
  67 + "type": "string",
  68 + "description": "[地图服务,影像服务]以逗号相隔,可选WMTS,WMS"},
  69 +
  70 + # 影像参数
  71 + {"name": "image_guids",
  72 + "in": "formData",
  73 + "type": "string",
  74 + "description": "[影像服务]影像guids,以英文逗号相隔"},
  75 + {"name": "scheme",
  76 + "in": "formData",
  77 + "type": "string",
  78 + "description": "切片方案"},
  79 +
  80 +
  81 + ],
  82 + "responses": {
  83 + 200: {
  84 + "schema": {
  85 + "properties": {
  86 + }
  87 + }
  88 + }
  89 + }
  90 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/17
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.util.component.ApiTemplate import ApiTemplate
  8 +import requests
  9 +
  10 +class Api(ApiTemplate):
  11 +
  12 + api_name = "注册ImageService服务"
  13 +
  14 + def process(self):
  15 + # 返回结果
  16 + res = {}
  17 + try:
  18 + url = "{}/API/Service/Register".format(self.para.get("url"))
  19 + response:requests.Response = requests.post(url,data=self.para)
  20 + if not response.json().get("result"):
  21 + raise Exception("由于{},影像服务注册失败!".format(response.json().get("msg")))
  22 + res["result"] = True
  23 + except Exception as e:
  24 + raise e
  25 + return res
  26 +
  27 +
  28 + api_doc = {
  29 + "tags": ["影像服务接口"],
  30 + "parameters": [
  31 +
  32 + #通用参数
  33 + {"name": "name",
  34 + "in": "formData",
  35 + "type": "string",
  36 + "required": "true",
  37 + "description": "[地图服务,切片服务,影像服务]"},
  38 +
  39 + {"name": "title",
  40 + "in": "formData",
  41 + "type": "string",
  42 + "description": "[地图服务,切片服务,影像服务]"},
  43 +
  44 + {"name": "url",
  45 + "in": "formData",
  46 + "type": "string"},
  47 +
  48 + {"name": "description",
  49 + "in": "formData",
  50 + "type": "string",
  51 + "description": "[地图服务,切片服务,影像服务]"},
  52 + {"name": "type",
  53 + "in": "formData",
  54 + "type": "string",
  55 + "enum":["影像服务"],
  56 + "required": "true",
  57 + "description": "[地图服务,切片服务,影像服务]"},
  58 + {"name": "catalog_guid",
  59 + "in": "formData",
  60 + "type": "string",
  61 + "description": "[地图服务,切片服务,影像服务]"},
  62 +
  63 + #影像参数
  64 + {"name": "image_guids",
  65 + "in": "formData",
  66 + "type": "string",
  67 + "description": "[影像服务]影像guids,以英文逗号相隔"},
  68 +
  69 + {"name": "scheme",
  70 + "in": "formData",
  71 + "type": "string",
  72 + "description": "影像服务切片方案,json形式"},
  73 +
  74 + {"name": "functions",
  75 + "in": "formData",
  76 + "type": "string",
  77 + "description": "[影像服务]functions",
  78 + "enum": ["WMS","WMTS"]},
  79 +
  80 + ],
  81 + "responses": {
  82 + 200: {
  83 + "schema": {
  84 + "properties": {
  85 + }
  86 + }
  87 + }
  88 + }
  89 + }
\ No newline at end of file
... ...
... ... @@ -30,9 +30,10 @@ class Service(db.Model):
30 30 # 目录外键
31 31 catalog_guid = Column(String(256), ForeignKey('dmap_service_catalog.guid'))
32 32
  33 + url = Column(String(256))
  34 +
33 35 relate_service_functions = relationship('ServiceFunction', backref='relate_service', lazy='dynamic')
34 36 relate_tile_service = relationship('TileService', backref='relate_service', lazy='dynamic')
35   - relate_image_service = relationship('ImageService', backref='relate_service', lazy='dynamic')
36 37 relate_map_service = relationship('MapService', backref='relate_service', lazy='dynamic')
37 38
38 39 class ServiceFunction(db.Model):
... ... @@ -84,101 +85,6 @@ class TileScheme(db.Model):
84 85 parameter = Column(Text)
85 86
86 87
87   -class Image(db.Model):
88   - '''
89   - 影像元数据
90   - '''
91   - __tablename__ = 'dmap_image'
92   - guid = Column(String(256), primary_key=True)
93   - name = Column(String)
94   - alias = Column(String)
95   - raster_y_size = Column(Integer)#图像y 分辨率
96   - raster_x_size = Column(Integer)#图像x 分辨率
97   - overview_count = Column(Integer)#金字塔等级
98   - extent = Column(String)#范围
99   - # geo_origin_extent = Column(String)
100   - null_value = Column(Integer)#空值
101   - available = Column(Integer)#影像是否可用,不可用可能在创建金字塔中
102   - band_count = Column(Integer)#波段数
103   - band_view = Column(String)#波段设置
104   - path = Column(String)
105   - server = Column(String)
106   -
107   - size = Column(Float)
108   - #坐标wkt
109   - crs_wkt = Column(Text) #坐标wkt
110   - crs_proj4 = Column(Text)#坐标proj
111   - crs = Column(String)#坐标
112   - create_time = Column(DateTime)
113   - update_time = Column(DateTime)
114   - cell_x_size = Column(Float)#像元x大小
115   - cell_y_size = Column(Float)#像元y大小
116   - region = Column(Text)
117   -
118   - has_pyramid = Column(Integer,default=0)#是否已经创建金字塔
119   -
120   - collect_time = Column(DateTime) #成像时间年份
121   -
122   - satellite = Column(String)#卫星类型
123   - type = Column(String(128))
124   -
125   -
126   -dmap_image_rel = db.Table('dmap_image_rel',
127   - Column('image_guid',String, ForeignKey('dmap_image.guid')),
128   - Column('service_guid', String, ForeignKey('dmap_image_service.guid'))
129   - )
130   -
131   -
132   -
133   -class ImageService(db.Model):
134   - '''
135   - 影像服务
136   - '''
137   - __tablename__ = 'dmap_image_service'
138   - guid = Column(String(256), primary_key=True)
139   - name = Column(String,unique = True)
140   - #切片方案
141   - scheme = Column(Text)
142   -
143   - scheme_guid = Column(String)
144   -
145   - extent = Column(String(256))
146   - # node = Column(Integer)
147   - #可视范围geojson
148   - visual_region = Column(Text)
149   - crs = Column(String(256))
150   - create_time = Column(DateTime)
151   - service_guid = Column(String, ForeignKey('dmap_service.guid'))
152   -
153   - #分层分级设置
154   - # cql = Column(String(256))
155   - # table_guid = Column(String(256))
156   -
157   - images = db.relationship('Image',
158   - secondary=dmap_image_rel,
159   - backref='image_services',
160   - lazy='dynamic'
161   - )
162   -
163   -
164   -dmap_image_tag_rel = db.Table('dmap_image_tag_rel',
165   - Column('image_guid',String, ForeignKey('dmap_image.guid')),
166   - Column('tag_guid', String, ForeignKey('dmap_image_tag.guid'))
167   - )
168   -
169   -class ImageTag(db.Model):
170   - '''
171   - 影像标签
172   - '''
173   - __tablename__ = 'dmap_image_tag'
174   - guid = Column(String(256), primary_key=True)
175   - name=Column(String(256))
176   - alias = Column(String(256))
177   - images = db.relationship('Image',
178   - secondary=dmap_image_tag_rel,
179   - backref='image_tags',
180   - lazy='dynamic')
181   -
182 88 class TileService(db.Model):
183 89 '''
184 90 切片元数据
... ...
... ... @@ -6,9 +6,9 @@ from app.util.component.ApiTemplate import ApiTemplate
6 6
7 7 from app.models import db
8 8 from app.modules.service.models import Service
9   -from app.modules.service.models import ServiceEngine
10 9 from app.modules.service.models import TileService
11 10 from app.modules.service.models import MapService
  11 +import requests
12 12 class Api(ApiTemplate):
13 13
14 14 api_name = "服务删除"
... ... @@ -20,25 +20,35 @@ class Api(ApiTemplate):
20 20
21 21 try:
22 22 guid = self.para.get("guid")
  23 + s_type = self.para.get("type")
23 24
24 25 #删除本地服务
25   - service = Service.query.filter_by(guid=guid).one_or_none()
26   - if service:
27   - if service.type.__eq__("切片服务"):
28   - #调用接口
29   - tile_service = TileService.query.filter_by(service_guid=guid).one_or_none()
30   - db.session.delete(tile_service)
31   - if service.type.__eq__("地图服务"):
32   - map_service = MapService.query.filter_by(service_guid=guid).one_or_none()
33   - db.session.delete(map_service)
34   - service_functions = service.relate_service_functions.all()
35   - for function in service_functions:
36   - db.session.delete(function)
37   - db.session.delete(service)
38   - else:
39   - pass
  26 + if s_type in ["切片服务","地图服务"]:
  27 + service = Service.query.filter_by(guid=guid).one_or_none()
  28 +
  29 + if service:
  30 + if service.type.__eq__("切片服务"):
  31 + #调用接口
  32 + #172.26.99.160:6060/dmap/api/manager/deleteService?servername=tileserver&servicename=GDMap
  33 + tile_service = TileService.query.filter_by(service_guid=guid).one_or_none()
  34 + db.session.delete(tile_service)
40 35
  36 + if service.type.__eq__("地图服务"):
  37 + map_service = MapService.query.filter_by(service_guid=guid).one_or_none()
  38 + db.session.delete(map_service)
  39 + service_functions = service.relate_service_functions.all()
  40 + for function in service_functions:
  41 + db.session.delete(function)
  42 + db.session.delete(service)
41 43
  44 + else:
  45 + raise Exception("服务不存在!")
  46 + # 删除影像服务
  47 + else:
  48 + from app.modules.service.image_service.image_service_delete import Api as RealApi
  49 + api = RealApi()
  50 + api.para = self.para
  51 + res = api.process()
42 52
43 53 db.session.commit()
44 54 res["result"] = True
... ... @@ -54,6 +64,14 @@ class Api(ApiTemplate):
54 64 "in": "formData",
55 65 "type": "string",
56 66 "description": "guid"},
  67 + {"name": "type",
  68 + "in": "formData",
  69 + "type": "string",
  70 + "description": "type"},
  71 + {"name": "url",
  72 + "in": "formData",
  73 + "type": "string",
  74 + "description": "url"},
57 75 ],
58 76 "responses": {
59 77 200: {
... ...
... ... @@ -3,39 +3,42 @@
3 3 #createtime: 2021/9/14
4 4 #email: nheweijun@sina.com
5 5
6   -
7   -
8   -
9 6 from app.util.component.ApiTemplate import ApiTemplate
10   -from app.models import db
11 7 from app.modules.service.models import Service
12   -from app.modules.service.models import ImageService
13   -from app.modules.service.models import TileService
14   -from app.modules.service.models import MapService
  8 +import requests
15 9
16 10 class Api(ApiTemplate):
17 11 api_name = "修改服务"
18 12 def process(self):
19 13 res = {}
20 14 try:
21   - service = Service.query.filter_by(guid=self.para.get("guid")).one_or_none()
22   - if not service:
23   - raise Exception("服务不存在!")
24   -
25   - if service.type.__eq__("影像服务"):
26   - from app.modules.service.image.image_service_edit import Api as RealApi
27   - elif service.type.__eq__("地图服务"):
28   - from app.modules.service.map_service.map_service_edit import Api as RealApi
29   - elif service.type.__eq__("切片服务"):
30   - from app.modules.service.tile_service.tile_service_edit import Api as RealApi
  15 +
  16 +
  17 + guid = self.para.get("guid")
  18 + s_type = self.para.get("type")
  19 +
  20 + # 修改本地服务
  21 + if s_type in ["切片服务", "地图服务"]:
  22 +
  23 + service = Service.query.filter_by(guid=guid).one_or_none()
  24 + if not service:
  25 + raise Exception("服务不存在!")
  26 +
  27 + if service.type.__eq__("地图服务"):
  28 + from app.modules.service.map_service.map_service_edit import Api as RealApi
  29 + elif service.type.__eq__("切片服务"):
  30 + from app.modules.service.tile_service.tile_service_edit import Api as RealApi
  31 + else:
  32 + return res
  33 + elif s_type.__eq__("影像服务"):
  34 + from app.modules.service.image_service.image_service_edit import Api as RealApi
31 35 else:
32 36 return res
33 37 api = RealApi()
34 38 api.para = self.para
35 39 res = api.process()
36   -
37 40 except Exception as e:
38   - raise e
  41 + raise Exception("修改服务失败")
39 42 return res
40 43
41 44
... ... @@ -46,7 +49,7 @@ class Api(ApiTemplate):
46 49 {"name": "guid",
47 50 "in": "formData",
48 51 "type": "string",
49   - "description": "[服务guid]"},
  52 + "description": "服务guid"},
50 53
51 54 {"name": "type",
52 55 "in": "formData",
... ... @@ -54,6 +57,11 @@ class Api(ApiTemplate):
54 57 "enum": ["地图服务","切片服务","影像服务"],
55 58 "description": "[地图服务,切片服务,影像服务]"},
56 59
  60 + {"name": "url",
  61 + "in": "formData",
  62 + "type": "string",
  63 + "description": "服务地址"},
  64 +
57 65 {"name": "name",
58 66 "in": "formData",
59 67 "type": "string",
... ... @@ -82,16 +90,20 @@ class Api(ApiTemplate):
82 90 "in": "formData",
83 91 "type": "string",
84 92 "description": "[影像服务]影像guids,以英文逗号相隔"},
85   - {"name": "scheme_guid",
  93 + {"name": "scheme",
86 94 "in": "formData",
87 95 "type": "string",
88   - "description": "[切片服务,影像服务]切片方案"},
  96 + "description": "切片方案"},
89 97
90 98 # 切片参数
91 99 {"name": "overview",
92 100 "in": "formData",
93 101 "type": "string",
94 102 "description": "[切片服务]缩略图"},
  103 + {"name": "scheme_guid",
  104 + "in": "formData",
  105 + "type": "string",
  106 + "description": "切片服务切片方案"},
95 107 {"name": "tile_type",
96 108 "in": "formData",
97 109 "type": "string",
... ...
... ... @@ -7,37 +7,52 @@
7 7 from app.util.component.ApiTemplate import ApiTemplate
8 8 from app.util.component.ModelVisitor import ModelVisitor
9 9 from .models import Service
10   -
  10 +import requests
11 11 class Api(ApiTemplate):
12 12 api_name = "服务Info"
13 13 def process(self):
14 14 res = {}
15 15 try:
  16 +
16 17 guid = self.para.get("guid")
17   - service = Service.query.filter_by(guid=guid).one_or_none()
18   - if not service:
19   - raise Exception("服务不存在!")
20   - res["data"] = {}
21   -
22   - if service.type.__eq__("影像服务"):
23   - speci_service = service.relate_image_service.one_or_none()
24   - relate_images = speci_service.images.all()
25   - res["data"]["speci_service"] = ModelVisitor.object_to_json(speci_service)
26   - res["data"]["speci_service"]["images"] = [{"name":im["name"],"guid":im["guid"]} for im in ModelVisitor.objects_to_jsonarray(relate_images)]
27   - res["data"]["speci_service"]["images"] = sorted(res["data"]["speci_service"]["images"], key=lambda x: x["name"])
28   -
29   - elif service.type.__eq__("切片服务"):
30   - speci_service = service.relate_tile_service.one_or_none()
31   - res["data"]["speci_service"] = ModelVisitor.object_to_json(speci_service)
32   - elif service.type.__eq__("地图服务"):
33   - speci_service = service.relate_map_service.one_or_none()
34   - res["data"]["speci_service"] = ModelVisitor.object_to_json(speci_service)
35   - else:
  18 + s_type = self.para.get("type")
  19 +
  20 + if s_type in ["地图服务","切片服务"]:
  21 +
  22 + service = Service.query.filter_by(guid=guid).one_or_none()
  23 + if not service:
  24 + raise Exception("服务不存在!")
36 25 res["data"] = {}
37 26
38   - functions = ModelVisitor.objects_to_jsonarray(service.relate_service_functions.all())
39   - res["data"]["service"] = ModelVisitor.object_to_json(service)
40   - res["data"]["service"]["functions"] = functions
  27 + if service.type.__eq__("影像服务"):
  28 + speci_service = service.relate_image_service.one_or_none()
  29 + relate_images = speci_service.images.all()
  30 + res["data"]["speci_service"] = ModelVisitor.object_to_json(speci_service)
  31 + res["data"]["speci_service"]["images"] = [{"name":im["name"],"guid":im["guid"]} for im in ModelVisitor.objects_to_jsonarray(relate_images)]
  32 + res["data"]["speci_service"]["images"] = sorted(res["data"]["speci_service"]["images"], key=lambda x: x["name"])
  33 +
  34 + elif service.type.__eq__("切片服务"):
  35 + speci_service = service.relate_tile_service.one_or_none()
  36 + res["data"]["speci_service"] = ModelVisitor.object_to_json(speci_service)
  37 + elif service.type.__eq__("地图服务"):
  38 + speci_service = service.relate_map_service.one_or_none()
  39 + res["data"]["speci_service"] = ModelVisitor.object_to_json(speci_service)
  40 + else:
  41 + res["data"] = {}
  42 +
  43 + functions = ModelVisitor.objects_to_jsonarray(service.relate_service_functions.all())
  44 + res["data"]["service"] = ModelVisitor.object_to_json(service)
  45 + res["data"]["service"]["functions"] = functions
  46 +
  47 + elif s_type in ["影像服务"]:
  48 + edit_url = "{}/API/Service/Info".format(self.para.get("url"))
  49 + response:requests.Response = requests.post(edit_url,self.para)
  50 + if not response.json().get("result"):
  51 + raise Exception("查询影像服务失败!")
  52 + res = response.json()
  53 + else:
  54 + pass
  55 +
41 56 except Exception as e:
42 57 raise e
43 58 return res
... ... @@ -50,6 +65,15 @@ class Api(ApiTemplate):
50 65 "in": "formData",
51 66 "type": "string",
52 67 "description": "guid"},
  68 + {"name": "type",
  69 + "in": "formData",
  70 + "type": "string",
  71 + "description": "type",
  72 + "enum":["地图服务","切片服务","影像服务"]},
  73 + {"name": "url",
  74 + "in": "formData",
  75 + "type": "string",
  76 + "description": "url"},
53 77 ],
54 78 "responses": {
55 79 200: {
... ...
... ... @@ -6,9 +6,11 @@
6 6
7 7 from app.util.component.ApiTemplate import ApiTemplate
8 8 from app.util.component.ModelVisitor import ModelVisitor
9   -from .models import Service,ServiceFunction,ImageService
  9 +from .models import Service,ServiceFunction,ServiceEngine
10 10 from sqlalchemy import or_
11   -
  11 +import requests
  12 +import re
  13 +from datetime import datetime
12 14
13 15 class Api(ApiTemplate):
14 16 api_name = "服务列表"
... ... @@ -50,17 +52,51 @@ class Api(ApiTemplate):
50 52 services = services.filter(Service.name.like("%" + name + "%"))
51 53
52 54
53   - res["data"] = {}
54   - res["data"]["count"] = services.count()
55   - services = services.limit(page_size).offset(page_index * page_size).all()
56   - res["data"]["list"] = ModelVisitor.objects_to_jsonarray(services)
57   -
58   - for service_json in res["data"]["list"]:
  55 + # 本地服务
  56 + services = services.all()
  57 + services_json = ModelVisitor.objects_to_jsonarray(services)
  58 + for service_json in services_json:
59 59 service_json["functions"] = sorted(ModelVisitor.objects_to_jsonarray(ServiceFunction.query.filter_by(service_guid=service_json["guid"]).all()),
60 60 key=lambda x:x["type"])
61 61
62   - res["result"] = True
  62 + # 影像服务
  63 + image_engines = ServiceEngine.query.filter_by(type="ImageServer").all()
  64 +
  65 + for ie in image_engines:
  66 + url = "{}/API/Service/List".format(ie.url)
  67 + response:requests.Response = requests.post(url,self.para)
  68 + if not response.json().get("result"):
  69 + raise Exception("修改影像服务失败!")
  70 + else:
  71 + raw_json = response.json()["data"]["list"]
  72 + if state:
  73 + raw_json = [ service for service in raw_json if service["state"] == state]
  74 + if type:
  75 + raw_json = [service for service in raw_json if service["type"] == type]
  76 + if catalog_guid:
  77 + raw_json = [service for service in raw_json if service["catalog_guid"] == catalog_guid]
  78 + # 并集
  79 + if title and name:
  80 + raw_json = [service for service in raw_json if re.search(name, service["name"]) or re.search(title, service["title"])]
  81 + else:
  82 + if title:
  83 + raw_json = [service for service in raw_json if re.search(title, service["title"])]
  84 + if name:
  85 + raw_json = [service for service in raw_json if re.search(name, service["name"])]
  86 + services_json.extend(raw_json)
  87 +
  88 + # 筛选服务能力
  89 + if function_type:
  90 + services_json = [s for s in services_json if list(f["type"] for f in s["functions"]).__contains__(function_type)]
63 91
  92 + res["data"] = {}
  93 + res["data"]["count"] = len(services_json)
  94 +
  95 + # update时间倒数
  96 + services_json = sorted(services_json,key=lambda x:x["update_time"],reverse=True)
  97 +
  98 + res["data"]["list"] = services_json[page_index:(page_index+1)*page_size]
  99 + res["result"] = True
64 100
65 101 except Exception as e:
66 102 raise e
... ... @@ -89,6 +125,13 @@ class Api(ApiTemplate):
89 125 "in": "formData",
90 126 "type": "string",
91 127 "description": "服务名"},
  128 +
  129 + {"name": "function_type",
  130 + "in": "formData",
  131 + "type": "string",
  132 + "description": "服务类型",
  133 + "enum":["WMS","WMTS","WFS"]},
  134 +
92 135 {"name": "state",
93 136 "in": "formData",
94 137 "type": "string",
... ... @@ -113,3 +156,5 @@ class Api(ApiTemplate):
113 156 }
114 157 }
115 158 }
  159 +
  160 +
... ...
... ... @@ -6,10 +6,9 @@
6 6
7 7 from app.util.component.ApiTemplate import ApiTemplate
8 8 from app.util.component.ModelVisitor import ModelVisitor
9   -from .models import Service,ServiceFunction,ImageService
10   -from sqlalchemy import or_
  9 +from .models import Service,ServiceFunction,ServiceEngine
11 10 from app.util.component.GeometryAdapter import GeometryAdapter
12   -
  11 +import requests
13 12 import json
14 13
15 14 class Api(ApiTemplate):
... ... @@ -34,9 +33,8 @@ class Api(ApiTemplate):
34 33
35 34 services = services.join(ServiceFunction).filter(ServiceFunction.type=="WMTS")
36 35 services = services.all()
37   -
38   -
39 36 fit_services = []
  37 +
40 38 if bbox:
41 39 g1 = GeometryAdapter.bbox_2_polygon([float(x) for x in bbox.split(",")])
42 40 for ser in services:
... ... @@ -46,25 +44,35 @@ class Api(ApiTemplate):
46 44 g2 = GeometryAdapter.envelop_2_polygon([float(x) for x in layer_exetent.split(",")])
47 45 if g1.Intersect(g2):
48 46 fit_services.append(ser)
49   - if ser.type.__eq__("影像服务"):
50   - image_extent = ser.relate_image_service.one_or_none().extent
51   - g2 = GeometryAdapter.bbox_2_polygon(json.loads(image_extent))
52   - if g1.Intersect(g2):
53   - fit_services.append(ser)
54 47 else:
55 48 fit_services = services
56 49
57   - res["data"] = {}
58   - res["data"]["count"] = len(fit_services)
59   -
60   - res["data"]["list"] = ModelVisitor.objects_to_jsonarray(fit_services[page_index * page_size:(page_index+1) * page_size])
61 50
62   - for service_json in res["data"]["list"]:
  51 + # 本地服务
  52 + fit_services_json = ModelVisitor.objects_to_jsonarray(fit_services)
  53 + for service_json in fit_services_json:
63 54 service_json["functions"] = sorted(ModelVisitor.objects_to_jsonarray(ServiceFunction.query.filter_by(service_guid=service_json["guid"]).all()),
64 55 key=lambda x:x["type"])
65 56
66   - res["result"] = True
  57 + # 影像服务
  58 + image_engines = ServiceEngine.query.filter_by(type="ImageServer").all()
67 59
  60 + for ie in image_engines:
  61 + url = "{}/API/Service/BaseMapList".format(ie.url)
  62 + response:requests.Response = requests.post(url,self.para)
  63 + if not response.json().get("result"):
  64 + raise Exception("修改影像服务失败!")
  65 + else:
  66 + raw_json = response.json()["data"]["list"]
  67 + fit_services_json.extend(raw_json)
  68 +
  69 + res["data"] = {}
  70 + res["data"]["count"] = len(fit_services_json)
  71 +
  72 + fit_services_json = sorted(fit_services_json, key=lambda x: x["update_time"], reverse=True)
  73 +
  74 + res["data"]["list"] = fit_services_json[page_index:(page_index + 1) * page_size]
  75 + res["result"] = True
68 76
69 77 except Exception as e:
70 78 raise e
... ...
... ... @@ -5,6 +5,7 @@
5 5
6 6 from app.util.component.ApiTemplate import ApiTemplate
7 7 from .models import Service
  8 +import requests
8 9 class Api(ApiTemplate):
9 10 api_name = "注册服务"
10 11 def process(self):
... ... @@ -15,18 +16,21 @@ class Api(ApiTemplate):
15 16 if service:
16 17 raise Exception("服务已存在!")
17 18
18   - if self.para.get("type").__eq__("影像服务"):
19   - from app.modules.service.image.image_service_register import Api as RealApi
20   -
21   - elif self.para.get("type").__eq__("地图服务"):
  19 + if self.para.get("type").__eq__("地图服务"):
22 20 from app.modules.service.map_service.map_service_register import Api as RealApi
  21 +
23 22 elif self.para.get("type").__eq__("切片服务"):
24 23 from app.modules.service.tile_service.tile_service_register import Api as RealApi
  24 +
  25 + elif self.para.get("type").__eq__("影像服务"):
  26 + from app.modules.service.image_service.image_service_register import Api as RealApi
  27 +
25 28 else:
26 29 return res
27 30 api = RealApi()
28 31 api.para = self.para
29 32 res = api.process()
  33 +
30 34 except Exception as e:
31 35 raise e
32 36 return res
... ... @@ -42,10 +46,16 @@ class Api(ApiTemplate):
42 46 "type": "string",
43 47 "required": "true",
44 48 "description": "[地图服务,切片服务,影像服务]"},
  49 +
45 50 {"name": "title",
46 51 "in": "formData",
47 52 "type": "string",
48 53 "description": "[地图服务,切片服务,影像服务]"},
  54 +
  55 + {"name": "url",
  56 + "in": "formData",
  57 + "type": "string"},
  58 +
49 59 {"name": "description",
50 60 "in": "formData",
51 61 "type": "string",
... ... @@ -66,15 +76,12 @@ class Api(ApiTemplate):
66 76 "in": "formData",
67 77 "type": "string",
68 78 "description": "[影像服务]影像guids,以英文逗号相隔"},
69   - {"name": "scheme_guid",
70   - "in": "formData",
71   - "type": "string",
72   - "description": "[切片服务,影像服务]切片方案"},
73 79
74   - {"name": "scheme_guid",
  80 + {"name": "scheme",
75 81 "in": "formData",
76 82 "type": "string",
77   - "description": "[切片服务,影像服务]切片方案"},
  83 + "description": "[影像服务,切片服务]切片方案json"},
  84 +
78 85
79 86 {"name": "functions",
80 87 "in": "formData",
... ... @@ -92,6 +99,7 @@ class Api(ApiTemplate):
92 99 "type": "string",
93 100 "description": "[切片服务]tile_type",
94 101 "enum":["WMTS","TMS"]},
  102 +
95 103 {"name": "vendor",
96 104 "in": "formData",
97 105 "type": "string",
... ...
... ... @@ -15,13 +15,27 @@ class Api(ApiTemplate):
15 15 try:
16 16 guid = self.para.get("guid")
17 17 state = int(self.para.get("state"))
18   - # 清理缓存,拒绝服务
  18 + s_type = self.para.get("type")
  19 +
  20 +
  21 + #删除本地服务
  22 + if s_type in ["切片服务","地图服务"]:
  23 + service = Service.query.filter_by(guid=guid).one_or_none()
  24 +
  25 + if service:
  26 + service.state = state
  27 + db.session.commit()
  28 + res["result"] = True
  29 + else:
  30 + raise Exception("服务不存在!")
  31 + # 删除影像服务
  32 + else:
  33 + from app.modules.service.image_service.image_service_edit import Api as RealApi
  34 + api = RealApi()
  35 + api.para = self.para
  36 + res = api.process()
19 37
20   - service = Service.query.filter_by(guid=guid).one_or_none()
21 38
22   - service.state=state
23   - db.session.commit()
24   - res["result"] = True
25 39 except Exception as e:
26 40 raise e
27 41 return res
... ... @@ -34,6 +48,14 @@ class Api(ApiTemplate):
34 48 "in": "formData",
35 49 "type": "string",
36 50 "description": "guid"},
  51 + {"name": "type",
  52 + "in": "formData",
  53 + "type": "string",
  54 + "description": "type"},
  55 + {"name": "url",
  56 + "in": "formData",
  57 + "type": "string",
  58 + "description": "type"},
37 59 {"name": "state",
38 60 "in": "formData",
39 61 "type": "int",
... ...
... ... @@ -80,8 +80,7 @@ class Api(ApiTemplate):
80 80 res["result"] = True
81 81
82 82 except Exception as e:
83   - raise e
84   -
  83 + raise Exception("数据库错误!")
85 84 return res
86 85
87 86 api_doc = {
... ...
... ... @@ -29,6 +29,7 @@ class Api(ApiTemplate):
29 29 tile_service_guid = uuid.uuid1().__str__()
30 30 service_function_guid = uuid.uuid1().__str__()
31 31 # 调用切片服务的注册服务接口
  32 +
32 33 project_file = ProjectFile.create(self.para)
33 34 para = {"name":self.para.get("name"),"title":self.para.get("title"),
34 35 "type":"tileserver","capabilities":1,"project":project_file}
... ... @@ -61,7 +62,7 @@ class Api(ApiTemplate):
61 62 if tile_service_isexist:
62 63 db.session.delete(tile_service_isexist)
63 64
64   - tile_scheme: TileScheme = TileScheme.query.filter_by(guid=self.para.get("scheme_guid")).one_or_none()
  65 + # tile_scheme: TileScheme = TileScheme.query.filter_by(guid=self.para.get("scheme_guid")).one_or_none()
65 66
66 67 tile_service = TileService(
67 68 guid = tile_service_guid,
... ... @@ -79,8 +80,10 @@ class Api(ApiTemplate):
79 80 layer_format = self.para.get("layer_format"),
80 81 layer_extent = self.para.get("layer_extent"),
81 82 layer_description = self.para.get("layer_description"),
82   - scheme_guid = self.para.get("scheme_guid"),
83   - scheme = json.dumps(ModelVisitor.object_to_json(tile_scheme)),
  83 + # scheme_guid = self.para.get("scheme_guid"),
  84 + # scheme = json.dumps(ModelVisitor.object_to_json(tile_scheme)),
  85 +
  86 + scheme=self.para.get("scheme"),
84 87 service_guid = service_guid,
85 88 metadata_url = "{}/DMap/Services/{}/MapServer/WMTSServer".format(configure.wmts_url,self.para.get("name"))
86 89 )
... ... @@ -98,7 +101,7 @@ class Api(ApiTemplate):
98 101 res["result"] = True
99 102 except Exception as e:
100 103 db.session.rollback()
101   - raise e
  104 + raise Exception("数据库错误!")
102 105 return res
103 106
104 107
... ...
... ... @@ -31,7 +31,7 @@ class Api(ApiTemplate):
31 31 res["data"]["list"].append(para)
32 32 res["result"] = True
33 33 except Exception as e:
34   - raise e
  34 + raise Exception("数据库错误!")
35 35 return res
36 36
37 37
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/12/15
  4 +#email: nheweijun@sina.com
  5 +
  6 +from app.util.component.ApiTemplate import ApiTemplate
  7 +from app.util.component.ModelVisitor import ModelVisitor
  8 +from ..models import Service,ServiceFunction,ServiceEngine
  9 +from sqlalchemy import or_
  10 +import requests
  11 +
  12 +def get_all_service():
  13 +
  14 + res = []
  15 + services = Service.query.order_by(Service.update_time.desc())
  16 + res.extend(ModelVisitor.objects_to_jsonarray(services))
  17 + engines = ServiceEngine.query.filter_by(type="ImageServer").all()
  18 + for engine in engines:
  19 + service_url = "{}/API/Service/List".format(engine.url)
  20 + response:requests.Response = requests.post(url=service_url,data={"page_index":"0","page_size":"999"})
  21 + res.extend(response.json()["data"]["list"])
  22 + return res
\ No newline at end of file
... ...
... ... @@ -6,7 +6,6 @@
6 6 import datetime
7 7 import uuid
8 8 from app.modules.data.models import Process,Task,Table
9   -from app.modules.service.models import Image
10 9 import configure
11 10 from app.util.component.PGUtil import PGUtil
12 11
... ... @@ -53,11 +52,6 @@ class TaskWriter:
53 52 if commit:
54 53 self.sys_session.commit()
55 54
56   - @check_session
57   - def update_image(self,image_guid,update_info,commit=True):
58   - self.sys_session.query(Image).filter_by(guid=image_guid).update(update_info)
59   - if commit:
60   - self.sys_session.commit()
61 55
62 56 def close(self):
63 57 try:
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/12/20
  4 +#email: nheweijun@sina.com
  5 +
  6 +import math
  7 +import requests
  8 +import numpy
  9 +import cv2
  10 +from osgeo import gdal,osr
  11 +from osgeo.gdal import *
  12 +
  13 +
  14 +# Math functions taken from https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames #spellok
  15 +# TMS 经纬度转
  16 +def deg2num( lon_deg,lat_deg, zoom):
  17 + lat_rad = math.radians(lat_deg)
  18 + n = 2.0 ** zoom
  19 + xtile = int((lon_deg + 180.0) / 360.0 * n)
  20 + ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
  21 + return (xtile, ytile)
  22 +
  23 +def num2deg(xtile, ytile, zoom):
  24 + n = 2.0 ** zoom
  25 + lon_deg = xtile / n * 360.0 - 180.0
  26 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
  27 + lat_deg = math.degrees(lat_rad)
  28 + return (lat_deg, lon_deg)
  29 +
  30 +def tms_overview(extent,url_format):
  31 +
  32 +
  33 + lev = 0
  34 + r1 = 0
  35 + r2 = 0
  36 + c1 = 0
  37 + c2 = 0
  38 +
  39 + while r1 - r2 < 2:
  40 + lev += 1
  41 + # 左下角所在行列号
  42 + c1, r1 = deg2num( extent[0],extent[2], lev)
  43 + # 右上角所在行列号
  44 + c2, r2 = deg2num( extent[1],extent[3], lev)
  45 + if lev > 20 :
  46 + break
  47 +
  48 + print(lev)
  49 +
  50 + # 左下角瓦片的左上角坐标
  51 + lat1, lon1 = num2deg(c1, r1, lev)
  52 + # 左下角瓦片的右下角坐标
  53 + lat2, lon2 = num2deg(c1 + 1, r1 + 1, lev)
  54 +
  55 + # 右上角瓦片的左上角坐标
  56 + lat3, lon3 = num2deg(c2, r2, lev)
  57 + # 右上角瓦片的右下角坐标
  58 + lat4, lon4 = num2deg(c2 + 1, r2 + 1, lev)
  59 +
  60 + # 瓦片拼接底图
  61 + dat = numpy.zeros(((r1 - r2 + 1) * 256, (c2 - c1 + 1) * 256, 3), dtype=int) + 255
  62 +
  63 + # x偏移量
  64 + offx = (extent[0] - lon1) / ((lon4 - lon1) / ((c2 - c1 + 1) * 256))
  65 + # x方向像素量
  66 + xnum = (extent[1] - extent[0]) / ((lon4 - lon1) / ((c2 - c1 + 1) * 256))
  67 +
  68 + # y偏移量
  69 + offy = (lat3 - extent[3]) / ((lat3 - lat2) / ((r1 - r2 + 1) * 256))
  70 + # y方向像素量
  71 + ynum = (extent[3] - extent[2]) / ((lat3 - lat2) / ((r1 - r2 + 1) * 256))
  72 +
  73 + # 拼接瓦片
  74 + for r in range(r2, r1 + 1):
  75 + for c in range(c1, c2 + 1):
  76 + url = "{}/{}/{}/{}.png".format(url_format,lev, c, r)
  77 + dataset: Dataset = gdal.Open(url, 0)
  78 + for b in range(1, 4):
  79 + band: Band = dataset.GetRasterBand(b)
  80 + dat[(r - r2) * 256:(r - r2 + 1) * 256, (c - c1) * 256: (c - c1 + 1) * 256,
  81 + 2 - (b - 1)] = band.ReadAsArray(0, 0, 256, 256)
  82 +
  83 + #裁剪
  84 + dat2 = dat[int(offy):int(offy + ynum), int(offx):int(offx + xnum), :]
  85 +
  86 + cv2.imwrite("over.jpg", dat2, [cv2.IMWRITE_JPEG_QUALITY, 30])
  87 +
  88 +def get_polygon(parameter,level,row,col):
  89 + level=int(level)
  90 + row = int(row)
  91 + col = int(col)
  92 + detaxy = parameter.get(str(level)).get("resolution")* parameter.get("cols")
  93 +
  94 + lon1 = detaxy * col + int(parameter.get("x"))
  95 + lat2 = -detaxy * row + int(parameter.get("y"))
  96 + lon2 = detaxy + lon1
  97 + lat1 = -detaxy + lat2
  98 +
  99 + return [lon1,lat1,lon2,lat2]
  100 +
  101 +def get_rc(parameter,l,lon,lat):
  102 +
  103 + detaxy = parameter.get(str(l)).get("resolution")* parameter.get("cols")
  104 + c = math.floor((lon - int(parameter.get("x")))/detaxy)
  105 + r = math.floor((int(parameter.get("y"))-lat)/detaxy)
  106 + return int(r),int(c)
  107 +
  108 +def wmts_overview(extent,url_format):
  109 +
  110 + scheme = {"0": {"resolution": 1.4062500000059488, "scale": 590995186.12}, "1": {"resolution": 0.7031250000029744, "scale": 295497593.06}, "2": {"resolution": 0.3515625000014872, "scale": 147748796.53}, "3": {"resolution": 0.1757812500007436, "scale": 73874398.265}, "4": {"resolution": 0.0878906250003718, "scale": 36937199.1325}, "5": {"resolution": 0.0439453125001859, "scale": 18468599.56625}, "6": {"resolution": 0.02197265625009295, "scale": 9234299.783125}, "7": {"resolution": 0.010986328125046475, "scale": 4617149.8915625}, "8": {"resolution": 0.0054931640625232375, "scale": 2308574.94578125}, "9": {"resolution": 0.0027465820312616187, "scale": 1154287.472890625}, "10": {"resolution": 0.0013732910156308094, "scale": 577143.7364453125}, "11": {"resolution": 0.0006866455078154047, "scale": 288571.86822265625}, "12": {"resolution": 0.00034332275390770234, "scale": 144285.93411132813}, "13": {"resolution": 0.00017166137695385117, "scale": 72142.96705566406}, "14": {"resolution": 8.583068847692559e-05, "scale": 36071.48352783203}, "15": {"resolution": 4.291534423846279e-05, "scale": 18035.741763916016}, "16": {"resolution": 2.1457672119231396e-05, "scale": 9017.870881958008}, "17": {"resolution": 1.0728836059615698e-05, "scale": 4508.935440979004}, "18": {"resolution": 5.364418029807849e-06, "scale": 2254.467720489502}, "19": {"resolution": 2.6822090149039246e-06, "scale": 1127.233860244751}, "20": {"resolution": 1.3411045074519623e-06, "scale": 563.6169301223755}, "cols": 256, "rows": 256, "dpi": 96, "wkt": "", "x": -400, "y": 400}
  111 +
  112 + lev = 0
  113 + r1 = 0
  114 + r2 = 0
  115 + c1 = 0
  116 + c2 = 0
  117 + while r1 - r2 <2:
  118 + lev += 1
  119 + # 左下角所在瓦片
  120 + r1,c1 = get_rc(scheme,lev, extent[0],extent[2])
  121 + # 右上角所在瓦片
  122 + r2,c2 = get_rc(scheme,lev, extent[1],extent[3])
  123 + if lev > 20 :
  124 + break
  125 +
  126 + print(lev)
  127 + # 左下角瓦片的范围
  128 + [lon1, lat1, lon2, lat2] = get_polygon(scheme, lev, r1, c1)
  129 + # 右上角角瓦片的范围
  130 + [lon12, lat12, lon22, lat22] = get_polygon(scheme, lev, r2, c2)
  131 +
  132 + # 瓦片拼接底图
  133 + dat = numpy.zeros(((r1 - r2 + 1) * 256, (c2 - c1 + 1) * 256, 3), dtype=int)
  134 +
  135 +
  136 + # x偏移量
  137 + offx = (extent[0] - lon1) / ((lon22 - lon1) / ((c2 - c1 + 1) * 256))
  138 + # x方向像素量
  139 + xnum = (extent[1] - extent[0]) / ((lon22 - lon1) / ((c2 - c1 + 1) * 256))
  140 +
  141 + # y偏移量
  142 + offy = (lat22 - extent[3]) / ((lat22 - lat1) / ((r1 - r2 + 1) * 256))
  143 + # y方向像素量
  144 + ynum = (extent[3] - extent[2]) / ((lat22 - lat1) / ((r1 - r2 + 1) * 256))
  145 + # 拼接瓦片
  146 + for r in range(r2, r1 + 1):
  147 + for c in range(c1, c2 + 1):
  148 +
  149 + url = url_format.format(lev, c, r)
  150 + dataset: Dataset = gdal.Open(url, 0)
  151 +
  152 + if dataset.RasterCount==1:
  153 + continue
  154 +
  155 + for b in range(1, 4):
  156 + band: Band = dataset.GetRasterBand(b)
  157 +
  158 + dat[(r - r2) * 256:(r - r2 + 1) * 256, (c - c1) * 256: (c - c1 + 1) * 256,
  159 + 2 - (b - 1)] = band.ReadAsArray(0, 0, 256, 256)
  160 +
  161 + dat2 = dat[int(offy):int(offy + ynum), int(offx):int(offx + xnum), :]
  162 + #裁剪
  163 + cv2.imwrite("overwmts.jpg", dat2, [cv2.IMWRITE_JPEG_QUALITY, 30])
  164 +
  165 +if __name__ == '__main__':
  166 +
  167 + tms_overview([107.78981494180618, 120.43553603935675, 18.870480519260582, 25.999868757737033],"http://172.26.99.160:6060/DMap/Services/GDMap/TileServer/TMSService"
  168 + )
  169 + wmts_url = "http://172.26.99.160:6060/DMap/Services/tile/TileServer/WMTSService?layer=&style=default&tilematrixset=nativeTileMatrixSet&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fpng&TileMatrix={}&TileCol={}&TileRow={}"
  170 + wmts_overview([107.78981494180618, 120.43553603935675, 18.870480519260582, 25.999868757737033],wmts_url)
\ No newline at end of file
... ...
... ... @@ -4,7 +4,7 @@ import logging
4 4 deploy_ip_host = "172.26.40.105:8840"
5 5 # 系统数据库
6 6
7   -SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager"
  7 +SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager_test"
8 8 # SQLALCHEMY_DATABASE_URI = "postgresql://postgres:postgres@localhost:5433/dmap_dms_test"
9 9
10 10 # 指定精华表所在位置(必须为空间库),设置为None则存放在各自的实体库中
... ...
... ... @@ -62,9 +62,20 @@ if __name__ == '__main__':
62 62 # print(str(base64.b64decode(kk), "utf-8"))
63 63 # daf=0
64 64
65   - zoo: KazooClient = KazooClient(hosts="172.26.99.168:2181", timeout=1)
66   - zoo.start()
67   - while 1:
68   - time.sleep(1)
69   - print(zoo.connected)
70   - print(zoo.get_children("/rpc"))
\ No newline at end of file
  65 + # zoo: KazooClient = KazooClient(hosts="172.26.99.168:2181", timeout=1)
  66 + # zoo.start()
  67 + # while 1:
  68 + # time.sleep(1)
  69 + # print(zoo.connected)
  70 + # print(zoo.get_children("/rpc"))
  71 +
  72 + if __name__ == '__main__':
  73 + import re
  74 +
  75 + line = "广州市区"
  76 + pattern = r"的区"
  77 + matchObj = re.search(pattern, line)
  78 + if matchObj:
  79 + print("y")
  80 + else:
  81 + print("n")
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/12/20
  4 +#email: nheweijun@sina.com
  5 +
  6 +import math
  7 +import requests
  8 +import numpy
  9 +import cv2
  10 +from osgeo import gdal,osr
  11 +from osgeo.gdal import *
  12 +
  13 +
  14 +# Math functions taken from https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames #spellok
  15 +# TMS 经纬度转
  16 +def deg2num( lon_deg,lat_deg, zoom):
  17 + lat_rad = math.radians(lat_deg)
  18 + n = 2.0 ** zoom
  19 + xtile = int((lon_deg + 180.0) / 360.0 * n)
  20 + ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
  21 + return (xtile, ytile)
  22 +
  23 +def num2deg(xtile, ytile, zoom):
  24 + n = 2.0 ** zoom
  25 + lon_deg = xtile / n * 360.0 - 180.0
  26 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
  27 + lat_deg = math.degrees(lat_rad)
  28 + return (lat_deg, lon_deg)
  29 +
  30 +def tms_overview(extent,url_format):
  31 +
  32 +
  33 + lev = 0
  34 + r1 = 0
  35 + r2 = 0
  36 + c1 = 0
  37 + c2 = 0
  38 +
  39 + while r1 - r2 < 2:
  40 + lev += 1
  41 + # 左下角所在行列号
  42 + c1, r1 = deg2num( extent[0],extent[2], lev)
  43 + # 右上角所在行列号
  44 + c2, r2 = deg2num( extent[1],extent[3], lev)
  45 + if lev > 20 :
  46 + break
  47 +
  48 + print(lev)
  49 +
  50 + # 左下角瓦片的左上角坐标
  51 + lat1, lon1 = num2deg(c1, r1, lev)
  52 + # 左下角瓦片的右下角坐标
  53 + lat2, lon2 = num2deg(c1 + 1, r1 + 1, lev)
  54 +
  55 + # 右上角瓦片的左上角坐标
  56 + lat3, lon3 = num2deg(c2, r2, lev)
  57 + # 右上角瓦片的右下角坐标
  58 + lat4, lon4 = num2deg(c2 + 1, r2 + 1, lev)
  59 +
  60 + # 瓦片拼接底图
  61 + dat = numpy.zeros(((r1 - r2 + 1) * 256, (c2 - c1 + 1) * 256, 3), dtype=int) + 255
  62 +
  63 + # x偏移量
  64 + offx = (extent[0] - lon1) / ((lon4 - lon1) / ((c2 - c1 + 1) * 256))
  65 + # x方向像素量
  66 + xnum = (extent[1] - extent[0]) / ((lon4 - lon1) / ((c2 - c1 + 1) * 256))
  67 +
  68 + # y偏移量
  69 + offy = (lat3 - extent[3]) / ((lat3 - lat2) / ((r1 - r2 + 1) * 256))
  70 + # y方向像素量
  71 + ynum = (extent[3] - extent[2]) / ((lat3 - lat2) / ((r1 - r2 + 1) * 256))
  72 +
  73 + # 拼接瓦片
  74 + for r in range(r2, r1 + 1):
  75 + for c in range(c1, c2 + 1):
  76 + url = "{}/{}/{}/{}.png".format(url_format,lev, c, r)
  77 + dataset: Dataset = gdal.Open(url, 0)
  78 + for b in range(1, 4):
  79 + band: Band = dataset.GetRasterBand(b)
  80 + dat[(r - r2) * 256:(r - r2 + 1) * 256, (c - c1) * 256: (c - c1 + 1) * 256,
  81 + 2 - (b - 1)] = band.ReadAsArray(0, 0, 256, 256)
  82 +
  83 + #裁剪
  84 + dat2 = dat[int(offy):int(offy + ynum), int(offx):int(offx + xnum), :]
  85 +
  86 + cv2.imwrite("over.jpg", dat2, [cv2.IMWRITE_JPEG_QUALITY, 30])
  87 +
  88 +def get_polygon(parameter,level,row,col):
  89 + level=int(level)
  90 + row = int(row)
  91 + col = int(col)
  92 + detaxy = parameter.get(str(level)).get("resolution")* parameter.get("cols")
  93 +
  94 + lon1 = detaxy * col + int(parameter.get("x"))
  95 + lat2 = -detaxy * row + int(parameter.get("y"))
  96 + lon2 = detaxy + lon1
  97 + lat1 = -detaxy + lat2
  98 +
  99 + return [lon1,lat1,lon2,lat2]
  100 +
  101 +def get_rc(parameter,l,lon,lat):
  102 +
  103 + detaxy = parameter.get(str(l)).get("resolution")* parameter.get("cols")
  104 + c = math.floor((lon - int(parameter.get("x")))/detaxy)
  105 + r = math.floor((int(parameter.get("y"))-lat)/detaxy)
  106 + return int(r),int(c)
  107 +
  108 +def wmts_overview(extent,url_format):
  109 +
  110 + scheme = {"0": {"resolution": 1.4062500000059488, "scale": 590995186.12}, "1": {"resolution": 0.7031250000029744, "scale": 295497593.06}, "2": {"resolution": 0.3515625000014872, "scale": 147748796.53}, "3": {"resolution": 0.1757812500007436, "scale": 73874398.265}, "4": {"resolution": 0.0878906250003718, "scale": 36937199.1325}, "5": {"resolution": 0.0439453125001859, "scale": 18468599.56625}, "6": {"resolution": 0.02197265625009295, "scale": 9234299.783125}, "7": {"resolution": 0.010986328125046475, "scale": 4617149.8915625}, "8": {"resolution": 0.0054931640625232375, "scale": 2308574.94578125}, "9": {"resolution": 0.0027465820312616187, "scale": 1154287.472890625}, "10": {"resolution": 0.0013732910156308094, "scale": 577143.7364453125}, "11": {"resolution": 0.0006866455078154047, "scale": 288571.86822265625}, "12": {"resolution": 0.00034332275390770234, "scale": 144285.93411132813}, "13": {"resolution": 0.00017166137695385117, "scale": 72142.96705566406}, "14": {"resolution": 8.583068847692559e-05, "scale": 36071.48352783203}, "15": {"resolution": 4.291534423846279e-05, "scale": 18035.741763916016}, "16": {"resolution": 2.1457672119231396e-05, "scale": 9017.870881958008}, "17": {"resolution": 1.0728836059615698e-05, "scale": 4508.935440979004}, "18": {"resolution": 5.364418029807849e-06, "scale": 2254.467720489502}, "19": {"resolution": 2.6822090149039246e-06, "scale": 1127.233860244751}, "20": {"resolution": 1.3411045074519623e-06, "scale": 563.6169301223755}, "cols": 256, "rows": 256, "dpi": 96, "wkt": "", "x": -400, "y": 400}
  111 +
  112 + lev = 0
  113 + r1 = 0
  114 + r2 = 0
  115 + c1 = 0
  116 + c2 = 0
  117 + while r1 - r2 <1:
  118 + lev += 1
  119 + # 左下角所在瓦片
  120 + r1,c1 = get_rc(scheme,lev, extent[0],extent[2])
  121 + # 右上角所在瓦片
  122 + r2,c2 = get_rc(scheme,lev, extent[1],extent[3])
  123 + if lev > 20 :
  124 + break
  125 +
  126 + print(lev)
  127 + # 左下角瓦片的范围
  128 + [lon1, lat1, lon2, lat2] = get_polygon(scheme, lev, r1, c1)
  129 + # 右上角角瓦片的范围
  130 + [lon12, lat12, lon22, lat22] = get_polygon(scheme, lev, r2, c2)
  131 +
  132 + # 瓦片拼接底图
  133 + dat = numpy.zeros(((r1 - r2 + 1) * 256, (c2 - c1 + 1) * 256, 3), dtype=int)
  134 +
  135 +
  136 + # x偏移量
  137 + offx = (extent[0] - lon1) / ((lon22 - lon1) / ((c2 - c1 + 1) * 256))
  138 + # x方向像素量
  139 + xnum = (extent[1] - extent[0]) / ((lon22 - lon1) / ((c2 - c1 + 1) * 256))
  140 +
  141 + # y偏移量
  142 + offy = (lat22 - extent[3]) / ((lat22 - lat1) / ((r1 - r2 + 1) * 256))
  143 + # y方向像素量
  144 + ynum = (extent[3] - extent[2]) / ((lat22 - lat1) / ((r1 - r2 + 1) * 256))
  145 + # 拼接瓦片
  146 + for r in range(r2, r1 + 1):
  147 + for c in range(c1, c2 + 1):
  148 +
  149 + url = url_format.format(lev, c, r)
  150 + dataset: Dataset = gdal.Open(url, 0)
  151 +
  152 + if dataset.RasterCount==1:
  153 + continue
  154 +
  155 + for b in range(1, 4):
  156 + band: Band = dataset.GetRasterBand(b)
  157 +
  158 + dat[(r - r2) * 256:(r - r2 + 1) * 256, (c - c1) * 256: (c - c1 + 1) * 256,
  159 + 2 - (b - 1)] = band.ReadAsArray(0, 0, 256, 256)
  160 +
  161 + dat2 = dat[int(offy):int(offy + ynum), int(offx):int(offx + xnum), :]
  162 + #裁剪
  163 + cv2.imwrite("overwmts.jpg", dat2, [cv2.IMWRITE_JPEG_QUALITY, 30])
  164 +
  165 +if __name__ == '__main__':
  166 +
  167 + tms_overview([107.78981494180618, 120.43553603935675, 18.870480519260582, 25.999868757737033],"http://172.26.99.160:6060/DMap/Services/GDMap/TileServer/TMSService"
  168 + )
  169 + wmts_url = "http://172.26.99.160:6060/DMap/Services/tile/TileServer/WMTSService?layer=&style=default&tilematrixset=nativeTileMatrixSet&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fpng&TileMatrix={}&TileCol={}&TileRow={}"
  170 + wmts_overview([107.78981494180618, 120.43553603935675, 18.870480519260582, 25.999868757737033],wmts_url)
\ No newline at end of file
... ...
... ... @@ -8,36 +8,111 @@ from osgeo import gdal
8 8
9 9 from osgeo import gdal, gdalconst
10 10 from osgeo import ogr
  11 +import math
  12 +import requests
  13 +def tms(ytile, zoom):
  14 + n = 2.0 ** zoom
  15 + ytile = n - ytile - 1
  16 + return int(ytile)
  17 +import numpy
  18 +import cv2
  19 +from osgeo import gdal,osr
  20 +from osgeo.gdal import *
11 21
12   -rasterFile = 'F:/**0416.dat' # 原影像
13   -shpFile = 'F:/**小麦.shp' # 裁剪矩形
  22 +# Math functions taken from https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames #spellok
  23 +def deg2num(lat_deg, lon_deg, zoom):
  24 + lat_rad = math.radians(lat_deg)
  25 + n = 2.0 ** zoom
  26 + xtile = int((lon_deg + 180.0) / 360.0 * n)
  27 + ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
  28 + return (xtile, ytile)
14 29
15   -dataset = gdal.Open(rasterFile, gdalconst.GA_ReadOnly)
  30 +def num2deg(xtile, ytile, zoom):
  31 + n = 2.0 ** zoom
  32 + lon_deg = xtile / n * 360.0 - 180.0
  33 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
  34 + lat_deg = math.degrees(lat_rad)
  35 + return (lat_deg, lon_deg)
16 36
17   -geo_transform = dataset.GetGeoTransform()
18   -cols = dataset.RasterXSize # 列数
19   -rows = dataset.RasterYSize # 行数
  37 +def create_image(cls,image_type, pixel_array, quality):
20 38
21   -x_min = geo_transform[0]
22   -y_min = geo_transform[3]
23   -pixel_width = geo_transform[1]
  39 + if image_type.__eq__("image/jpeg") or image_type.__eq__("image/jpg"):
  40 + r, buf = cv2.imencode(".jpg", pixel_array, [cv2.IMWRITE_JPEG_QUALITY, quality])
  41 + image_out = buf.tobytes()
  42 + else:
  43 + height, width = pixel_array[:, :, 0].shape
  44 + four = numpy.zeros((height,width), dtype=int) + 255
  45 + four[pixel_array[:, :, 0] == 65536] = 0
  46 + r, buf = cv2.imencode(".png", numpy.dstack((pixel_array, four)))
  47 + image_out = buf.tobytes()
  48 + return image_out
24 49
25   -shp = ogr.Open(shpFile, 0)
26   -m_layer = shp.GetLayerByIndex(0)
  50 +if __name__ == '__main__':
27 51
28   -target_ds = gdal.GetDriverByName('MEM').Create("", xsize=cols, ysize=rows, bands=1,
29   - eType=gdal.GDT_Byte)
30   -target_ds.SetGeoTransform(geo_transform)
31   -target_ds.SetProjection(dataset.GetProjection())
32 52
33   -band = target_ds.GetRasterBand(1)
34   -band.SetNoDataValue(0)
35   -band.FlushCache()
36   -gdal.RasterizeLayer(target_ds, [1], m_layer) # 跟shp字段给栅格像元赋值
  53 +
  54 +
  55 + lev = 8
  56 + extent = [107.78981494180618, 120.43553603935675, 18.870480519260582, 25.999868757737033]
  57 + url = "http://172.26.99.160:6060/DMap/Services/GDMap/TileServer/TMSService"
  58 +
  59 +
  60 +
  61 + if extent[3] - extent[2] > extent[1] - extent[0]:
  62 + offset = ((extent[3] - extent[2]) - (extent[1] - extent[0])) / 2.0
  63 + out_extent = [extent[0]- offset, extent[1]+offset , extent[2], extent[3] ]
  64 + else:
  65 + offset = ((extent[1] - extent[0]) - (extent[3] - extent[2])) / 2.0
  66 + out_extent = [extent[0] , extent[1], extent[2] - offset, extent[3] + offset]
  67 +
  68 + c1,r1 = deg2num(18.870480519260582,107.78981494180618,lev)
  69 + c2,r2 = deg2num(25.999868757737033, 120.43553603935675, lev)
  70 +
  71 + print(r1 - r2)
  72 + print(c2 - c1)
  73 +
  74 + lat1, lon1 = num2deg(c1, r1, lev)
  75 + lat2, lon2 = num2deg(c1+1, r1+1, lev)
  76 + print( [lon1, lat2, lon2, lat1])
  77 +
  78 + lat3, lon3 = num2deg(c2, r2, lev)
  79 + lat4, lon4 = num2deg(c2+1, r2+1, lev)
  80 + print( [lon3, lat4, lon4, lat3])
  81 +
  82 + dat = numpy.zeros(((r1 - r2+1)*256, (c2 - c1+1)*256, 3), dtype=int) + 256
  83 +
  84 +
  85 + offx = (extent[0]-lon1)/((lon4-lon1)/((c2 - c1+1)*256))
  86 +
  87 + xnum = (extent[1]-extent[0])/((lon4-lon1)/((c2 - c1+1)*256))
  88 +
  89 + print(offx)
  90 + print(xnum)
  91 +
  92 + offy = (lat3 - extent[3])/((lat3-lat2)/((r1 - r2+1)*256))
  93 + ynum = (extent[3]-extent[2])/((lat3-lat2)/((r1 - r2+1)*256))
  94 + print(offy)
  95 + print(ynum)
  96 +
  97 +
  98 + for r in range(r2,r1+1):
  99 + for c in range(c1,c2+1):
  100 + url = "http://172.26.99.160:6060/DMap/Services/GDMap/TileServer/TMSService/{}/{}/{}.png".format(lev,c,r)
  101 + dataset:Dataset = gdal.Open(url, 0)
  102 + for b in range(1,4):
  103 + band:Band = dataset.GetRasterBand(b)
  104 + zaa = (r - r2)*256
  105 + zbb = (c - c1)*256
  106 + zcc = (r - r2+1)*256
  107 + zdd = (c - c1+1)*256
  108 +
  109 + dat[(r - r2)*256:(r - r2+1)*256,(c - c1)*256 : (c - c1+1)*256, 2-(b-1)] = band.ReadAsArray(0,0,256,256)
  110 +
  111 +
  112 + dat2 = dat[int(offy):int(offy+ynum),int(offx):int(offx+xnum),:]
  113 +
  114 + cv2.imwrite("t.jpg", dat, [cv2.IMWRITE_JPEG_QUALITY, 30])
  115 + cv2.imwrite("t2.jpg", dat2, [cv2.IMWRITE_JPEG_QUALITY, 30])
37 116
38 117
39 118
40   -# gdal.RasterizeLayer(target_ds, [1], m_layer) # 多边形内像元值的全是255
41   -del dataset
42   -del target_ds
43   -shp.Release()
... ...
注册登录 后发表评论