image_overview.py 4.0 KB
# 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.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": {
                    }
                }
            }
        }
    }