image_overview.py 3.2 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.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(",")
            indx = int(random.random() * len(image_servers))
            image_server = image_servers[indx]
            wms_api = WMSApi()

            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(zoo, 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": {
                    }
                }
            }
        }
    }