image_overview.py
3.5 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
# 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
from sqlalchemy import or_
import random
from .image_wms import Api as WMSApi
import numpy
import json
from flask import Response
from kazoo.client import KazooClient
import configure
import traceback
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")
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"
wms_api = WMSApi()
bands = json.loads(image.band_view)
# bands = [1,2,3] if image.band_count>=3 else [1,1,1]
#计算查询范围,保持正常比例
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]]
pixel_array_t = wms_api.get_data(image_server, image, query_extent, bands, 256, 256)
pixel_array = numpy.zeros((256, 256, 3), dtype=int)
for ii in [0, 1, 2]:
# opencv 颜色排序为GBR
pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii]
# 将图片生成在内存中,然后直接返回response
im_data = wms_api.create_by_opencv("image/jpeg", pixel_array, 30)
return Response(im_data, mimetype="image/jpeg")
except Exception as e:
StructurePrint().print(traceback.format_exc())
res["state"] = -1
res["message"] = e.__str__()
return res
api_doc = {
"tags": ["影像接口"],
"parameters": [
{"name": "guid",
"in": "formData",
"type": "string"},
],
"responses": {
200: {
"schema": {
"properties": {
}
}
}
}
}