image_overview.py
4.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# coding=utf-8
#author: 4N
#createtime: 2021/7/19
#email: nheweijun@sina.com
from app.util.component.ApiTemplate import ApiTemplate
from app.util.component.StructuredPrint import StructurePrint
from app.modules.service.image.models import Image
import random
import numpy
import json
from flask import Response
from kazoo.client import KazooClient
import configure
import traceback
from .util.ImageData import ImageData
from .util.Opencv import Opencv
class Api(ApiTemplate):
api_name = "影像数据预览功能"
def process(self):
from app import GLOBAL_DIC
# 返回结果
res = {}
try:
#获取
zoo = GLOBAL_DIC.get("zookeeper")
if zoo is None:
zoo :KazooClient = KazooClient(hosts=configure.zookeeper, timeout=100)
zoo.start()
GLOBAL_DIC["zookeeper"] = zoo
StructurePrint().print("连接zoo")
else :
if not zoo.connected:
zoo.start()
guid = self.para.get("guid")
width = int(self.para.get("width") if self.para.get("width") else 512)
height = int(self.para.get("height") if self.para.get("height") else 512)
format = self.para.get("format") if self.para.get("format") else "image/jpeg"
image = Image.query.filter_by(guid=guid).one_or_none()
# 该影像的服务器,随机选取一个
image_servers = image.server.split(",")
image_servers = [ser for ser in image_servers if zoo.exists("/rpc/{}".format(ser)) or ser.__eq__("本地服务器") ]
if len(image_servers) > 0:
indx = int(random.random() * len(image_servers))
image_server = image_servers[indx]
else:
image_server = "None"
bands = json.loads(image.band_view)
#计算查询范围,保持正常比例
query_extent = json.loads(image.extent)
if query_extent[2]-query_extent[0] > query_extent[3]-query_extent[1]:
offset = ((query_extent[2]-query_extent[0]) - (query_extent[3]-query_extent[1])) / 2.0
query_extent = [query_extent[0],query_extent[1] - offset ,query_extent[2],query_extent[3] + offset]
else:
offset = ((query_extent[3] - query_extent[1]) - (query_extent[2] - query_extent[0])) / 2.0
query_extent = [query_extent[0] - offset, query_extent[1], query_extent[2] + offset, query_extent[3]]
image_data = ImageData(image_server, image)
pixel_array_t = image_data.get_data(query_extent, bands, height, width)
pixel_array = numpy.zeros((height, width, 3), dtype=int)
for ii in [0, 1, 2]:
# opencv 颜色排序为BGR
pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
# 将图片生成在内存中,然后直接返回response
im_data = Opencv.create_image(format, pixel_array, 30)
except Exception as e:
StructurePrint().print(traceback.format_exc())
raise e
return Response(im_data, mimetype=format)
api_doc = {
"tags": ["影像接口"],
"parameters": [
{"name": "guid",
"in": "formData",
"type": "string"},
{"name": "height",
"in": "formData",
"type": "string"},
{"name": "width",
"in": "formData",
"type": "string"},
{"name": "format",
"in": "formData",
"type": "string",
"enum":["image/jpeg","image/png"]},
],
"responses": {
200: {
"schema": {
"properties": {
}
}
}
}
}