image_refresh.py 4.4 KB
# coding=utf-8
#author:        4N
#createtime:    2021/7/19
#email:         nheweijun@sina.com


from osgeo import gdal,osr
from osgeo.gdal import Dataset,Band
from app.util.component.ApiTemplate import ApiTemplate
from app.modules.service.image.util.ThriftConnect import ThriftConnect
import json
from ..models import Image
import datetime
from app.models import  db
import uuid
import os
from .util.ImageType import ImageType
from .util.Cache import Cache

class Api(ApiTemplate):

    api_name = "refresh影像数据"

    def process(self):

        #可以注册一个目录
        #返回结果
        res = {}

        try:
            guid = self.para.get("guid")
            image:Image = Image.query.filter_by(guid=guid).one_or_none()

            image_service_info, zoo, servers = Cache.cache_data(None)
            image_servers = image.server.split(",")
            image_servers = [ser for ser in image_servers if ser in servers]

            data_server = image_servers[0]


            if data_server.__eq__("本地服务器"):

                img: Dataset = gdal.Open(image.path, 0)
                geo = img.GetGeoTransform()

                origin = osr.SpatialReference()
                origin.ImportFromWkt(img.GetProjection())

                authority_code = origin.GetAuthorityCode(None)
                band_count = img.RasterCount
                band: Band = img.GetRasterBand(1)
                count = band.GetOverviewCount()
                nodatavalue = band.GetNoDataValue()
                left_top = (geo[0], geo[3])

                right_buttom = (geo[0] + geo[1] * img.RasterXSize, geo[3] + geo[5] * img.RasterYSize)
                origin_extent = [left_top[0], right_buttom[1], right_buttom[0], left_top[1]]

                update_info = {"band_count": band_count,
                        "band_view":image.band_view if band_count>=3 else "[1,1,1]",
                        "overview_count": count,
                        "raster_x_size": image.RasterXSize,
                        "raster_y_size": image.RasterYSize,
                        "cell_x_size": geo[1],
                        "cell_y_size": geo[5],
                        "extent": origin_extent,
                        "null_value": nodatavalue,
                        "size":os.path.getsize(image.path),
                        "crs_wkt": image.GetProjection(),
                        "crs": authority_code,
                        "crs_proj4": origin.ExportToProj4(),
                        "update_time":datetime.datetime.now()
                        }

                del img

            else:
                thrift_connect = ThriftConnect(data_server)

                info = json.loads(thrift_connect.client.getInfo(image.path))
                thrift_connect.close()

                update_info = {"band_count": info.get("band_count"),
                        "band_view":image.band_view if info.get("band_count")>=3 else "[1,1,1]",
                        "overview_count": info.get("overview_count"),
                        "raster_x_size" : info["xy_size"][0],
                        "raster_y_size" : info["xy_size"][1],
                        "cell_x_size" : info.get("cell_x_size"),
                        "cell_y_size" : abs(info.get("cell_y_size")),
                        "extent": json.dumps(info["origin_extent"]),
                        "null_value": info.get("null_value"),
                        "size":info.get("size"),
                        "crs" : str(info.get("crs")),
                        "crs_wkt" : info.get("crs_wkt"),
                        "crs_proj4" : info.get("crs_proj4"),
                        "update_time":datetime.datetime.now()
                        }
            Image.query.filter_by(guid=guid).update(update_info)
            db.session.commit()
        except:
            raise Exception("刷新影像数据信息失败!")

        res["result"] = True
        return res

    api_doc = {
        "tags": ["影像接口"],
        "parameters": [
            {"name": "guid",
             "in": "formData",
             "type": "string",
             "description": "image_guid"},
        ],
        "responses": {
            200: {
                "schema": {
                    "properties": {
                    }
                }
            }
        }
    }