正在显示
69 个修改的文件
包含
3199 行增加
和
305 行删除
| ... | ... | @@ -44,6 +44,9 @@ def create_app(): |
| 44 | 44 | :return:app,flask实例 |
| 45 | 45 | """ |
| 46 | 46 | |
| 47 | + # 上下文全局变量字典 | |
| 48 | + global GLOBAL_DIC | |
| 49 | + | |
| 47 | 50 | # app基本设置 |
| 48 | 51 | app = Flask(__name__) |
| 49 | 52 | app.config['SQLALCHEMY_DATABASE_URI'] = configure.SQLALCHEMY_DATABASE_URI |
| ... | ... | @@ -96,15 +99,14 @@ def create_app(): |
| 96 | 99 | # 入库监测线程 |
| 97 | 100 | @app.before_first_request |
| 98 | 101 | def data_entry_process(): |
| 99 | - StructurePrint.print("start listen") | |
| 102 | + StructurePrint().print("start listen") | |
| 100 | 103 | process = threading.Thread(target=data_entry_center) |
| 101 | 104 | process.start() |
| 102 | 105 | |
| 103 | 106 | # 不检测https |
| 104 | 107 | os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' |
| 105 | 108 | |
| 106 | - # 上下文全局变量字典 | |
| 107 | - global GLOBAL_DIC | |
| 109 | + | |
| 108 | 110 | |
| 109 | 111 | return app |
| 110 | 112 | ... | ... |
| ... | ... | @@ -11,7 +11,7 @@ import datetime |
| 11 | 11 | |
| 12 | 12 | from app.util.component.PGUtil import PGUtil |
| 13 | 13 | import glob |
| 14 | - | |
| 14 | +import traceback | |
| 15 | 15 | class DES(): |
| 16 | 16 | ''' |
| 17 | 17 | DES密码加解密 |
| ... | ... | @@ -33,21 +33,6 @@ class DES(): |
| 33 | 33 | |
| 34 | 34 | db = SQLAlchemy() |
| 35 | 35 | |
| 36 | -# 动态加载Model | |
| 37 | -current_dir = os.path.abspath(os.path.dirname(__file__)) | |
| 38 | -pkgs = list(glob.glob('%s/modules/*/models' % (current_dir))) | |
| 39 | -pkgs.extend(list(glob.glob('%s/modules/*/*/models' % (current_dir)))) | |
| 40 | - | |
| 41 | -for pkg in pkgs : | |
| 42 | - pkg = os.path.normpath(pkg) | |
| 43 | - node_list = pkg.split(os.path.sep) | |
| 44 | - pkg_name = ".".join(node_list[node_list.index("app"):]) | |
| 45 | - try: | |
| 46 | - __import__(pkg_name) | |
| 47 | - except: | |
| 48 | - pass | |
| 49 | - | |
| 50 | - | |
| 51 | 36 | |
| 52 | 37 | class Table(db.Model): |
| 53 | 38 | ''' |
| ... | ... | @@ -268,4 +253,21 @@ class TileScheme(db.Model): |
| 268 | 253 | dpi = Column(Integer) |
| 269 | 254 | rows = Column(Integer) |
| 270 | 255 | cols = Column(Integer) |
| 271 | - update_time = Column(DateTime) | |
| \ No newline at end of file | ||
| 256 | + update_time = Column(DateTime) | |
| 257 | + | |
| 258 | + parameter = Column(Text) | |
| 259 | + | |
| 260 | +# 动态加载Model | |
| 261 | +current_dir = os.path.abspath(os.path.dirname(__file__)) | |
| 262 | +pkgs = list(glob.glob('%s/modules/*/models' % (current_dir))) | |
| 263 | +pkgs.extend(list(glob.glob('%s/modules/*/*/models' % (current_dir)))) | |
| 264 | + | |
| 265 | +for pkg in pkgs : | |
| 266 | + pkg = os.path.normpath(pkg) | |
| 267 | + node_list = pkg.split(os.path.sep) | |
| 268 | + pkg_name = ".".join(node_list[node_list.index("app"):]) | |
| 269 | + try: | |
| 270 | + __import__(pkg_name) | |
| 271 | + except Exception as e: | |
| 272 | + print(traceback.format_exc()) | |
| 273 | + pass | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -121,7 +121,7 @@ class Api(ApiTemplate): |
| 121 | 121 | |
| 122 | 122 | # 没有权限的表跳过 |
| 123 | 123 | if not PGUtil.check_table_privilege(l_name,"SELECT",db_tuple[0],pg_ds): |
| 124 | - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0],l_name),"warn") | |
| 124 | + StructurePrint().print("用户{}对表{}没有select权限!".format(db_tuple[0],l_name),"warn") | |
| 125 | 125 | continue |
| 126 | 126 | |
| 127 | 127 | # 范围统计和数量统计以100w为界限 |
| ... | ... | @@ -174,7 +174,7 @@ class Api(ApiTemplate): |
| 174 | 174 | |
| 175 | 175 | spatial_table_name.append(layer.GetName()) |
| 176 | 176 | except: |
| 177 | - StructurePrint.print("表{}注册失败!".format(l_name), "warn") | |
| 177 | + StructurePrint().print("表{}注册失败!".format(l_name), "warn") | |
| 178 | 178 | continue |
| 179 | 179 | return spatial_table_name,tables |
| 180 | 180 | |
| ... | ... | @@ -193,7 +193,7 @@ class Api(ApiTemplate): |
| 193 | 193 | |
| 194 | 194 | # 没有权限的表跳过 |
| 195 | 195 | if not SQLUtil.check_table_privilege(table_name, "SELECT", db_tuple[0], db_session): |
| 196 | - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0],table_name), "warn") | |
| 196 | + StructurePrint().print("用户{}对表{}没有select权限!".format(db_tuple[0],table_name), "warn") | |
| 197 | 197 | continue |
| 198 | 198 | |
| 199 | 199 | table_guid = uuid.uuid1().__str__() |
| ... | ... | @@ -248,7 +248,7 @@ class Api(ApiTemplate): |
| 248 | 248 | |
| 249 | 249 | # 没有权限的表跳过 |
| 250 | 250 | # if not PGUtil.check_table_privilege(l_name, "SELECT", db_tuple[0], pg_ds): |
| 251 | - # StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | |
| 251 | + # StructurePrint().print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | |
| 252 | 252 | # continue |
| 253 | 253 | |
| 254 | 254 | base_layer_name=l_name.split("_vacuate_")[1] | ... | ... |
| ... | ... | @@ -43,7 +43,7 @@ def data_entry_center(): |
| 43 | 43 | for process in remove_process: |
| 44 | 44 | running_dict.pop(process) |
| 45 | 45 | |
| 46 | - # StructurePrint.print("listening...") | |
| 46 | + # StructurePrint().print("listening...") | |
| 47 | 47 | |
| 48 | 48 | # 入库进程少于阈值,开启入库进程 |
| 49 | 49 | |
| ... | ... | @@ -58,7 +58,7 @@ def data_entry_center(): |
| 58 | 58 | |
| 59 | 59 | try: |
| 60 | 60 | parameter = json.loads(ready_task.parameter) |
| 61 | - StructurePrint.print("检测到入库任务") | |
| 61 | + StructurePrint().print("检测到入库任务") | |
| 62 | 62 | ready_task.state = 2 |
| 63 | 63 | ready_task.process = "入库中" |
| 64 | 64 | sys_session.commit() |
| ... | ... | @@ -104,10 +104,10 @@ def data_entry_center(): |
| 104 | 104 | sys_session.query(Task).filter_by(guid=ready_task.guid).update( |
| 105 | 105 | {"state": -1, "process": "入库失败"}) |
| 106 | 106 | sys_session.commit() |
| 107 | - StructurePrint.print(e.__str__(), "error") | |
| 107 | + StructurePrint().print(e.__str__(), "error") | |
| 108 | 108 | else: |
| 109 | 109 | # 解表啊 |
| 110 | 110 | sys_session.commit() |
| 111 | 111 | except Exception as e: |
| 112 | 112 | sys_session.commit() |
| 113 | - StructurePrint.print(e.__str__(), "error") | |
| \ No newline at end of file | ||
| 113 | + StructurePrint().print(e.__str__(), "error") | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -199,7 +199,7 @@ class Api(ApiTemplate): |
| 199 | 199 | |
| 200 | 200 | # 没有权限的表跳过 |
| 201 | 201 | if not PGUtil.check_table_privilege(l_name, "SELECT", db_tuple[0], pg_ds): |
| 202 | - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | |
| 202 | + StructurePrint().print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | |
| 203 | 203 | continue |
| 204 | 204 | |
| 205 | 205 | |
| ... | ... | @@ -224,11 +224,11 @@ class Api(ApiTemplate): |
| 224 | 224 | ext = [round(e, 2) for e in ext] |
| 225 | 225 | extent = "{},{},{},{}".format(ext[0], ext[1], ext[2], ext[3]) |
| 226 | 226 | |
| 227 | - StructurePrint.print("空间表增加!") | |
| 227 | + StructurePrint().print("空间表增加!") | |
| 228 | 228 | |
| 229 | 229 | geom_type = GeometryAdapter.get_geometry_type(layer) |
| 230 | 230 | except: |
| 231 | - StructurePrint.print("表{}注册失败!".format(l_name), "warn") | |
| 231 | + StructurePrint().print("表{}注册失败!".format(l_name), "warn") | |
| 232 | 232 | continue |
| 233 | 233 | |
| 234 | 234 | table_guid = uuid.uuid1().__str__() |
| ... | ... | @@ -304,7 +304,7 @@ class Api(ApiTemplate): |
| 304 | 304 | |
| 305 | 305 | # 删除表 |
| 306 | 306 | if table.name not in db_tables_names: |
| 307 | - StructurePrint.print("空间表减少!") | |
| 307 | + StructurePrint().print("空间表减少!") | |
| 308 | 308 | sys_session.delete(table) |
| 309 | 309 | # 修改表 |
| 310 | 310 | else: |
| ... | ... | @@ -320,7 +320,7 @@ class Api(ApiTemplate): |
| 320 | 320 | |
| 321 | 321 | # 没有权限的表跳过 |
| 322 | 322 | if not PGUtil.check_table_privilege(l_name, "SELECT", db_tuple[0], pg_ds): |
| 323 | - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | |
| 323 | + StructurePrint().print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | |
| 324 | 324 | sys_session.delete(table) |
| 325 | 325 | continue |
| 326 | 326 | |
| ... | ... | @@ -336,7 +336,7 @@ class Api(ApiTemplate): |
| 336 | 336 | db_columns_names.append(field_name) |
| 337 | 337 | |
| 338 | 338 | if field_name not in columns_names: |
| 339 | - StructurePrint.print("{}空间表属性增加!".format(table.name)) | |
| 339 | + StructurePrint().print("{}空间表属性增加!".format(table.name)) | |
| 340 | 340 | field_alias = field_name if field_defn.GetAlternativeName() is None or field_defn.GetAlternativeName().__eq__( |
| 341 | 341 | "") else field_defn.GetAlternativeName() |
| 342 | 342 | column = Columns(guid=uuid.uuid1().__str__(), table_guid=table.guid, |
| ... | ... | @@ -347,7 +347,7 @@ class Api(ApiTemplate): |
| 347 | 347 | # 删除列 |
| 348 | 348 | for column in columns: |
| 349 | 349 | if column.name not in db_columns_names: |
| 350 | - StructurePrint.print("{}空间表属性减少!".format(table.name)) | |
| 350 | + StructurePrint().print("{}空间表属性减少!".format(table.name)) | |
| 351 | 351 | sys_session.delete(column) |
| 352 | 352 | |
| 353 | 353 | # 范围统计和数量统计以100w为界限 |
| ... | ... | @@ -373,7 +373,7 @@ class Api(ApiTemplate): |
| 373 | 373 | |
| 374 | 374 | # 修改要素量 |
| 375 | 375 | if not table.feature_count.__eq__(feature_count): |
| 376 | - StructurePrint.print("{}空间表要素!".format(table.name)) | |
| 376 | + StructurePrint().print("{}空间表要素!".format(table.name)) | |
| 377 | 377 | sys_session.query(Table).filter_by(guid=table.guid).update({"feature_count": feature_count, |
| 378 | 378 | "extent": extent}) |
| 379 | 379 | |
| ... | ... | @@ -381,13 +381,13 @@ class Api(ApiTemplate): |
| 381 | 381 | def add_common_table(self,data_session,sys_session,database_guid,real_common_tables_name,origin_common_tables_name,this_time,db_tuple): |
| 382 | 382 | for table_name in real_common_tables_name: |
| 383 | 383 | if table_name not in origin_common_tables_name: |
| 384 | - StructurePrint.print("{}非空间表增加!".format(table_name)) | |
| 384 | + StructurePrint().print("{}非空间表增加!".format(table_name)) | |
| 385 | 385 | table_guid = uuid.uuid1().__str__() |
| 386 | 386 | |
| 387 | 387 | |
| 388 | 388 | # 没有权限的表跳过 |
| 389 | 389 | if not SQLUtil.check_table_privilege(table_name, "SELECT", db_tuple[0], data_session): |
| 390 | - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], table_name), "warn") | |
| 390 | + StructurePrint().print("用户{}对表{}没有select权限!".format(db_tuple[0], table_name), "warn") | |
| 391 | 391 | continue |
| 392 | 392 | |
| 393 | 393 | count = data_session.execute('select count(*) from "{}"'.format(table_name)).fetchone()[0] |
| ... | ... | @@ -435,14 +435,14 @@ class Api(ApiTemplate): |
| 435 | 435 | tables = sys_session.query(Table).filter_by(name=table_name).filter_by(database_guid=database_guid).all() |
| 436 | 436 | for table in tables: |
| 437 | 437 | if table_name not in real_common_tables_name: |
| 438 | - StructurePrint.print("{}非空间表减少!".format(table_name)) | |
| 438 | + StructurePrint().print("{}非空间表减少!".format(table_name)) | |
| 439 | 439 | sys_session.delete(table) |
| 440 | 440 | # 修改表 |
| 441 | 441 | else: |
| 442 | 442 | |
| 443 | 443 | # 没有权限的表删除 |
| 444 | 444 | if not SQLUtil.check_table_privilege(table_name, "SELECT", db_tuple[0], data_session): |
| 445 | - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], table_name), "warn") | |
| 445 | + StructurePrint().print("用户{}对表{}没有select权限!".format(db_tuple[0], table_name), "warn") | |
| 446 | 446 | sys_session.delete(table) |
| 447 | 447 | continue |
| 448 | 448 | |
| ... | ... | @@ -471,7 +471,7 @@ class Api(ApiTemplate): |
| 471 | 471 | # 属性增加 |
| 472 | 472 | for col in real_cols_name: |
| 473 | 473 | if col not in columns_names: |
| 474 | - StructurePrint.print("{}表要素属性增加!".format(table_name)) | |
| 474 | + StructurePrint().print("{}表要素属性增加!".format(table_name)) | |
| 475 | 475 | column = Columns(guid=uuid.uuid1().__str__(), table_guid=table.guid, |
| 476 | 476 | name=col, create_time=this_time, update_time=this_time) |
| 477 | 477 | sys_session.add(column) |
| ... | ... | @@ -479,7 +479,7 @@ class Api(ApiTemplate): |
| 479 | 479 | # 属性减少 |
| 480 | 480 | for column in columns: |
| 481 | 481 | if column.name not in real_cols_name: |
| 482 | - StructurePrint.print("{}表要素属性减少!".format(table_name)) | |
| 482 | + StructurePrint().print("{}表要素属性减少!".format(table_name)) | |
| 483 | 483 | sys_session.delete(column) |
| 484 | 484 | |
| 485 | 485 | # 修改要素量 |
| ... | ... | @@ -489,7 +489,7 @@ class Api(ApiTemplate): |
| 489 | 489 | count = SQLUtil.get_table_count(table_name,data_session) |
| 490 | 490 | |
| 491 | 491 | if not table.feature_count.__eq__(count): |
| 492 | - StructurePrint.print("{}表要素变化!".format(table_name)) | |
| 492 | + StructurePrint().print("{}表要素变化!".format(table_name)) | |
| 493 | 493 | sys_session.query(Table).filter_by(guid=table.guid).update({"feature_count": count}) |
| 494 | 494 | |
| 495 | 495 | ... | ... |
| ... | ... | @@ -126,7 +126,7 @@ class Api(ApiTemplate): |
| 126 | 126 | # try: |
| 127 | 127 | # pg_ds.DeleteLayer(tv.name) |
| 128 | 128 | # except Exception as e : |
| 129 | - # StructurePrint.print("抽稀图层不存在!","warn") | |
| 129 | + # StructurePrint().print("抽稀图层不存在!","warn") | |
| 130 | 130 | |
| 131 | 131 | # 创建抽稀过程 |
| 132 | 132 | options = ["OVERWRITE=yes", "GEOMETRY_NAME={}".format(PGUtil.get_geo_column(table.name,pg_session)), |
| ... | ... | @@ -257,7 +257,7 @@ class VacuateProcess: |
| 257 | 257 | p_x = (extent[1]-extent[0])/10.0 |
| 258 | 258 | p_y = (extent[3] - extent[2]) / 10.0 |
| 259 | 259 | fill_precent=0 |
| 260 | - StructurePrint.print("判断疏密") | |
| 260 | + StructurePrint().print("判断疏密") | |
| 261 | 261 | for ix in range(10): |
| 262 | 262 | for iy in range(10): |
| 263 | 263 | grid_extent = [extent[0]+ix*p_x,extent[0]+ix*p_x+p_x,extent[2]+iy*p_y,extent[2]+iy*p_y+p_y] |
| ... | ... | @@ -270,7 +270,7 @@ class VacuateProcess: |
| 270 | 270 | fill_precent += 1 |
| 271 | 271 | |
| 272 | 272 | print(fill_precent) |
| 273 | - StructurePrint.print("判断疏密结束") | |
| 273 | + StructurePrint().print("判断疏密结束") | |
| 274 | 274 | |
| 275 | 275 | layer.SetSpatialFilter(None) |
| 276 | 276 | layer.ResetReading() | ... | ... |
| ... | ... | @@ -66,7 +66,7 @@ class Api(ApiTemplate): |
| 66 | 66 | p_x = (extent[1] - extent[0]) / 10.0 |
| 67 | 67 | p_y = (extent[3] - extent[2]) / 10.0 |
| 68 | 68 | fill_precent = 0 |
| 69 | - StructurePrint.print("判断疏密") | |
| 69 | + StructurePrint().print("判断疏密") | |
| 70 | 70 | for ix in range(10): |
| 71 | 71 | for iy in range(10): |
| 72 | 72 | grid_extent = [extent[0] + ix * p_x, extent[0] + ix * p_x + p_x, extent[2] + iy * p_y, |
| ... | ... | @@ -80,7 +80,7 @@ class Api(ApiTemplate): |
| 80 | 80 | fill_precent += 1 |
| 81 | 81 | |
| 82 | 82 | print(fill_precent) |
| 83 | - StructurePrint.print("判断疏密结束") | |
| 83 | + StructurePrint().print("判断疏密结束") | |
| 84 | 84 | |
| 85 | 85 | layer.SetSpatialFilter(None) |
| 86 | 86 | layer.ResetReading() | ... | ... |
| ... | ... | @@ -6,10 +6,13 @@ import hashlib |
| 6 | 6 | from flask import current_app as app |
| 7 | 7 | import socket |
| 8 | 8 | |
| 9 | + | |
| 9 | 10 | from app.util.component.ApiTemplate import ApiTemplate |
| 11 | +from app.util.component.StructuredPrint import StructurePrint | |
| 10 | 12 | class Api(ApiTemplate): |
| 11 | 13 | |
| 12 | 14 | def process(self): |
| 15 | + StructurePrint().print("test") | |
| 13 | 16 | return {"Name":socket.gethostname(),"Type":"DMapDMS"} |
| 14 | 17 | |
| 15 | 18 | api_doc={ | ... | ... |
| ... | ... | @@ -10,12 +10,6 @@ from . import service_register |
| 10 | 10 | from . import service_type |
| 11 | 11 | from . import service_list |
| 12 | 12 | from . import service_delete |
| 13 | -from . import catalog_create | |
| 14 | -from . import catalog_delete | |
| 15 | -from . import catalog_edit | |
| 16 | -from . import catalog_tree | |
| 17 | -from . import catalog_next | |
| 18 | -from . import catalog_real_tree | |
| 19 | 13 | import os |
| 20 | 14 | from flask import send_from_directory |
| 21 | 15 | |
| ... | ... | @@ -61,69 +55,6 @@ class DataManager(BlueprintApi): |
| 61 | 55 | """ |
| 62 | 56 | return service_delete.Api().result |
| 63 | 57 | |
| 64 | - @staticmethod | |
| 65 | - @bp.route('/CatalogCreate', methods=['POST']) | |
| 66 | - @swag_from(catalog_create.Api.api_doc) | |
| 67 | - def api_catalog_create(): | |
| 68 | - """ | |
| 69 | - 创建服务目录 | |
| 70 | - """ | |
| 71 | - return catalog_create.Api().result | |
| 72 | - | |
| 73 | - @staticmethod | |
| 74 | - @bp.route('/CatalogDelete', methods=['POST']) | |
| 75 | - @swag_from(catalog_delete.Api.api_doc) | |
| 76 | - def api_catalog_delete(): | |
| 77 | - """ | |
| 78 | - 删除服务目录 | |
| 79 | - """ | |
| 80 | - return catalog_delete.Api().result | |
| 81 | - | |
| 82 | - @staticmethod | |
| 83 | - @bp.route('/CatalogEdit', methods=['POST']) | |
| 84 | - @swag_from(catalog_edit.Api.api_doc) | |
| 85 | - def api_catalog_edit(): | |
| 86 | - """ | |
| 87 | - 修改服务目录 | |
| 88 | - """ | |
| 89 | - return catalog_edit.Api().result | |
| 90 | - | |
| 91 | - @staticmethod | |
| 92 | - @bp.route('/CatalogEdit', methods=['POST']) | |
| 93 | - @swag_from(catalog_edit.Api.api_doc) | |
| 94 | - def api_catalog_edit(): | |
| 95 | - """ | |
| 96 | - 修改服务目录 | |
| 97 | - """ | |
| 98 | - return catalog_edit.Api().result | |
| 99 | - | |
| 100 | - @staticmethod | |
| 101 | - @bp.route('/CatalogNext', methods=['POST']) | |
| 102 | - @swag_from(catalog_next.Api.api_doc) | |
| 103 | - def api_catalog_next(): | |
| 104 | - """ | |
| 105 | - 下一级服务目录 | |
| 106 | - """ | |
| 107 | - return catalog_next.Api().result | |
| 108 | - | |
| 109 | - @staticmethod | |
| 110 | - @bp.route('/CatalogTree', methods=['POST']) | |
| 111 | - @swag_from(catalog_tree.Api.api_doc) | |
| 112 | - def api_catalog_tree(): | |
| 113 | - """ | |
| 114 | - 服务目录树 | |
| 115 | - """ | |
| 116 | - return catalog_tree.Api().result | |
| 117 | - | |
| 118 | - @staticmethod | |
| 119 | - @bp.route('/CatalogRealTree', methods=['POST']) | |
| 120 | - @swag_from(catalog_real_tree.Api.api_doc) | |
| 121 | - def api_catalog_real_tree(): | |
| 122 | - """ | |
| 123 | - 服务目录树 | |
| 124 | - """ | |
| 125 | - return catalog_real_tree.Api().result | |
| 126 | - | |
| 127 | 58 | |
| 128 | 59 | @staticmethod |
| 129 | 60 | @bp.route('/Overview/<file>', methods=['GET']) | ... | ... |
app/modules/service/catalog/__init__.py
0 → 100644
| 1 | +# coding=utf-8 | |
| 2 | +#author: 4N | |
| 3 | +#createtime: 2021/9/22 | |
| 4 | +#email: nheweijun@sina.com | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | +# coding=utf-8 | |
| 9 | +#author: 4N | |
| 10 | +#createtime: 2021/9/14 | |
| 11 | +#email: nheweijun@sina.com | |
| 12 | + | |
| 13 | +from flasgger import swag_from | |
| 14 | +from flask import Blueprint | |
| 15 | +from app.util import BlueprintApi | |
| 16 | +from . import catalog_edit, catalog_tree, catalog_delete, catalog_create, catalog_next,catalog_real_tree | |
| 17 | + | |
| 18 | + | |
| 19 | +class DataManager(BlueprintApi): | |
| 20 | + | |
| 21 | + bp = Blueprint("ServiceCatalog", __name__, url_prefix="/API/Service/Catalog") | |
| 22 | + | |
| 23 | + | |
| 24 | + @staticmethod | |
| 25 | + @bp.route('/Create', methods=['POST']) | |
| 26 | + @swag_from(catalog_create.Api.api_doc) | |
| 27 | + def api_catalog_create(): | |
| 28 | + """ | |
| 29 | + 创建服务目录 | |
| 30 | + """ | |
| 31 | + return catalog_create.Api().result | |
| 32 | + | |
| 33 | + @staticmethod | |
| 34 | + @bp.route('/Delete', methods=['POST']) | |
| 35 | + @swag_from(catalog_delete.Api.api_doc) | |
| 36 | + def api_catalog_delete(): | |
| 37 | + """ | |
| 38 | + 删除服务目录 | |
| 39 | + """ | |
| 40 | + return catalog_delete.Api().result | |
| 41 | + | |
| 42 | + @staticmethod | |
| 43 | + @bp.route('/Edit', methods=['POST']) | |
| 44 | + @swag_from(catalog_edit.Api.api_doc) | |
| 45 | + def api_catalog_edit(): | |
| 46 | + """ | |
| 47 | + 修改服务目录 | |
| 48 | + """ | |
| 49 | + return catalog_edit.Api().result | |
| 50 | + | |
| 51 | + | |
| 52 | + @staticmethod | |
| 53 | + @bp.route('/Next', methods=['POST']) | |
| 54 | + @swag_from(catalog_next.Api.api_doc) | |
| 55 | + def api_catalog_next(): | |
| 56 | + """ | |
| 57 | + 下一级服务目录 | |
| 58 | + """ | |
| 59 | + return catalog_next.Api().result | |
| 60 | + | |
| 61 | + @staticmethod | |
| 62 | + @bp.route('/Tree', methods=['POST']) | |
| 63 | + @swag_from(catalog_tree.Api.api_doc) | |
| 64 | + def api_catalog_tree(): | |
| 65 | + """ | |
| 66 | + 服务目录树 | |
| 67 | + """ | |
| 68 | + return catalog_tree.Api().result | |
| 69 | + | |
| 70 | + @staticmethod | |
| 71 | + @bp.route('/RealTree', methods=['POST']) | |
| 72 | + @swag_from(catalog_real_tree.Api.api_doc) | |
| 73 | + def api_catalog_real_tree(): | |
| 74 | + """ | |
| 75 | + 服务目录树 | |
| 76 | + """ | |
| 77 | + return catalog_real_tree.Api().result | |
| 78 | + | ... | ... |
| ... | ... | @@ -9,14 +9,14 @@ from flask import Blueprint |
| 9 | 9 | from app.util import BlueprintApi |
| 10 | 10 | from . import image_register |
| 11 | 11 | from . import image_service_register |
| 12 | -from . import image_service_list | |
| 13 | 12 | from . import image_server_list |
| 14 | 13 | from . import data_list |
| 15 | 14 | from . import capabilities |
| 16 | 15 | from . import image_list |
| 17 | 16 | from . import image_tile |
| 18 | 17 | from . import image_wms |
| 19 | - | |
| 18 | +from . import image_overview | |
| 19 | +from . import image_service_list | |
| 20 | 20 | |
| 21 | 21 | |
| 22 | 22 | class DataManager(BlueprintApi): |
| ... | ... | @@ -33,6 +33,16 @@ class DataManager(BlueprintApi): |
| 33 | 33 | """ |
| 34 | 34 | return image_register.Api().result |
| 35 | 35 | |
| 36 | + | |
| 37 | + @staticmethod | |
| 38 | + @bp.route('/Overview', methods=['POST']) | |
| 39 | + @swag_from(image_overview.Api.api_doc) | |
| 40 | + def api_image_overview(): | |
| 41 | + """ | |
| 42 | + 影像缩略图 | |
| 43 | + """ | |
| 44 | + return image_overview.Api().result | |
| 45 | + | |
| 36 | 46 | @staticmethod |
| 37 | 47 | @bp.route('/ServiceRegister', methods=['POST']) |
| 38 | 48 | @swag_from(image_service_register.Api.api_doc) |
| ... | ... | @@ -43,6 +53,15 @@ class DataManager(BlueprintApi): |
| 43 | 53 | return image_service_register.Api().result |
| 44 | 54 | |
| 45 | 55 | @staticmethod |
| 56 | + @bp.route('/ServiceList', methods=['GET']) | |
| 57 | + @swag_from(image_service_list.Api.api_doc) | |
| 58 | + def api_image_service_list(): | |
| 59 | + """ | |
| 60 | + 服务列表 | |
| 61 | + """ | |
| 62 | + return image_service_list.Api().result | |
| 63 | + | |
| 64 | + @staticmethod | |
| 46 | 65 | @bp.route('/ServerList', methods=['GET']) |
| 47 | 66 | @swag_from(image_server_list.Api.api_doc) |
| 48 | 67 | def image_server_list(): |
| ... | ... | @@ -79,14 +98,6 @@ class DataManager(BlueprintApi): |
| 79 | 98 | """ |
| 80 | 99 | return image_list.Api().result |
| 81 | 100 | |
| 82 | - @staticmethod | |
| 83 | - @bp.route('/ImageServiceList', methods=['POST']) | |
| 84 | - @swag_from(image_service_list.Api.api_doc) | |
| 85 | - def image_service_list(): | |
| 86 | - """ | |
| 87 | - 影像服务列表 | |
| 88 | - """ | |
| 89 | - return image_service_list.Api().result | |
| 90 | 101 | |
| 91 | 102 | @staticmethod |
| 92 | 103 | @bp.route('/Tile/<guid>/<l>/<y>/<z>', methods=['GET']) | ... | ... |
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
| ... | ... | @@ -2,3 +2,52 @@ |
| 2 | 2 | #author: 4N |
| 3 | 3 | #createtime: 2021/9/8 |
| 4 | 4 | #email: nheweijun@sina.com |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | +from app.util.component.ApiTemplate import ApiTemplate | |
| 9 | +from app.util.component.ModelVisitor import ModelVisitor | |
| 10 | + | |
| 11 | +from app.modules.service.image.models import Image,db | |
| 12 | +from sqlalchemy import or_,and_ | |
| 13 | +import datetime | |
| 14 | +class Api(ApiTemplate): | |
| 15 | + | |
| 16 | + api_name = "影像数据List" | |
| 17 | + | |
| 18 | + def process(self): | |
| 19 | + | |
| 20 | + # 返回结果 | |
| 21 | + res = {} | |
| 22 | + try: | |
| 23 | + para = self.para | |
| 24 | + guid = self.para.get("guid") | |
| 25 | + image = Image.query.filter_by(guid=guid).one_or_none() | |
| 26 | + del para["guid"] | |
| 27 | + para["update_time"] = datetime.datetime.now() | |
| 28 | + image.update(para) | |
| 29 | + db.session.commit() | |
| 30 | + | |
| 31 | + res["result"] = True | |
| 32 | + except Exception as e: | |
| 33 | + raise e | |
| 34 | + | |
| 35 | + return res | |
| 36 | + | |
| 37 | + | |
| 38 | + api_doc = { | |
| 39 | + "tags": ["影像接口"], | |
| 40 | + "parameters": [ | |
| 41 | + {"name": "alias", | |
| 42 | + "in": "formData", | |
| 43 | + "type": "string"}, | |
| 44 | + ], | |
| 45 | + "responses": { | |
| 46 | + 200: { | |
| 47 | + "schema": { | |
| 48 | + "properties": { | |
| 49 | + } | |
| 50 | + } | |
| 51 | + } | |
| 52 | + } | |
| 53 | + } | ... | ... |
| ... | ... | @@ -5,30 +5,90 @@ |
| 5 | 5 | |
| 6 | 6 | |
| 7 | 7 | from app.util.component.ApiTemplate import ApiTemplate |
| 8 | -from app.util.component.ModelVisitor import ModelVisitor | |
| 8 | +from app.util.component.StructuredPrint import StructurePrint | |
| 9 | 9 | |
| 10 | 10 | from app.modules.service.image.models import Image |
| 11 | -from sqlalchemy import or_,and_ | |
| 11 | +from sqlalchemy import or_ | |
| 12 | +import random | |
| 13 | +from .image_wms import Api as WMSApi | |
| 14 | +import numpy | |
| 15 | +import json | |
| 16 | +from flask import Response | |
| 17 | +from kazoo.client import KazooClient | |
| 18 | +import configure | |
| 19 | +import traceback | |
| 20 | + | |
| 21 | + | |
| 12 | 22 | class Api(ApiTemplate): |
| 13 | 23 | |
| 14 | 24 | api_name = "影像数据预览功能" |
| 15 | 25 | |
| 16 | 26 | def process(self): |
| 27 | + from app import GLOBAL_DIC | |
| 17 | 28 | |
| 18 | 29 | # 返回结果 |
| 19 | 30 | res = {} |
| 31 | + | |
| 20 | 32 | try: |
| 33 | + | |
| 34 | + #获取 | |
| 35 | + zoo = GLOBAL_DIC.get("zookeeper") | |
| 36 | + if zoo is None: | |
| 37 | + zoo :KazooClient = KazooClient(hosts=configure.zookeeper, timeout=100) | |
| 38 | + zoo.start() | |
| 39 | + GLOBAL_DIC["zookeeper"] = zoo | |
| 40 | + StructurePrint().print("连接zoo") | |
| 41 | + else : | |
| 42 | + if not zoo.connected: | |
| 43 | + zoo.start() | |
| 21 | 44 | |
| 22 | - res["result"] = True | |
| 23 | - except Exception as e: | |
| 24 | - raise e | |
| 25 | 45 | |
| 26 | - return res | |
| 46 | + guid = self.para.get("guid") | |
| 47 | + image = Image.query.filter_by(guid=guid).one_or_none() | |
| 48 | + # 该影像的服务器,随机选取一个 | |
| 49 | + image_servers = image.server.split(",") | |
| 50 | + indx = int(random.random() * len(image_servers)) | |
| 51 | + image_server = image_servers[indx] | |
| 52 | + wms_api = WMSApi() | |
| 53 | + | |
| 54 | + bands = [1,2,3] if image.band_count>=3 else [1,1,1] | |
| 55 | + | |
| 56 | + #计算查询范围,保持正常比例 | |
| 57 | + query_extent = json.loads(image.extent) | |
| 58 | + if query_extent[2]-query_extent[0] > query_extent[3]-query_extent[1]: | |
| 59 | + offset = ((query_extent[2]-query_extent[0]) - (query_extent[3]-query_extent[1])) / 2.0 | |
| 60 | + query_extent = [query_extent[0],query_extent[1] - offset ,query_extent[2],query_extent[3] + offset] | |
| 61 | + else: | |
| 62 | + offset = ((query_extent[3] - query_extent[1]) - (query_extent[2] - query_extent[0])) / 2.0 | |
| 63 | + query_extent = [query_extent[0] - offset, query_extent[1], query_extent[2] + offset, query_extent[3]] | |
| 64 | + | |
| 65 | + | |
| 66 | + pixel_array_t = wms_api.get_data(zoo, image_server, image, query_extent, bands, 256, 256) | |
| 67 | + | |
| 68 | + | |
| 69 | + pixel_array = numpy.zeros((256, 256, 3), dtype=int) | |
| 70 | + for ii in [0, 1, 2]: | |
| 71 | + # opencv 颜色排序为GBR | |
| 72 | + pixel_array[:, :, 2 - ii] = pixel_array_t[:, :, ii] | |
| 73 | + | |
| 74 | + # 将图片生成在内存中,然后直接返回response | |
| 75 | + im_data = wms_api.create_by_opencv("image/jpeg", pixel_array, 30) | |
| 76 | + | |
| 77 | + return Response(im_data, mimetype="image/jpeg") | |
| 78 | + | |
| 79 | + except Exception as e: | |
| 80 | + StructurePrint().print(traceback.format_exc()) | |
| 81 | + res["state"] = -1 | |
| 82 | + res["message"] = e.__str__() | |
| 83 | + return res | |
| 27 | 84 | |
| 28 | 85 | |
| 29 | 86 | api_doc = { |
| 30 | 87 | "tags": ["影像接口"], |
| 31 | 88 | "parameters": [ |
| 89 | + {"name": "guid", | |
| 90 | + "in": "formData", | |
| 91 | + "type": "string"}, | |
| 32 | 92 | ], |
| 33 | 93 | "responses": { |
| 34 | 94 | 200: { | ... | ... |
| ... | ... | @@ -117,7 +117,7 @@ class Api(ApiTemplate): |
| 117 | 117 | cell_x_size = info.get("cell_x_size"), |
| 118 | 118 | cell_y_size = abs(info.get("cell_y_size")), |
| 119 | 119 | name=os.path.basename(info.get("path")), |
| 120 | - origin_extent=json.dumps(info["origin_extent"]), | |
| 120 | + extent=json.dumps(info["origin_extent"]), | |
| 121 | 121 | # geo_origin_extent = json.dumps(info["geo_origin_extent"]), |
| 122 | 122 | null_value=info.get("null_value"), |
| 123 | 123 | server=data_server, |
| ... | ... | @@ -132,6 +132,9 @@ class Api(ApiTemplate): |
| 132 | 132 | db.session.add(image) |
| 133 | 133 | db.session.commit() |
| 134 | 134 | # res["data"] = guid |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 135 | 138 | res["result"] = True |
| 136 | 139 | |
| 137 | 140 | except Exception as e: | ... | ... |
| ... | ... | @@ -4,7 +4,7 @@ |
| 4 | 4 | #email: nheweijun@sina.com |
| 5 | 5 | |
| 6 | 6 | from app.util.component.ApiTemplate import ApiTemplate |
| 7 | -from app import GLOBAL_DIC | |
| 7 | + | |
| 8 | 8 | from kazoo.client import KazooClient |
| 9 | 9 | import configure |
| 10 | 10 | class Api(ApiTemplate): |
| ... | ... | @@ -12,6 +12,7 @@ class Api(ApiTemplate): |
| 12 | 12 | api_name = "获取数据服务器列表" |
| 13 | 13 | |
| 14 | 14 | def process(self): |
| 15 | + from app import GLOBAL_DIC | |
| 15 | 16 | |
| 16 | 17 | # 返回结果 |
| 17 | 18 | res = {} | ... | ... |
| ... | ... | @@ -6,25 +6,39 @@ |
| 6 | 6 | from app.modules.service.image.models import ImageService,Image |
| 7 | 7 | from app.models import db |
| 8 | 8 | from app.util.component.ApiTemplate import ApiTemplate |
| 9 | -import uuid | |
| 10 | -from app.util.component.SliceScheme import SliceScheme | |
| 11 | -from app.util.component.FileProcess import FileProcess | |
| 12 | -import os | |
| 13 | -import json | |
| 9 | +from app.models import Service | |
| 14 | 10 | import datetime |
| 15 | 11 | class Api(ApiTemplate): |
| 16 | 12 | |
| 17 | - api_name = "注册影像服务" | |
| 13 | + api_name = "修改影像服务" | |
| 18 | 14 | |
| 19 | 15 | def process(self): |
| 20 | 16 | |
| 21 | - | |
| 22 | - | |
| 23 | 17 | # 返回结果 |
| 24 | 18 | res = {} |
| 25 | 19 | |
| 26 | 20 | try: |
| 27 | 21 | |
| 22 | + guid = self.para.get("guid") | |
| 23 | + service = Service.query.filter_by(guid=guid).one_or_none() | |
| 24 | + this_time = datetime.datetime.now() | |
| 25 | + | |
| 26 | + | |
| 27 | + service_update = {"upate_time":this_time} | |
| 28 | + image_service = {"upate_time":this_time} | |
| 29 | + for key in self.para.keys(): | |
| 30 | + if key in ["name","alias","state","description","catalog_guid"]: | |
| 31 | + service_update[key] = self.para.get(key) | |
| 32 | + if key in ["name","scheme_guid"]: | |
| 33 | + image_service[key] = self.para.get(key) | |
| 34 | + | |
| 35 | + image_service = ImageService.query.filter_by(guid=service.service_guid).one_or_none() | |
| 36 | + | |
| 37 | + service.update(service_update) | |
| 38 | + image_service.update(image_service) | |
| 39 | + | |
| 40 | + db.session.commit() | |
| 41 | + | |
| 28 | 42 | res["result"] = True |
| 29 | 43 | except Exception as e: |
| 30 | 44 | raise e |
| ... | ... | @@ -34,14 +48,12 @@ class Api(ApiTemplate): |
| 34 | 48 | api_doc = { |
| 35 | 49 | "tags": ["影像接口"], |
| 36 | 50 | "parameters": [ |
| 37 | - {"name": "guids", | |
| 51 | + {"name": "guid", | |
| 38 | 52 | "in": "formData", |
| 39 | - "type": "string", | |
| 40 | - "description": "影像guids,以英文逗号相隔"}, | |
| 41 | - {"name": "file", | |
| 53 | + "type": "string"}, | |
| 54 | + {"name": "name", | |
| 42 | 55 | "in": "formData", |
| 43 | - "type": "file", | |
| 44 | - "description": "切片方案"}, | |
| 56 | + "type": "string"}, | |
| 45 | 57 | ], |
| 46 | 58 | "responses": { |
| 47 | 59 | 200: { | ... | ... |
| 1 | +# coding=utf-8 | |
| 2 | +#author: 4N | |
| 3 | +#createtime: 2021/7/19 | |
| 4 | +#email: nheweijun@sina.com | |
| 5 | + | |
| 6 | +from app.modules.service.image.models import ImageService,Image | |
| 7 | + | |
| 8 | +from app.util.component.ApiTemplate import ApiTemplate | |
| 9 | +from app.util.component.ModelVisitor import ModelVisitor | |
| 10 | +from app.models import Service | |
| 11 | +from sqlalchemy import or_ | |
| 12 | +class Api(ApiTemplate): | |
| 13 | + | |
| 14 | + api_name = "影像服务List" | |
| 15 | + | |
| 16 | + def process(self): | |
| 17 | + | |
| 18 | + # 返回结果 | |
| 19 | + res = {} | |
| 20 | + | |
| 21 | + try: | |
| 22 | + page_index = int(self.para.get("page_index", "0")) | |
| 23 | + page_size = int(self.para.get("page_size", "10")) | |
| 24 | + | |
| 25 | + alias = self.para.get("alias") | |
| 26 | + name = self.para.get("name") | |
| 27 | + type = self.para.get("type") | |
| 28 | + | |
| 29 | + services = ImageService.query | |
| 30 | + if type: | |
| 31 | + services = services.filter_by(type=type) | |
| 32 | + # 并集 | |
| 33 | + if alias and name: | |
| 34 | + services = services.filter( | |
| 35 | + or_(ImageService.alias.like("%" + alias + "%"), ImageService.name.like("%" + name + "%"))) | |
| 36 | + else: | |
| 37 | + if alias: | |
| 38 | + services = services.filter(ImageService.alias.like("%" + alias + "%")) | |
| 39 | + if name: | |
| 40 | + services = services.filter(ImageService.name.like("%" + name + "%")) | |
| 41 | + | |
| 42 | + services = services.limit(page_size).offset(page_index).all() | |
| 43 | + | |
| 44 | + res["data"] = ModelVisitor.objects_to_jsonarray(services) | |
| 45 | + res["result"] = True | |
| 46 | + except Exception as e: | |
| 47 | + raise e | |
| 48 | + | |
| 49 | + return res | |
| 50 | + | |
| 51 | + api_doc = { | |
| 52 | + "tags": ["影像接口"], | |
| 53 | + "parameters": [ | |
| 54 | + {"name": "page_index", | |
| 55 | + "in": "formData", | |
| 56 | + "type": "int", | |
| 57 | + "description": "页"}, | |
| 58 | + {"name": "page_size", | |
| 59 | + "in": "formData", | |
| 60 | + "type": "int", | |
| 61 | + "description": "页大小"}, | |
| 62 | + {"name": "alias", | |
| 63 | + "in": "formData", | |
| 64 | + "type": "string", | |
| 65 | + "description": "服务别名"}, | |
| 66 | + {"name": "name", | |
| 67 | + "in": "formData", | |
| 68 | + "type": "string", | |
| 69 | + "description": "服务名"}, | |
| 70 | + ], | |
| 71 | + "responses": { | |
| 72 | + 200: { | |
| 73 | + "schema": { | |
| 74 | + "properties": { | |
| 75 | + } | |
| 76 | + } | |
| 77 | + } | |
| 78 | + } | |
| 79 | + } | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -3,7 +3,7 @@ |
| 3 | 3 | #createtime: 2021/7/19 |
| 4 | 4 | #email: nheweijun@sina.com |
| 5 | 5 | |
| 6 | -from app.modules.service.image.models import ImageService,Image | |
| 6 | +from .models import ImageService,Image | |
| 7 | 7 | from app.models import db,Service |
| 8 | 8 | from app.util.component.ApiTemplate import ApiTemplate |
| 9 | 9 | import uuid |
| ... | ... | @@ -12,6 +12,10 @@ from app.util.component.FileProcess import FileProcess |
| 12 | 12 | import os |
| 13 | 13 | import json |
| 14 | 14 | import datetime |
| 15 | +from .image_wms import Api as Api2 | |
| 16 | +import cv2 | |
| 17 | +import configure | |
| 18 | + | |
| 15 | 19 | class Api(ApiTemplate): |
| 16 | 20 | |
| 17 | 21 | api_name = "注册影像服务" |
| ... | ... | @@ -26,55 +30,133 @@ class Api(ApiTemplate): |
| 26 | 30 | try: |
| 27 | 31 | guids = self.para.get("guids").split(",") |
| 28 | 32 | name = self.para.get("name") |
| 29 | - catalog_guid = self.para.get("catalog_guid") | |
| 30 | - | |
| 31 | - service_guid = uuid.uuid1().__str__() | |
| 32 | 33 | |
| 34 | + image_service_guid = uuid.uuid1().__str__() | |
| 33 | 35 | |
| 34 | - parent = os.path.dirname(os.path.realpath(__file__)) | |
| 35 | - dir_path, store_file = FileProcess.save(parent) | |
| 36 | - scheme = SliceScheme(store_file).parameter | |
| 37 | - | |
| 38 | - service = ImageService(guid=service_guid, name=name, | |
| 39 | - create_time=datetime.datetime.now()) | |
| 40 | - service_exetent = [] | |
| 36 | + this_time = datetime.datetime.now() | |
| 37 | + service_guid = uuid.uuid1().__str__() | |
| 38 | + image_service = ImageService(guid=image_service_guid, | |
| 39 | + name=name, | |
| 40 | + create_time=this_time, | |
| 41 | + scheme_guid=self.para.get("scheme_guid"), | |
| 42 | + crs = self.para.get("crs"), | |
| 43 | + service_guid=service_guid) | |
| 44 | + image_service_exetent = [] | |
| 41 | 45 | |
| 42 | 46 | for g in guids: |
| 43 | 47 | image = Image.query.filter_by(guid=g).one_or_none() |
| 44 | 48 | if image: |
| 45 | - image_extent = json.loads(image.origin_extent) | |
| 46 | - if not service_exetent: | |
| 47 | - service_exetent = image_extent | |
| 49 | + image_extent = json.loads(image.extent) | |
| 50 | + if not image_service_exetent: | |
| 51 | + image_service_exetent = image_extent | |
| 48 | 52 | else: |
| 49 | - service_exetent[0] = min(image_extent[0],service_exetent[0]) | |
| 50 | - service_exetent[1] = min(image_extent[1], service_exetent[1]) | |
| 51 | - service_exetent[2] = max(image_extent[2], service_exetent[2]) | |
| 52 | - service_exetent[3] = max(image_extent[3], service_exetent[3]) | |
| 53 | - service.images.append(image) | |
| 54 | - service.extent = json.dumps(service_exetent) | |
| 53 | + image_service_exetent[0] = min(image_extent[0],image_service_exetent[0]) | |
| 54 | + image_service_exetent[1] = min(image_extent[1], image_service_exetent[1]) | |
| 55 | + image_service_exetent[2] = max(image_extent[2], image_service_exetent[2]) | |
| 56 | + image_service_exetent[3] = max(image_extent[3], image_service_exetent[3]) | |
| 57 | + image_service.images.append(image) | |
| 58 | + image_service.extent = json.dumps(image_service_exetent) | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + service = Service( | |
| 63 | + guid = service_guid, | |
| 64 | + name = self.para.get("name"), | |
| 65 | + alias = self.para.get("alias"), | |
| 66 | + state = 1, | |
| 67 | + create_time = this_time, | |
| 68 | + update_time = this_time, | |
| 69 | + description = self.para.get("description"), | |
| 70 | + #node = Column(Integer), | |
| 71 | + type = self.para.get("type"), | |
| 72 | + service_guid = image_service_guid, | |
| 73 | + catalog_guid = self.para.get("catalog_guid") | |
| 74 | + ) | |
| 75 | + | |
| 55 | 76 | db.session.add(service) |
| 56 | - db.session.commit() | |
| 77 | + db.session.add(image_service) | |
| 78 | + | |
| 57 | 79 | |
| 58 | 80 | #获得overview |
| 81 | + overview_file = self.get_overview(service,image_service) | |
| 82 | + service.overview="http://{}/API/Service/Overview/{}".format( | |
| 83 | + configure.deploy_ip_host,overview_file) | |
| 84 | + db.session.commit() | |
| 59 | 85 | |
| 60 | - res["data"] = service_guid | |
| 86 | + res["data"] = image_service_guid | |
| 61 | 87 | res["result"] = True |
| 62 | 88 | except Exception as e: |
| 89 | + db.session.rollback() | |
| 63 | 90 | raise e |
| 64 | 91 | |
| 65 | 92 | return res |
| 66 | 93 | |
| 94 | + def get_overview(self,service,image_service): | |
| 95 | + | |
| 96 | + api = Api2() | |
| 97 | + | |
| 98 | + | |
| 99 | + query_extent = json.loads(image_service.extent) | |
| 100 | + if query_extent[2] - query_extent[0] > query_extent[3] - query_extent[1]: | |
| 101 | + offset = ((query_extent[2] - query_extent[0]) - (query_extent[3] - query_extent[1])) / 2.0 | |
| 102 | + query_extent = [query_extent[0], query_extent[1] - offset, query_extent[2], query_extent[3] + offset] | |
| 103 | + else: | |
| 104 | + offset = ((query_extent[3] - query_extent[1]) - (query_extent[2] - query_extent[0])) / 2.0 | |
| 105 | + query_extent = [query_extent[0] - offset, query_extent[1], query_extent[2] + offset, query_extent[3]] | |
| 106 | + | |
| 107 | + bbox = ",".join([str(x) for x in query_extent]) | |
| 108 | + | |
| 109 | + api.para = {"guid":image_service.guid,"bbox":bbox,"overview":1} | |
| 110 | + res = api.process() | |
| 111 | + dir_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "overview") | |
| 112 | + gid = uuid.uuid1().__str__() | |
| 113 | + store_file = os.path.join(dir_path, "{}.jpg".format(gid)) | |
| 114 | + cv2.imwrite(store_file, res, [cv2.IMWRITE_JPEG_QUALITY, 30]) | |
| 115 | + | |
| 116 | + return "{}.jpg".format(gid) | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 67 | 121 | api_doc = { |
| 68 | 122 | "tags": ["影像接口"], |
| 69 | 123 | "parameters": [ |
| 124 | + | |
| 125 | + # 通用参数 | |
| 126 | + {"name": "name", | |
| 127 | + "in": "formData", | |
| 128 | + "type": "string", | |
| 129 | + "required": "true", | |
| 130 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 131 | + {"name": "alias", | |
| 132 | + "in": "formData", | |
| 133 | + "type": "string", | |
| 134 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 135 | + {"name": "description", | |
| 136 | + "in": "formData", | |
| 137 | + "type": "string", | |
| 138 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 139 | + {"name": "type", | |
| 140 | + "in": "formData", | |
| 141 | + "type": "string", | |
| 142 | + "enum": ["WMS", "WMTS", "影像WMS", "影像WMTS"], | |
| 143 | + "required": "true", | |
| 144 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 145 | + {"name": "catalog_guid", | |
| 146 | + "in": "formData", | |
| 147 | + "type": "string", | |
| 148 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 149 | + | |
| 150 | + # 影像参数 | |
| 70 | 151 | {"name": "guids", |
| 71 | 152 | "in": "formData", |
| 72 | 153 | "type": "string", |
| 73 | - "description": "影像guids,以英文逗号相隔"}, | |
| 74 | - {"name": "file", | |
| 154 | + "description": "[影像WMS,影像WMTS]影像guids,以英文逗号相隔"}, | |
| 155 | + {"name": "scheme_guid", | |
| 75 | 156 | "in": "formData", |
| 76 | - "type": "file", | |
| 77 | - "description": "切片方案"}, | |
| 157 | + "type": "string", | |
| 158 | + "description": "[WMTS,影像WMTS]切片方案"}, | |
| 159 | + | |
| 78 | 160 | ], |
| 79 | 161 | "responses": { |
| 80 | 162 | 200: { |
| ... | ... | @@ -84,4 +166,7 @@ class Api(ApiTemplate): |
| 84 | 166 | } |
| 85 | 167 | } |
| 86 | 168 | } |
| 87 | - } | |
| \ No newline at end of file | ||
| 169 | + } | |
| 170 | + | |
| 171 | +if __name__ == '__main__': | |
| 172 | + pass | |
| \ No newline at end of file | ... | ... |
| 1 | +# coding=utf-8 | |
| 2 | +#author: 4N | |
| 3 | +#createtime: 2021/9/8 | |
| 4 | +#email: nheweijun@sina.com | |
| 5 | + | |
| 6 | + | |
| 7 | +from app.util.component.ApiTemplate import ApiTemplate | |
| 8 | +from app.util.component.ModelVisitor import ModelVisitor | |
| 9 | +from kazoo.client import KazooClient | |
| 10 | +import configure | |
| 11 | +from .models import ImageTag | |
| 12 | +import uuid | |
| 13 | +from app.models import db | |
| 14 | +class Api(ApiTemplate): | |
| 15 | + | |
| 16 | + api_name = "create tag" | |
| 17 | + | |
| 18 | + def process(self): | |
| 19 | + | |
| 20 | + # 返回结果 | |
| 21 | + res = {} | |
| 22 | + try: | |
| 23 | + tag_guid = uuid.uuid1().__str__() | |
| 24 | + | |
| 25 | + image_tag = ImageTag(guid=tag_guid,name=self.para.get("name")) | |
| 26 | + db.session.add(image_tag) | |
| 27 | + db.session.commit() | |
| 28 | + res["data"] = tag_guid | |
| 29 | + res["result"] = True | |
| 30 | + except Exception as e: | |
| 31 | + raise e | |
| 32 | + return res | |
| 33 | + | |
| 34 | + api_doc = { | |
| 35 | + "tags": ["影像接口"], | |
| 36 | + "parameters": [ | |
| 37 | + {"name": "name", | |
| 38 | + "in": "formData", | |
| 39 | + "type": "string"}, | |
| 40 | + ], | |
| 41 | + "responses": { | |
| 42 | + 200: { | |
| 43 | + "schema": { | |
| 44 | + "properties": { | |
| 45 | + } | |
| 46 | + } | |
| 47 | + } | |
| 48 | + } | |
| 49 | + } | |
| \ No newline at end of file | ... | ... |
| 1 | +# coding=utf-8 | |
| 2 | +#author: 4N | |
| 3 | +#createtime: 2021/9/8 | |
| 4 | +#email: nheweijun@sina.com | |
| 5 | + | |
| 6 | + | |
| 7 | +from app.util.component.ApiTemplate import ApiTemplate | |
| 8 | +from app.models import db | |
| 9 | +from .models import ImageTag | |
| 10 | +class Api(ApiTemplate): | |
| 11 | + | |
| 12 | + api_name = "delete tag" | |
| 13 | + | |
| 14 | + def process(self): | |
| 15 | + | |
| 16 | + # 返回结果 | |
| 17 | + res = {} | |
| 18 | + try: | |
| 19 | + image_tag = ImageTag.query.filter_by(guid=self.para.get("guid")).one_or_none() | |
| 20 | + if image_tag: | |
| 21 | + db.session.delete(image_tag) | |
| 22 | + db.session.commit() | |
| 23 | + res["result"] = True | |
| 24 | + except Exception as e: | |
| 25 | + raise e | |
| 26 | + return res | |
| 27 | + | |
| 28 | + api_doc = { | |
| 29 | + "tags": ["影像接口"], | |
| 30 | + "parameters": [ | |
| 31 | + {"name": "guid", | |
| 32 | + "in": "formData", | |
| 33 | + "type": "string"}, | |
| 34 | + ], | |
| 35 | + "responses": { | |
| 36 | + 200: { | |
| 37 | + "schema": { | |
| 38 | + "properties": { | |
| 39 | + } | |
| 40 | + } | |
| 41 | + } | |
| 42 | + } | |
| 43 | + } | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -2,3 +2,39 @@ |
| 2 | 2 | #author: 4N |
| 3 | 3 | #createtime: 2021/9/8 |
| 4 | 4 | #email: nheweijun@sina.com |
| 5 | + | |
| 6 | + | |
| 7 | +from app.util.component.ApiTemplate import ApiTemplate | |
| 8 | +from app.util.component.ModelVisitor import ModelVisitor | |
| 9 | +from kazoo.client import KazooClient | |
| 10 | +import configure | |
| 11 | +from .models import ImageTag | |
| 12 | +class Api(ApiTemplate): | |
| 13 | + | |
| 14 | + api_name = "获取tag列表" | |
| 15 | + | |
| 16 | + def process(self): | |
| 17 | + | |
| 18 | + # 返回结果 | |
| 19 | + res = {} | |
| 20 | + try: | |
| 21 | + image_tags = ImageTag.query.all() | |
| 22 | + res["data"] = ModelVisitor.objects_to_jsonarray(image_tags) | |
| 23 | + res["result"] = True | |
| 24 | + except Exception as e: | |
| 25 | + raise e | |
| 26 | + return res | |
| 27 | + | |
| 28 | + api_doc = { | |
| 29 | + "tags": ["影像接口"], | |
| 30 | + "parameters": [ | |
| 31 | + ], | |
| 32 | + "responses": { | |
| 33 | + 200: { | |
| 34 | + "schema": { | |
| 35 | + "properties": { | |
| 36 | + } | |
| 37 | + } | |
| 38 | + } | |
| 39 | + } | |
| 40 | + } | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -17,7 +17,7 @@ from PIL import Image |
| 17 | 17 | import time |
| 18 | 18 | import cv2 |
| 19 | 19 | from app.modules.service.image.models import ImageService,Image |
| 20 | -from app.models import db | |
| 20 | +from app.models import db,TileScheme | |
| 21 | 21 | from app.util.component.ApiTemplate import ApiTemplate |
| 22 | 22 | import uuid |
| 23 | 23 | from app.util.component.SliceScheme import SliceScheme |
| ... | ... | @@ -27,7 +27,7 @@ from app.util.component.GeometryAdapter import GeometryAdapter |
| 27 | 27 | import os |
| 28 | 28 | import json |
| 29 | 29 | from kazoo.client import KazooClient |
| 30 | -from app import GLOBAL_DIC | |
| 30 | + | |
| 31 | 31 | from threading import Thread |
| 32 | 32 | |
| 33 | 33 | from app.modules.service.image.util.ThriftConnect import ThriftConnect |
| ... | ... | @@ -46,7 +46,7 @@ class Api(ApiTemplate): |
| 46 | 46 | self.col = col |
| 47 | 47 | |
| 48 | 48 | def process(self): |
| 49 | - | |
| 49 | + from app import GLOBAL_DIC | |
| 50 | 50 | result = {} |
| 51 | 51 | parameter: dict = self.para |
| 52 | 52 | |
| ... | ... | @@ -54,8 +54,16 @@ class Api(ApiTemplate): |
| 54 | 54 | if parameter.get("guid"): |
| 55 | 55 | self.guid = parameter.get("guid") |
| 56 | 56 | |
| 57 | - image_service = ImageService.query.filter_by(guid = self.guid).one_or_none() | |
| 58 | - images = image_service.images.all() | |
| 57 | + #缓存服务信息 | |
| 58 | + image_service_info = GLOBAL_DIC.get(self.guid) | |
| 59 | + if image_service_info is None: | |
| 60 | + image_service:ImageService = ImageService.query.filter_by(guid = self.guid).one_or_none() | |
| 61 | + images = image_service.images.all() | |
| 62 | + scheme:TileScheme = TileScheme.query.filter_by(guid=image_service.scheme_guid).one_or_none() | |
| 63 | + GLOBAL_DIC[self.guid] = {"service":image_service,"images":images,"scheme":json.loads(scheme.parameter)} | |
| 64 | + image_service_info = GLOBAL_DIC[self.guid] | |
| 65 | + else: | |
| 66 | + image_service_info = GLOBAL_DIC[self.guid] | |
| 59 | 67 | |
| 60 | 68 | zoo = GLOBAL_DIC.get("zookeeper") |
| 61 | 69 | if zoo is None: |
| ... | ... | @@ -85,14 +93,15 @@ class Api(ApiTemplate): |
| 85 | 93 | |
| 86 | 94 | image_type = parameter.get("format") if parameter.get("format") else "image/png" |
| 87 | 95 | quality = int(parameter.get("quality")) if parameter.get("quality") else 30 |
| 88 | - slice_para = json.loads(image_service.slice_scheme) | |
| 96 | + slice_para = image_service_info["scheme"] | |
| 89 | 97 | extent = SliceScheme.get_polygon(slice_para, self.level, self.row, self.col) |
| 90 | 98 | |
| 99 | + | |
| 91 | 100 | height, width = 256,256 |
| 92 | 101 | |
| 93 | 102 | # 多线程获取分布式数据 |
| 94 | 103 | |
| 95 | - intersect_image = [im for im in images if self.determin_intersect(json.loads(im.origin_extent),extent)] | |
| 104 | + intersect_image = [im for im in image_service_info["images"] if self.determin_intersect(json.loads(im.extent),extent)] | |
| 96 | 105 | |
| 97 | 106 | if len(intersect_image) > 1: |
| 98 | 107 | |
| ... | ... | @@ -109,7 +118,6 @@ class Api(ApiTemplate): |
| 109 | 118 | image_servers = image.server.split(",") |
| 110 | 119 | indx = int(random.random() * len(image_servers)) |
| 111 | 120 | image_server = image_servers[indx] |
| 112 | - | |
| 113 | 121 | thread: MyThread = MyThread(self.get_data, |
| 114 | 122 | args=(zoo, image_server, image, extent, bands, height, width)) |
| 115 | 123 | thread.start() |
| ... | ... | @@ -141,7 +149,9 @@ class Api(ApiTemplate): |
| 141 | 149 | image = intersect_image[0] |
| 142 | 150 | image_servers = image.server.split(",") |
| 143 | 151 | indx = int(random.random() * len(image_servers)) |
| 152 | + | |
| 144 | 153 | image_server = image_servers[indx] |
| 154 | + | |
| 145 | 155 | pixel_array_t = self.get_data(zoo, image_server, image, extent, bands, height, width) |
| 146 | 156 | pixel_array = numpy.zeros((height, width, 3), dtype=int) |
| 147 | 157 | for ii in [0, 1, 2]: |
| ... | ... | @@ -205,13 +215,13 @@ class Api(ApiTemplate): |
| 205 | 215 | else: |
| 206 | 216 | ser = image_server |
| 207 | 217 | if zoo.exists("/rpc/{}".format(ser)): |
| 208 | - data = self.get_remote_wms_data(image, extent, bands, height, width) | |
| 218 | + data = self.get_remote_wms_data(ser,image, extent, bands, height, width) | |
| 209 | 219 | else: |
| 210 | 220 | data = numpy.zeros((height, width, 3), dtype=int) + 65536 |
| 211 | 221 | |
| 212 | 222 | return data |
| 213 | 223 | |
| 214 | - def get_remote_wms_data(self, image, extent, bands, height, width): | |
| 224 | + def get_remote_wms_data(self, image_server,image, extent, bands, height, width): | |
| 215 | 225 | ''' |
| 216 | 226 | 通过RPC获取远程数据 |
| 217 | 227 | :param image: |
| ... | ... | @@ -219,14 +229,19 @@ class Api(ApiTemplate): |
| 219 | 229 | :param bands: |
| 220 | 230 | :return: |
| 221 | 231 | ''' |
| 222 | - thrift_connect = ThriftConnect(image.server) | |
| 232 | + | |
| 233 | + | |
| 234 | + #需要做thrift连接的缓存,连接池 | |
| 235 | + | |
| 236 | + thrift_connect = ThriftConnect(image_server) | |
| 223 | 237 | t1 = time.time() |
| 224 | - image_extent = image.origin_extent if abs(extent[0]) > 180 else image.geo_origin_extent | |
| 238 | + image_extent = image.extent | |
| 225 | 239 | |
| 226 | 240 | data = thrift_connect.client.getData(image.path, extent, json.loads(image_extent), bands, width, height) |
| 227 | 241 | |
| 228 | 242 | thrift_connect.close() |
| 229 | - current_app.logger.info("time {}".format(time.time() - t1)) | |
| 243 | + | |
| 244 | + # current_app.logger.info("time {}".format(time.time() - t1)) | |
| 230 | 245 | data = gzip.decompress(data) |
| 231 | 246 | data = numpy.frombuffer(data, dtype='int64') |
| 232 | 247 | data = data.reshape((height, width, 3)) |
| ... | ... | @@ -250,7 +265,7 @@ class Api(ApiTemplate): |
| 250 | 265 | # 自决定金字塔等级 |
| 251 | 266 | xysize = [img.RasterXSize, img.RasterYSize] |
| 252 | 267 | |
| 253 | - origin_extent = image.origin_extent if abs(extent[0]) > 180 else image.geo_origin_extent | |
| 268 | + origin_extent = image.extent | |
| 254 | 269 | band_data: Band = img.GetRasterBand(band) |
| 255 | 270 | |
| 256 | 271 | max_level = band_data.GetOverviewCount() |
| ... | ... | @@ -337,8 +352,8 @@ class Api(ApiTemplate): |
| 337 | 352 | return pixel_array |
| 338 | 353 | |
| 339 | 354 | def determin_intersect(self, extent1, extent2): |
| 340 | - g1 = GeometryAdapter.envelop_2_polygon(extent1) | |
| 341 | - g2 = GeometryAdapter.envelop_2_polygon(extent2) | |
| 355 | + g1 = GeometryAdapter.bbox_2_polygon(extent1) | |
| 356 | + g2 = GeometryAdapter.bbox_2_polygon(extent2) | |
| 342 | 357 | return g1.Intersect(g2) |
| 343 | 358 | |
| 344 | 359 | api_doc = { | ... | ... |
| ... | ... | @@ -20,7 +20,7 @@ from app.modules.service.image.util.ThriftConnect import ThriftConnect |
| 20 | 20 | from app.util.component.ParameterUtil import ParameterUtil |
| 21 | 21 | import json |
| 22 | 22 | from kazoo.client import KazooClient |
| 23 | -from app import GLOBAL_DIC | |
| 23 | + | |
| 24 | 24 | from threading import Thread |
| 25 | 25 | from flask import current_app |
| 26 | 26 | import gzip |
| ... | ... | @@ -30,6 +30,7 @@ class Api(ApiTemplate): |
| 30 | 30 | api_name = "WMS" |
| 31 | 31 | |
| 32 | 32 | def process(self): |
| 33 | + from app import GLOBAL_DIC | |
| 33 | 34 | |
| 34 | 35 | result = {} |
| 35 | 36 | parameter: dict = self.para |
| ... | ... | @@ -45,16 +46,22 @@ class Api(ApiTemplate): |
| 45 | 46 | quality = int(parameter.get("quality")) if parameter.get("quality") else 30 |
| 46 | 47 | |
| 47 | 48 | |
| 48 | - | |
| 49 | - | |
| 50 | 49 | #缓存起来 |
| 51 | - image_service = ImageService.query.filter_by(guid = guid).one_or_none() | |
| 52 | - images = image_service.images.all() | |
| 50 | + #缓存服务信息 | |
| 51 | + image_service_info = GLOBAL_DIC.get(guid) | |
| 52 | + if image_service_info is None: | |
| 53 | + image_service:ImageService = ImageService.query.filter_by(guid=guid).one_or_none() | |
| 54 | + images = image_service.images.all() | |
| 55 | + GLOBAL_DIC[guid] = {"service":image_service,"images":images} | |
| 56 | + image_service_info = GLOBAL_DIC[guid] | |
| 57 | + else: | |
| 58 | + image_service_info = GLOBAL_DIC[guid] | |
| 59 | + | |
| 53 | 60 | |
| 54 | 61 | re = parameter.get("request") |
| 55 | 62 | |
| 56 | 63 | if re and re.__eq__("GetCapabilities"): |
| 57 | - return self.get_capabilities(image_service) | |
| 64 | + return self.get_capabilities(image_service_info["service"]) | |
| 58 | 65 | |
| 59 | 66 | zoo = GLOBAL_DIC.get("zookeeper") |
| 60 | 67 | if zoo is None: |
| ... | ... | @@ -66,11 +73,10 @@ class Api(ApiTemplate): |
| 66 | 73 | zoo.start() |
| 67 | 74 | |
| 68 | 75 | bands = [1, 2, 3] |
| 69 | - extent = [float(x) for x in bbox.split(",")] | |
| 70 | - # extent = [extent[1],extent[0],extent[3],extent[2]] | |
| 71 | 76 | |
| 77 | + extent = [float(x) for x in bbox.split(",")] | |
| 72 | 78 | |
| 73 | - intersect_image = [im for im in images if self.determin_intersect(json.loads(im.origin_extent),extent)] | |
| 79 | + intersect_image = [im for im in image_service_info["images"] if self.determin_intersect(json.loads(im.extent),extent)] | |
| 74 | 80 | |
| 75 | 81 | if len(intersect_image)>1: |
| 76 | 82 | |
| ... | ... | @@ -131,6 +137,9 @@ class Api(ApiTemplate): |
| 131 | 137 | |
| 132 | 138 | # 将图片生成在内存中,然后直接返回response |
| 133 | 139 | im_data = self.create_by_opencv(image_type, pixel_array, quality) |
| 140 | + | |
| 141 | + if self.para.get("overview"): | |
| 142 | + return pixel_array | |
| 134 | 143 | return Response(im_data, mimetype=image_type.lower()) |
| 135 | 144 | |
| 136 | 145 | except Exception as e: |
| ... | ... | @@ -180,7 +189,7 @@ class Api(ApiTemplate): |
| 180 | 189 | else: |
| 181 | 190 | ser = image_server |
| 182 | 191 | if zoo.exists("/rpc/{}".format(ser)): |
| 183 | - data = self.get_remote_wms_data(image, extent, bands, height, width) | |
| 192 | + data = self.get_remote_wms_data(image_server,image, extent, bands, height, width) | |
| 184 | 193 | else: |
| 185 | 194 | data = numpy.zeros((height, width, 3), dtype=int) + 65536 |
| 186 | 195 | |
| ... | ... | @@ -188,7 +197,7 @@ class Api(ApiTemplate): |
| 188 | 197 | |
| 189 | 198 | |
| 190 | 199 | |
| 191 | - def get_remote_wms_data(self,image,extent,bands,height,width): | |
| 200 | + def get_remote_wms_data(self,image_server,image,extent,bands,height,width): | |
| 192 | 201 | ''' |
| 193 | 202 | 通过RPC获取远程数据 |
| 194 | 203 | :param image: |
| ... | ... | @@ -196,14 +205,14 @@ class Api(ApiTemplate): |
| 196 | 205 | :param bands: |
| 197 | 206 | :return: |
| 198 | 207 | ''' |
| 199 | - thrift_connect = ThriftConnect(image.server) | |
| 208 | + thrift_connect = ThriftConnect(image_server) | |
| 200 | 209 | t1 = time.time() |
| 201 | - image_extent = image.origin_extent | |
| 210 | + image_extent = image.extent | |
| 202 | 211 | |
| 203 | 212 | data = thrift_connect.client.getData(image.path, extent, json.loads(image_extent), bands,width,height) |
| 204 | 213 | |
| 205 | 214 | thrift_connect.close() |
| 206 | - current_app.logger.info("time {}".format(time.time() - t1)) | |
| 215 | + # current_app.logger.info("time {}".format(time.time() - t1)) | |
| 207 | 216 | data = gzip.decompress(data) |
| 208 | 217 | data = numpy.frombuffer(data, dtype='int64') |
| 209 | 218 | data = data.reshape((height,width, 3)) |
| ... | ... | @@ -227,9 +236,11 @@ class Api(ApiTemplate): |
| 227 | 236 | # 自决定金字塔等级 |
| 228 | 237 | xysize = [img.RasterXSize, img.RasterYSize] |
| 229 | 238 | |
| 230 | - origin_extent = image.origin_extent if abs(extent[0]) > 180 else image.geo_origin_extent | |
| 239 | + origin_extent = image.extent | |
| 231 | 240 | band_data: Band = img.GetRasterBand(band) |
| 232 | 241 | |
| 242 | + | |
| 243 | + | |
| 233 | 244 | max_level = band_data.GetOverviewCount() |
| 234 | 245 | |
| 235 | 246 | # 超出空间范围 |
| ... | ... | @@ -314,8 +325,8 @@ class Api(ApiTemplate): |
| 314 | 325 | return pixel_array |
| 315 | 326 | |
| 316 | 327 | def determin_intersect(self,extent1,extent2): |
| 317 | - g1 = GeometryAdapter.envelop_2_polygon(extent1) | |
| 318 | - g2 = GeometryAdapter.envelop_2_polygon(extent2) | |
| 328 | + g1 = GeometryAdapter.bbox_2_polygon(extent1) | |
| 329 | + g2 = GeometryAdapter.bbox_2_polygon(extent2) | |
| 319 | 330 | return g1.Intersect(g2) |
| 320 | 331 | |
| 321 | 332 | def get_capabilities(self,image_service:ImageService): |
| ... | ... | @@ -417,7 +428,7 @@ class Api(ApiTemplate): |
| 417 | 428 | extent = json.loads(image_service.extent) |
| 418 | 429 | xml = xml.format(service_title=image_service.name, |
| 419 | 430 | service_name=image_service.name, |
| 420 | - abstract=image_service.description if image_service.description else "None" , | |
| 431 | + abstract= "None" , | |
| 421 | 432 | crs="ESPG:4326", |
| 422 | 433 | layer_name=image_service.name, |
| 423 | 434 | layer_title=image_service.name, | ... | ... |
| ... | ... | @@ -54,15 +54,17 @@ class ImageService(db.Model): |
| 54 | 54 | ''' |
| 55 | 55 | __tablename__ = 'dmap_image_service' |
| 56 | 56 | guid = Column(String(256), primary_key=True) |
| 57 | - | |
| 58 | - scheme_guid = Column(Text) | |
| 57 | + name = Column(String) | |
| 58 | + scheme_guid = Column(String) | |
| 59 | 59 | extent = Column(String(256)) |
| 60 | 60 | # node = Column(Integer) |
| 61 | 61 | #可视范围geojson |
| 62 | 62 | visual_region = Column(Text) |
| 63 | 63 | crs = Column(String(256)) |
| 64 | + create_time = Column(DateTime) | |
| 65 | + # service_guid = Column(String, ForeignKey('dmap_service.guid')) | |
| 64 | 66 | |
| 65 | - service_guid = Column(String, ForeignKey('dmap_service.guid')) | |
| 67 | + service_guid = Column(String) | |
| 66 | 68 | |
| 67 | 69 | images = db.relationship('Image', |
| 68 | 70 | secondary=dmap_image_rel, | ... | ... |
app/modules/service/image/testrpc.py
0 → 100644
| 1 | +# coding=utf-8 | |
| 2 | +#author: 4N | |
| 3 | +#createtime: 2021/9/26 | |
| 4 | +#email: nheweijun@sina.com | |
| 5 | + | |
| 6 | +from app.modules.service.image.tutorial.ttypes import RasterData | |
| 7 | + | |
| 8 | +from thrift.transport import TSocket | |
| 9 | +from thrift.transport import TTransport | |
| 10 | +from thrift.protocol import TBinaryProtocol | |
| 11 | +from app.modules.service.image.ImageDataService import ImageDataService | |
| 12 | +from app.modules.service.image.tutorial import Calculator | |
| 13 | + | |
| 14 | +from struct import Struct | |
| 15 | + | |
| 16 | +host = "192.168.184.246" | |
| 17 | +port = 9090 | |
| 18 | +transport: TSocket = TSocket.TSocket(host, port) | |
| 19 | +transport = TTransport.TBufferedTransport(transport) | |
| 20 | +protocol = TBinaryProtocol.TBinaryProtocol(transport) | |
| 21 | + | |
| 22 | +client = Calculator.Client(protocol) | |
| 23 | + | |
| 24 | + | |
| 25 | +transport.open() | |
| 26 | + | |
| 27 | +test = client.getData("江南_01.tif",[1340.27, -1911.31, 4351.79, 5410.6],[1340.27, -1911.31, 4351.79, 5410.6],[3,2,1],768,768) | |
| 28 | +print(type(test)) | |
| 29 | + | |
| 30 | + | |
| 31 | + | ... | ... |
| 1 | +#!/usr/bin/env python | |
| 2 | +# | |
| 3 | +# Autogenerated by Thrift Compiler (0.14.2) | |
| 4 | +# | |
| 5 | +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING | |
| 6 | +# | |
| 7 | +# options string: py | |
| 8 | +# | |
| 9 | + | |
| 10 | +import sys | |
| 11 | +import pprint | |
| 12 | +if sys.version_info[0] > 2: | |
| 13 | + from urllib.parse import urlparse | |
| 14 | +else: | |
| 15 | + from urlparse import urlparse | |
| 16 | +from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient | |
| 17 | +from thrift.protocol.TBinaryProtocol import TBinaryProtocol | |
| 18 | + | |
| 19 | +from . import Calculator | |
| 20 | +from .ttypes import * | |
| 21 | + | |
| 22 | +if len(sys.argv) <= 1 or sys.argv[1] == '--help': | |
| 23 | + print('') | |
| 24 | + print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]') | |
| 25 | + print('') | |
| 26 | + print('Functions:') | |
| 27 | + print(' RasterData getData(string path, queryRange, originRange, bands, i32 width, i32 height)') | |
| 28 | + print(' Raster getInfo(string path)') | |
| 29 | + print(' bool buildOverview(string path)') | |
| 30 | + print(' getImageList(string path)') | |
| 31 | + print('') | |
| 32 | + sys.exit(0) | |
| 33 | + | |
| 34 | +pp = pprint.PrettyPrinter(indent=2) | |
| 35 | +host = 'localhost' | |
| 36 | +port = 9090 | |
| 37 | +uri = '' | |
| 38 | +framed = False | |
| 39 | +ssl = False | |
| 40 | +validate = True | |
| 41 | +ca_certs = None | |
| 42 | +keyfile = None | |
| 43 | +certfile = None | |
| 44 | +http = False | |
| 45 | +argi = 1 | |
| 46 | + | |
| 47 | +if sys.argv[argi] == '-h': | |
| 48 | + parts = sys.argv[argi + 1].split(':') | |
| 49 | + host = parts[0] | |
| 50 | + if len(parts) > 1: | |
| 51 | + port = int(parts[1]) | |
| 52 | + argi += 2 | |
| 53 | + | |
| 54 | +if sys.argv[argi] == '-u': | |
| 55 | + url = urlparse(sys.argv[argi + 1]) | |
| 56 | + parts = url[1].split(':') | |
| 57 | + host = parts[0] | |
| 58 | + if len(parts) > 1: | |
| 59 | + port = int(parts[1]) | |
| 60 | + else: | |
| 61 | + port = 80 | |
| 62 | + uri = url[2] | |
| 63 | + if url[4]: | |
| 64 | + uri += '?%s' % url[4] | |
| 65 | + http = True | |
| 66 | + argi += 2 | |
| 67 | + | |
| 68 | +if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed': | |
| 69 | + framed = True | |
| 70 | + argi += 1 | |
| 71 | + | |
| 72 | +if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl': | |
| 73 | + ssl = True | |
| 74 | + argi += 1 | |
| 75 | + | |
| 76 | +if sys.argv[argi] == '-novalidate': | |
| 77 | + validate = False | |
| 78 | + argi += 1 | |
| 79 | + | |
| 80 | +if sys.argv[argi] == '-ca_certs': | |
| 81 | + ca_certs = sys.argv[argi+1] | |
| 82 | + argi += 2 | |
| 83 | + | |
| 84 | +if sys.argv[argi] == '-keyfile': | |
| 85 | + keyfile = sys.argv[argi+1] | |
| 86 | + argi += 2 | |
| 87 | + | |
| 88 | +if sys.argv[argi] == '-certfile': | |
| 89 | + certfile = sys.argv[argi+1] | |
| 90 | + argi += 2 | |
| 91 | + | |
| 92 | +cmd = sys.argv[argi] | |
| 93 | +args = sys.argv[argi + 1:] | |
| 94 | + | |
| 95 | +if http: | |
| 96 | + transport = THttpClient.THttpClient(host, port, uri) | |
| 97 | +else: | |
| 98 | + if ssl: | |
| 99 | + socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile) | |
| 100 | + else: | |
| 101 | + socket = TSocket.TSocket(host, port) | |
| 102 | + if framed: | |
| 103 | + transport = TTransport.TFramedTransport(socket) | |
| 104 | + else: | |
| 105 | + transport = TTransport.TBufferedTransport(socket) | |
| 106 | +protocol = TBinaryProtocol(transport) | |
| 107 | +client = Calculator.Client(protocol) | |
| 108 | +transport.open() | |
| 109 | + | |
| 110 | +if cmd == 'getData': | |
| 111 | + if len(args) != 6: | |
| 112 | + print('getData requires 6 args') | |
| 113 | + sys.exit(1) | |
| 114 | + pp.pprint(client.getData(args[0], eval(args[1]), eval(args[2]), eval(args[3]), eval(args[4]), eval(args[5]),)) | |
| 115 | + | |
| 116 | +elif cmd == 'getInfo': | |
| 117 | + if len(args) != 1: | |
| 118 | + print('getInfo requires 1 args') | |
| 119 | + sys.exit(1) | |
| 120 | + pp.pprint(client.getInfo(args[0],)) | |
| 121 | + | |
| 122 | +elif cmd == 'buildOverview': | |
| 123 | + if len(args) != 1: | |
| 124 | + print('buildOverview requires 1 args') | |
| 125 | + sys.exit(1) | |
| 126 | + pp.pprint(client.buildOverview(args[0],)) | |
| 127 | + | |
| 128 | +elif cmd == 'getImageList': | |
| 129 | + if len(args) != 1: | |
| 130 | + print('getImageList requires 1 args') | |
| 131 | + sys.exit(1) | |
| 132 | + pp.pprint(client.getImageList(args[0],)) | |
| 133 | + | |
| 134 | +else: | |
| 135 | + print('Unrecognized method %s' % cmd) | |
| 136 | + sys.exit(1) | |
| 137 | + | |
| 138 | +transport.close() | ... | ... |
| 1 | +# | |
| 2 | +# Autogenerated by Thrift Compiler (0.14.2) | |
| 3 | +# | |
| 4 | +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING | |
| 5 | +# | |
| 6 | +# options string: py | |
| 7 | +# | |
| 8 | + | |
| 9 | +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException | |
| 10 | +from thrift.protocol.TProtocol import TProtocolException | |
| 11 | +from thrift.TRecursive import fix_spec | |
| 12 | + | |
| 13 | +import sys | |
| 14 | +import logging | |
| 15 | +from .ttypes import * | |
| 16 | +from thrift.Thrift import TProcessor | |
| 17 | +from thrift.transport import TTransport | |
| 18 | +all_structs = [] | |
| 19 | + | |
| 20 | + | |
| 21 | +class Iface(object): | |
| 22 | + """ | |
| 23 | + Ahh, now onto the cool part, defining a service. Services just need a name | |
| 24 | + and can optionally inherit from another service using the extends keyword. | |
| 25 | + | |
| 26 | + """ | |
| 27 | + def getData(self, path, queryRange, originRange, bands, width, height): | |
| 28 | + """ | |
| 29 | + Parameters: | |
| 30 | + - path | |
| 31 | + - queryRange | |
| 32 | + - originRange | |
| 33 | + - bands | |
| 34 | + - width | |
| 35 | + - height | |
| 36 | + | |
| 37 | + """ | |
| 38 | + pass | |
| 39 | + | |
| 40 | + def getInfo(self, path): | |
| 41 | + """ | |
| 42 | + Parameters: | |
| 43 | + - path | |
| 44 | + | |
| 45 | + """ | |
| 46 | + pass | |
| 47 | + | |
| 48 | + def buildOverview(self, path): | |
| 49 | + """ | |
| 50 | + Parameters: | |
| 51 | + - path | |
| 52 | + | |
| 53 | + """ | |
| 54 | + pass | |
| 55 | + | |
| 56 | + def getImageList(self, path): | |
| 57 | + """ | |
| 58 | + Parameters: | |
| 59 | + - path | |
| 60 | + | |
| 61 | + """ | |
| 62 | + pass | |
| 63 | + | |
| 64 | + | |
| 65 | +class Client(Iface): | |
| 66 | + """ | |
| 67 | + Ahh, now onto the cool part, defining a service. Services just need a name | |
| 68 | + and can optionally inherit from another service using the extends keyword. | |
| 69 | + | |
| 70 | + """ | |
| 71 | + def __init__(self, iprot, oprot=None): | |
| 72 | + self._iprot = self._oprot = iprot | |
| 73 | + if oprot is not None: | |
| 74 | + self._oprot = oprot | |
| 75 | + self._seqid = 0 | |
| 76 | + | |
| 77 | + def getData(self, path, queryRange, originRange, bands, width, height): | |
| 78 | + """ | |
| 79 | + Parameters: | |
| 80 | + - path | |
| 81 | + - queryRange | |
| 82 | + - originRange | |
| 83 | + - bands | |
| 84 | + - width | |
| 85 | + - height | |
| 86 | + | |
| 87 | + """ | |
| 88 | + self.send_getData(path, queryRange, originRange, bands, width, height) | |
| 89 | + return self.recv_getData() | |
| 90 | + | |
| 91 | + def send_getData(self, path, queryRange, originRange, bands, width, height): | |
| 92 | + self._oprot.writeMessageBegin('getData', TMessageType.CALL, self._seqid) | |
| 93 | + args = getData_args() | |
| 94 | + args.path = path | |
| 95 | + args.queryRange = queryRange | |
| 96 | + args.originRange = originRange | |
| 97 | + args.bands = bands | |
| 98 | + args.width = width | |
| 99 | + args.height = height | |
| 100 | + args.write(self._oprot) | |
| 101 | + self._oprot.writeMessageEnd() | |
| 102 | + self._oprot.trans.flush() | |
| 103 | + | |
| 104 | + def recv_getData(self): | |
| 105 | + iprot = self._iprot | |
| 106 | + (fname, mtype, rseqid) = iprot.readMessageBegin() | |
| 107 | + if mtype == TMessageType.EXCEPTION: | |
| 108 | + x = TApplicationException() | |
| 109 | + x.read(iprot) | |
| 110 | + iprot.readMessageEnd() | |
| 111 | + raise x | |
| 112 | + result = getData_result() | |
| 113 | + result.read(iprot) | |
| 114 | + iprot.readMessageEnd() | |
| 115 | + if result.success is not None: | |
| 116 | + return result.success | |
| 117 | + raise TApplicationException(TApplicationException.MISSING_RESULT, "getData failed: unknown result") | |
| 118 | + | |
| 119 | + def getInfo(self, path): | |
| 120 | + """ | |
| 121 | + Parameters: | |
| 122 | + - path | |
| 123 | + | |
| 124 | + """ | |
| 125 | + self.send_getInfo(path) | |
| 126 | + return self.recv_getInfo() | |
| 127 | + | |
| 128 | + def send_getInfo(self, path): | |
| 129 | + self._oprot.writeMessageBegin('getInfo', TMessageType.CALL, self._seqid) | |
| 130 | + args = getInfo_args() | |
| 131 | + args.path = path | |
| 132 | + args.write(self._oprot) | |
| 133 | + self._oprot.writeMessageEnd() | |
| 134 | + self._oprot.trans.flush() | |
| 135 | + | |
| 136 | + def recv_getInfo(self): | |
| 137 | + iprot = self._iprot | |
| 138 | + (fname, mtype, rseqid) = iprot.readMessageBegin() | |
| 139 | + if mtype == TMessageType.EXCEPTION: | |
| 140 | + x = TApplicationException() | |
| 141 | + x.read(iprot) | |
| 142 | + iprot.readMessageEnd() | |
| 143 | + raise x | |
| 144 | + result = getInfo_result() | |
| 145 | + result.read(iprot) | |
| 146 | + iprot.readMessageEnd() | |
| 147 | + if result.success is not None: | |
| 148 | + return result.success | |
| 149 | + raise TApplicationException(TApplicationException.MISSING_RESULT, "getInfo failed: unknown result") | |
| 150 | + | |
| 151 | + def buildOverview(self, path): | |
| 152 | + """ | |
| 153 | + Parameters: | |
| 154 | + - path | |
| 155 | + | |
| 156 | + """ | |
| 157 | + self.send_buildOverview(path) | |
| 158 | + return self.recv_buildOverview() | |
| 159 | + | |
| 160 | + def send_buildOverview(self, path): | |
| 161 | + self._oprot.writeMessageBegin('buildOverview', TMessageType.CALL, self._seqid) | |
| 162 | + args = buildOverview_args() | |
| 163 | + args.path = path | |
| 164 | + args.write(self._oprot) | |
| 165 | + self._oprot.writeMessageEnd() | |
| 166 | + self._oprot.trans.flush() | |
| 167 | + | |
| 168 | + def recv_buildOverview(self): | |
| 169 | + iprot = self._iprot | |
| 170 | + (fname, mtype, rseqid) = iprot.readMessageBegin() | |
| 171 | + if mtype == TMessageType.EXCEPTION: | |
| 172 | + x = TApplicationException() | |
| 173 | + x.read(iprot) | |
| 174 | + iprot.readMessageEnd() | |
| 175 | + raise x | |
| 176 | + result = buildOverview_result() | |
| 177 | + result.read(iprot) | |
| 178 | + iprot.readMessageEnd() | |
| 179 | + if result.success is not None: | |
| 180 | + return result.success | |
| 181 | + raise TApplicationException(TApplicationException.MISSING_RESULT, "buildOverview failed: unknown result") | |
| 182 | + | |
| 183 | + def getImageList(self, path): | |
| 184 | + """ | |
| 185 | + Parameters: | |
| 186 | + - path | |
| 187 | + | |
| 188 | + """ | |
| 189 | + self.send_getImageList(path) | |
| 190 | + return self.recv_getImageList() | |
| 191 | + | |
| 192 | + def send_getImageList(self, path): | |
| 193 | + self._oprot.writeMessageBegin('getImageList', TMessageType.CALL, self._seqid) | |
| 194 | + args = getImageList_args() | |
| 195 | + args.path = path | |
| 196 | + args.write(self._oprot) | |
| 197 | + self._oprot.writeMessageEnd() | |
| 198 | + self._oprot.trans.flush() | |
| 199 | + | |
| 200 | + def recv_getImageList(self): | |
| 201 | + iprot = self._iprot | |
| 202 | + (fname, mtype, rseqid) = iprot.readMessageBegin() | |
| 203 | + if mtype == TMessageType.EXCEPTION: | |
| 204 | + x = TApplicationException() | |
| 205 | + x.read(iprot) | |
| 206 | + iprot.readMessageEnd() | |
| 207 | + raise x | |
| 208 | + result = getImageList_result() | |
| 209 | + result.read(iprot) | |
| 210 | + iprot.readMessageEnd() | |
| 211 | + if result.success is not None: | |
| 212 | + return result.success | |
| 213 | + raise TApplicationException(TApplicationException.MISSING_RESULT, "getImageList failed: unknown result") | |
| 214 | + | |
| 215 | + | |
| 216 | +class Processor(Iface, TProcessor): | |
| 217 | + def __init__(self, handler): | |
| 218 | + self._handler = handler | |
| 219 | + self._processMap = {} | |
| 220 | + self._processMap["getData"] = Processor.process_getData | |
| 221 | + self._processMap["getInfo"] = Processor.process_getInfo | |
| 222 | + self._processMap["buildOverview"] = Processor.process_buildOverview | |
| 223 | + self._processMap["getImageList"] = Processor.process_getImageList | |
| 224 | + self._on_message_begin = None | |
| 225 | + | |
| 226 | + def on_message_begin(self, func): | |
| 227 | + self._on_message_begin = func | |
| 228 | + | |
| 229 | + def process(self, iprot, oprot): | |
| 230 | + (name, type, seqid) = iprot.readMessageBegin() | |
| 231 | + if self._on_message_begin: | |
| 232 | + self._on_message_begin(name, type, seqid) | |
| 233 | + if name not in self._processMap: | |
| 234 | + iprot.skip(TType.STRUCT) | |
| 235 | + iprot.readMessageEnd() | |
| 236 | + x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name)) | |
| 237 | + oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid) | |
| 238 | + x.write(oprot) | |
| 239 | + oprot.writeMessageEnd() | |
| 240 | + oprot.trans.flush() | |
| 241 | + return | |
| 242 | + else: | |
| 243 | + self._processMap[name](self, seqid, iprot, oprot) | |
| 244 | + return True | |
| 245 | + | |
| 246 | + def process_getData(self, seqid, iprot, oprot): | |
| 247 | + args = getData_args() | |
| 248 | + args.read(iprot) | |
| 249 | + iprot.readMessageEnd() | |
| 250 | + result = getData_result() | |
| 251 | + try: | |
| 252 | + result.success = self._handler.getData(args.path, args.queryRange, args.originRange, args.bands, args.width, args.height) | |
| 253 | + msg_type = TMessageType.REPLY | |
| 254 | + except TTransport.TTransportException: | |
| 255 | + raise | |
| 256 | + except TApplicationException as ex: | |
| 257 | + logging.exception('TApplication exception in handler') | |
| 258 | + msg_type = TMessageType.EXCEPTION | |
| 259 | + result = ex | |
| 260 | + except Exception: | |
| 261 | + logging.exception('Unexpected exception in handler') | |
| 262 | + msg_type = TMessageType.EXCEPTION | |
| 263 | + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') | |
| 264 | + oprot.writeMessageBegin("getData", msg_type, seqid) | |
| 265 | + result.write(oprot) | |
| 266 | + oprot.writeMessageEnd() | |
| 267 | + oprot.trans.flush() | |
| 268 | + | |
| 269 | + def process_getInfo(self, seqid, iprot, oprot): | |
| 270 | + args = getInfo_args() | |
| 271 | + args.read(iprot) | |
| 272 | + iprot.readMessageEnd() | |
| 273 | + result = getInfo_result() | |
| 274 | + try: | |
| 275 | + result.success = self._handler.getInfo(args.path) | |
| 276 | + msg_type = TMessageType.REPLY | |
| 277 | + except TTransport.TTransportException: | |
| 278 | + raise | |
| 279 | + except TApplicationException as ex: | |
| 280 | + logging.exception('TApplication exception in handler') | |
| 281 | + msg_type = TMessageType.EXCEPTION | |
| 282 | + result = ex | |
| 283 | + except Exception: | |
| 284 | + logging.exception('Unexpected exception in handler') | |
| 285 | + msg_type = TMessageType.EXCEPTION | |
| 286 | + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') | |
| 287 | + oprot.writeMessageBegin("getInfo", msg_type, seqid) | |
| 288 | + result.write(oprot) | |
| 289 | + oprot.writeMessageEnd() | |
| 290 | + oprot.trans.flush() | |
| 291 | + | |
| 292 | + def process_buildOverview(self, seqid, iprot, oprot): | |
| 293 | + args = buildOverview_args() | |
| 294 | + args.read(iprot) | |
| 295 | + iprot.readMessageEnd() | |
| 296 | + result = buildOverview_result() | |
| 297 | + try: | |
| 298 | + result.success = self._handler.buildOverview(args.path) | |
| 299 | + msg_type = TMessageType.REPLY | |
| 300 | + except TTransport.TTransportException: | |
| 301 | + raise | |
| 302 | + except TApplicationException as ex: | |
| 303 | + logging.exception('TApplication exception in handler') | |
| 304 | + msg_type = TMessageType.EXCEPTION | |
| 305 | + result = ex | |
| 306 | + except Exception: | |
| 307 | + logging.exception('Unexpected exception in handler') | |
| 308 | + msg_type = TMessageType.EXCEPTION | |
| 309 | + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') | |
| 310 | + oprot.writeMessageBegin("buildOverview", msg_type, seqid) | |
| 311 | + result.write(oprot) | |
| 312 | + oprot.writeMessageEnd() | |
| 313 | + oprot.trans.flush() | |
| 314 | + | |
| 315 | + def process_getImageList(self, seqid, iprot, oprot): | |
| 316 | + args = getImageList_args() | |
| 317 | + args.read(iprot) | |
| 318 | + iprot.readMessageEnd() | |
| 319 | + result = getImageList_result() | |
| 320 | + try: | |
| 321 | + result.success = self._handler.getImageList(args.path) | |
| 322 | + msg_type = TMessageType.REPLY | |
| 323 | + except TTransport.TTransportException: | |
| 324 | + raise | |
| 325 | + except TApplicationException as ex: | |
| 326 | + logging.exception('TApplication exception in handler') | |
| 327 | + msg_type = TMessageType.EXCEPTION | |
| 328 | + result = ex | |
| 329 | + except Exception: | |
| 330 | + logging.exception('Unexpected exception in handler') | |
| 331 | + msg_type = TMessageType.EXCEPTION | |
| 332 | + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') | |
| 333 | + oprot.writeMessageBegin("getImageList", msg_type, seqid) | |
| 334 | + result.write(oprot) | |
| 335 | + oprot.writeMessageEnd() | |
| 336 | + oprot.trans.flush() | |
| 337 | + | |
| 338 | +# HELPER FUNCTIONS AND STRUCTURES | |
| 339 | + | |
| 340 | + | |
| 341 | +class getData_args(object): | |
| 342 | + """ | |
| 343 | + Attributes: | |
| 344 | + - path | |
| 345 | + - queryRange | |
| 346 | + - originRange | |
| 347 | + - bands | |
| 348 | + - width | |
| 349 | + - height | |
| 350 | + | |
| 351 | + """ | |
| 352 | + | |
| 353 | + | |
| 354 | + def __init__(self, path=None, queryRange=None, originRange=None, bands=None, width=None, height=None,): | |
| 355 | + self.path = path | |
| 356 | + self.queryRange = queryRange | |
| 357 | + self.originRange = originRange | |
| 358 | + self.bands = bands | |
| 359 | + self.width = width | |
| 360 | + self.height = height | |
| 361 | + | |
| 362 | + def read(self, iprot): | |
| 363 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 364 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 365 | + return | |
| 366 | + iprot.readStructBegin() | |
| 367 | + while True: | |
| 368 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 369 | + if ftype == TType.STOP: | |
| 370 | + break | |
| 371 | + if fid == 1: | |
| 372 | + if ftype == TType.STRING: | |
| 373 | + self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 374 | + else: | |
| 375 | + iprot.skip(ftype) | |
| 376 | + elif fid == 2: | |
| 377 | + if ftype == TType.LIST: | |
| 378 | + self.queryRange = [] | |
| 379 | + (_etype38, _size35) = iprot.readListBegin() | |
| 380 | + for _i39 in range(_size35): | |
| 381 | + _elem40 = iprot.readDouble() | |
| 382 | + self.queryRange.append(_elem40) | |
| 383 | + iprot.readListEnd() | |
| 384 | + else: | |
| 385 | + iprot.skip(ftype) | |
| 386 | + elif fid == 3: | |
| 387 | + if ftype == TType.LIST: | |
| 388 | + self.originRange = [] | |
| 389 | + (_etype44, _size41) = iprot.readListBegin() | |
| 390 | + for _i45 in range(_size41): | |
| 391 | + _elem46 = iprot.readDouble() | |
| 392 | + self.originRange.append(_elem46) | |
| 393 | + iprot.readListEnd() | |
| 394 | + else: | |
| 395 | + iprot.skip(ftype) | |
| 396 | + elif fid == 4: | |
| 397 | + if ftype == TType.LIST: | |
| 398 | + self.bands = [] | |
| 399 | + (_etype50, _size47) = iprot.readListBegin() | |
| 400 | + for _i51 in range(_size47): | |
| 401 | + _elem52 = iprot.readI32() | |
| 402 | + self.bands.append(_elem52) | |
| 403 | + iprot.readListEnd() | |
| 404 | + else: | |
| 405 | + iprot.skip(ftype) | |
| 406 | + elif fid == 5: | |
| 407 | + if ftype == TType.I32: | |
| 408 | + self.width = iprot.readI32() | |
| 409 | + else: | |
| 410 | + iprot.skip(ftype) | |
| 411 | + elif fid == 6: | |
| 412 | + if ftype == TType.I32: | |
| 413 | + self.height = iprot.readI32() | |
| 414 | + else: | |
| 415 | + iprot.skip(ftype) | |
| 416 | + else: | |
| 417 | + iprot.skip(ftype) | |
| 418 | + iprot.readFieldEnd() | |
| 419 | + iprot.readStructEnd() | |
| 420 | + | |
| 421 | + def write(self, oprot): | |
| 422 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 423 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 424 | + return | |
| 425 | + oprot.writeStructBegin('getData_args') | |
| 426 | + if self.path is not None: | |
| 427 | + oprot.writeFieldBegin('path', TType.STRING, 1) | |
| 428 | + oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path) | |
| 429 | + oprot.writeFieldEnd() | |
| 430 | + if self.queryRange is not None: | |
| 431 | + oprot.writeFieldBegin('queryRange', TType.LIST, 2) | |
| 432 | + oprot.writeListBegin(TType.DOUBLE, len(self.queryRange)) | |
| 433 | + for iter53 in self.queryRange: | |
| 434 | + oprot.writeDouble(iter53) | |
| 435 | + oprot.writeListEnd() | |
| 436 | + oprot.writeFieldEnd() | |
| 437 | + if self.originRange is not None: | |
| 438 | + oprot.writeFieldBegin('originRange', TType.LIST, 3) | |
| 439 | + oprot.writeListBegin(TType.DOUBLE, len(self.originRange)) | |
| 440 | + for iter54 in self.originRange: | |
| 441 | + oprot.writeDouble(iter54) | |
| 442 | + oprot.writeListEnd() | |
| 443 | + oprot.writeFieldEnd() | |
| 444 | + if self.bands is not None: | |
| 445 | + oprot.writeFieldBegin('bands', TType.LIST, 4) | |
| 446 | + oprot.writeListBegin(TType.I32, len(self.bands)) | |
| 447 | + for iter55 in self.bands: | |
| 448 | + oprot.writeI32(iter55) | |
| 449 | + oprot.writeListEnd() | |
| 450 | + oprot.writeFieldEnd() | |
| 451 | + if self.width is not None: | |
| 452 | + oprot.writeFieldBegin('width', TType.I32, 5) | |
| 453 | + oprot.writeI32(self.width) | |
| 454 | + oprot.writeFieldEnd() | |
| 455 | + if self.height is not None: | |
| 456 | + oprot.writeFieldBegin('height', TType.I32, 6) | |
| 457 | + oprot.writeI32(self.height) | |
| 458 | + oprot.writeFieldEnd() | |
| 459 | + oprot.writeFieldStop() | |
| 460 | + oprot.writeStructEnd() | |
| 461 | + | |
| 462 | + def validate(self): | |
| 463 | + return | |
| 464 | + | |
| 465 | + def __repr__(self): | |
| 466 | + L = ['%s=%r' % (key, value) | |
| 467 | + for key, value in self.__dict__.items()] | |
| 468 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 469 | + | |
| 470 | + def __eq__(self, other): | |
| 471 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 472 | + | |
| 473 | + def __ne__(self, other): | |
| 474 | + return not (self == other) | |
| 475 | +all_structs.append(getData_args) | |
| 476 | +getData_args.thrift_spec = ( | |
| 477 | + None, # 0 | |
| 478 | + (1, TType.STRING, 'path', 'UTF8', None, ), # 1 | |
| 479 | + (2, TType.LIST, 'queryRange', (TType.DOUBLE, None, False), None, ), # 2 | |
| 480 | + (3, TType.LIST, 'originRange', (TType.DOUBLE, None, False), None, ), # 3 | |
| 481 | + (4, TType.LIST, 'bands', (TType.I32, None, False), None, ), # 4 | |
| 482 | + (5, TType.I32, 'width', None, None, ), # 5 | |
| 483 | + (6, TType.I32, 'height', None, None, ), # 6 | |
| 484 | +) | |
| 485 | + | |
| 486 | + | |
| 487 | +class getData_result(object): | |
| 488 | + """ | |
| 489 | + Attributes: | |
| 490 | + - success | |
| 491 | + | |
| 492 | + """ | |
| 493 | + | |
| 494 | + | |
| 495 | + def __init__(self, success=None,): | |
| 496 | + self.success = success | |
| 497 | + | |
| 498 | + def read(self, iprot): | |
| 499 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 500 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 501 | + return | |
| 502 | + iprot.readStructBegin() | |
| 503 | + while True: | |
| 504 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 505 | + if ftype == TType.STOP: | |
| 506 | + break | |
| 507 | + if fid == 0: | |
| 508 | + if ftype == TType.STRUCT: | |
| 509 | + self.success = RasterData() | |
| 510 | + self.success.read(iprot) | |
| 511 | + else: | |
| 512 | + iprot.skip(ftype) | |
| 513 | + else: | |
| 514 | + iprot.skip(ftype) | |
| 515 | + iprot.readFieldEnd() | |
| 516 | + iprot.readStructEnd() | |
| 517 | + | |
| 518 | + def write(self, oprot): | |
| 519 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 520 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 521 | + return | |
| 522 | + oprot.writeStructBegin('getData_result') | |
| 523 | + if self.success is not None: | |
| 524 | + oprot.writeFieldBegin('success', TType.STRUCT, 0) | |
| 525 | + self.success.write(oprot) | |
| 526 | + oprot.writeFieldEnd() | |
| 527 | + oprot.writeFieldStop() | |
| 528 | + oprot.writeStructEnd() | |
| 529 | + | |
| 530 | + def validate(self): | |
| 531 | + return | |
| 532 | + | |
| 533 | + def __repr__(self): | |
| 534 | + L = ['%s=%r' % (key, value) | |
| 535 | + for key, value in self.__dict__.items()] | |
| 536 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 537 | + | |
| 538 | + def __eq__(self, other): | |
| 539 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 540 | + | |
| 541 | + def __ne__(self, other): | |
| 542 | + return not (self == other) | |
| 543 | +all_structs.append(getData_result) | |
| 544 | +getData_result.thrift_spec = ( | |
| 545 | + (0, TType.STRUCT, 'success', [RasterData, None], None, ), # 0 | |
| 546 | +) | |
| 547 | + | |
| 548 | + | |
| 549 | +class getInfo_args(object): | |
| 550 | + """ | |
| 551 | + Attributes: | |
| 552 | + - path | |
| 553 | + | |
| 554 | + """ | |
| 555 | + | |
| 556 | + | |
| 557 | + def __init__(self, path=None,): | |
| 558 | + self.path = path | |
| 559 | + | |
| 560 | + def read(self, iprot): | |
| 561 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 562 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 563 | + return | |
| 564 | + iprot.readStructBegin() | |
| 565 | + while True: | |
| 566 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 567 | + if ftype == TType.STOP: | |
| 568 | + break | |
| 569 | + if fid == 1: | |
| 570 | + if ftype == TType.STRING: | |
| 571 | + self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 572 | + else: | |
| 573 | + iprot.skip(ftype) | |
| 574 | + else: | |
| 575 | + iprot.skip(ftype) | |
| 576 | + iprot.readFieldEnd() | |
| 577 | + iprot.readStructEnd() | |
| 578 | + | |
| 579 | + def write(self, oprot): | |
| 580 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 581 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 582 | + return | |
| 583 | + oprot.writeStructBegin('getInfo_args') | |
| 584 | + if self.path is not None: | |
| 585 | + oprot.writeFieldBegin('path', TType.STRING, 1) | |
| 586 | + oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path) | |
| 587 | + oprot.writeFieldEnd() | |
| 588 | + oprot.writeFieldStop() | |
| 589 | + oprot.writeStructEnd() | |
| 590 | + | |
| 591 | + def validate(self): | |
| 592 | + return | |
| 593 | + | |
| 594 | + def __repr__(self): | |
| 595 | + L = ['%s=%r' % (key, value) | |
| 596 | + for key, value in self.__dict__.items()] | |
| 597 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 598 | + | |
| 599 | + def __eq__(self, other): | |
| 600 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 601 | + | |
| 602 | + def __ne__(self, other): | |
| 603 | + return not (self == other) | |
| 604 | +all_structs.append(getInfo_args) | |
| 605 | +getInfo_args.thrift_spec = ( | |
| 606 | + None, # 0 | |
| 607 | + (1, TType.STRING, 'path', 'UTF8', None, ), # 1 | |
| 608 | +) | |
| 609 | + | |
| 610 | + | |
| 611 | +class getInfo_result(object): | |
| 612 | + """ | |
| 613 | + Attributes: | |
| 614 | + - success | |
| 615 | + | |
| 616 | + """ | |
| 617 | + | |
| 618 | + | |
| 619 | + def __init__(self, success=None,): | |
| 620 | + self.success = success | |
| 621 | + | |
| 622 | + def read(self, iprot): | |
| 623 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 624 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 625 | + return | |
| 626 | + iprot.readStructBegin() | |
| 627 | + while True: | |
| 628 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 629 | + if ftype == TType.STOP: | |
| 630 | + break | |
| 631 | + if fid == 0: | |
| 632 | + if ftype == TType.STRUCT: | |
| 633 | + self.success = Raster() | |
| 634 | + self.success.read(iprot) | |
| 635 | + else: | |
| 636 | + iprot.skip(ftype) | |
| 637 | + else: | |
| 638 | + iprot.skip(ftype) | |
| 639 | + iprot.readFieldEnd() | |
| 640 | + iprot.readStructEnd() | |
| 641 | + | |
| 642 | + def write(self, oprot): | |
| 643 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 644 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 645 | + return | |
| 646 | + oprot.writeStructBegin('getInfo_result') | |
| 647 | + if self.success is not None: | |
| 648 | + oprot.writeFieldBegin('success', TType.STRUCT, 0) | |
| 649 | + self.success.write(oprot) | |
| 650 | + oprot.writeFieldEnd() | |
| 651 | + oprot.writeFieldStop() | |
| 652 | + oprot.writeStructEnd() | |
| 653 | + | |
| 654 | + def validate(self): | |
| 655 | + return | |
| 656 | + | |
| 657 | + def __repr__(self): | |
| 658 | + L = ['%s=%r' % (key, value) | |
| 659 | + for key, value in self.__dict__.items()] | |
| 660 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 661 | + | |
| 662 | + def __eq__(self, other): | |
| 663 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 664 | + | |
| 665 | + def __ne__(self, other): | |
| 666 | + return not (self == other) | |
| 667 | +all_structs.append(getInfo_result) | |
| 668 | +getInfo_result.thrift_spec = ( | |
| 669 | + (0, TType.STRUCT, 'success', [Raster, None], None, ), # 0 | |
| 670 | +) | |
| 671 | + | |
| 672 | + | |
| 673 | +class buildOverview_args(object): | |
| 674 | + """ | |
| 675 | + Attributes: | |
| 676 | + - path | |
| 677 | + | |
| 678 | + """ | |
| 679 | + | |
| 680 | + | |
| 681 | + def __init__(self, path=None,): | |
| 682 | + self.path = path | |
| 683 | + | |
| 684 | + def read(self, iprot): | |
| 685 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 686 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 687 | + return | |
| 688 | + iprot.readStructBegin() | |
| 689 | + while True: | |
| 690 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 691 | + if ftype == TType.STOP: | |
| 692 | + break | |
| 693 | + if fid == 1: | |
| 694 | + if ftype == TType.STRING: | |
| 695 | + self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 696 | + else: | |
| 697 | + iprot.skip(ftype) | |
| 698 | + else: | |
| 699 | + iprot.skip(ftype) | |
| 700 | + iprot.readFieldEnd() | |
| 701 | + iprot.readStructEnd() | |
| 702 | + | |
| 703 | + def write(self, oprot): | |
| 704 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 705 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 706 | + return | |
| 707 | + oprot.writeStructBegin('buildOverview_args') | |
| 708 | + if self.path is not None: | |
| 709 | + oprot.writeFieldBegin('path', TType.STRING, 1) | |
| 710 | + oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path) | |
| 711 | + oprot.writeFieldEnd() | |
| 712 | + oprot.writeFieldStop() | |
| 713 | + oprot.writeStructEnd() | |
| 714 | + | |
| 715 | + def validate(self): | |
| 716 | + return | |
| 717 | + | |
| 718 | + def __repr__(self): | |
| 719 | + L = ['%s=%r' % (key, value) | |
| 720 | + for key, value in self.__dict__.items()] | |
| 721 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 722 | + | |
| 723 | + def __eq__(self, other): | |
| 724 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 725 | + | |
| 726 | + def __ne__(self, other): | |
| 727 | + return not (self == other) | |
| 728 | +all_structs.append(buildOverview_args) | |
| 729 | +buildOverview_args.thrift_spec = ( | |
| 730 | + None, # 0 | |
| 731 | + (1, TType.STRING, 'path', 'UTF8', None, ), # 1 | |
| 732 | +) | |
| 733 | + | |
| 734 | + | |
| 735 | +class buildOverview_result(object): | |
| 736 | + """ | |
| 737 | + Attributes: | |
| 738 | + - success | |
| 739 | + | |
| 740 | + """ | |
| 741 | + | |
| 742 | + | |
| 743 | + def __init__(self, success=None,): | |
| 744 | + self.success = success | |
| 745 | + | |
| 746 | + def read(self, iprot): | |
| 747 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 748 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 749 | + return | |
| 750 | + iprot.readStructBegin() | |
| 751 | + while True: | |
| 752 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 753 | + if ftype == TType.STOP: | |
| 754 | + break | |
| 755 | + if fid == 0: | |
| 756 | + if ftype == TType.BOOL: | |
| 757 | + self.success = iprot.readBool() | |
| 758 | + else: | |
| 759 | + iprot.skip(ftype) | |
| 760 | + else: | |
| 761 | + iprot.skip(ftype) | |
| 762 | + iprot.readFieldEnd() | |
| 763 | + iprot.readStructEnd() | |
| 764 | + | |
| 765 | + def write(self, oprot): | |
| 766 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 767 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 768 | + return | |
| 769 | + oprot.writeStructBegin('buildOverview_result') | |
| 770 | + if self.success is not None: | |
| 771 | + oprot.writeFieldBegin('success', TType.BOOL, 0) | |
| 772 | + oprot.writeBool(self.success) | |
| 773 | + oprot.writeFieldEnd() | |
| 774 | + oprot.writeFieldStop() | |
| 775 | + oprot.writeStructEnd() | |
| 776 | + | |
| 777 | + def validate(self): | |
| 778 | + return | |
| 779 | + | |
| 780 | + def __repr__(self): | |
| 781 | + L = ['%s=%r' % (key, value) | |
| 782 | + for key, value in self.__dict__.items()] | |
| 783 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 784 | + | |
| 785 | + def __eq__(self, other): | |
| 786 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 787 | + | |
| 788 | + def __ne__(self, other): | |
| 789 | + return not (self == other) | |
| 790 | +all_structs.append(buildOverview_result) | |
| 791 | +buildOverview_result.thrift_spec = ( | |
| 792 | + (0, TType.BOOL, 'success', None, None, ), # 0 | |
| 793 | +) | |
| 794 | + | |
| 795 | + | |
| 796 | +class getImageList_args(object): | |
| 797 | + """ | |
| 798 | + Attributes: | |
| 799 | + - path | |
| 800 | + | |
| 801 | + """ | |
| 802 | + | |
| 803 | + | |
| 804 | + def __init__(self, path=None,): | |
| 805 | + self.path = path | |
| 806 | + | |
| 807 | + def read(self, iprot): | |
| 808 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 809 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 810 | + return | |
| 811 | + iprot.readStructBegin() | |
| 812 | + while True: | |
| 813 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 814 | + if ftype == TType.STOP: | |
| 815 | + break | |
| 816 | + if fid == 1: | |
| 817 | + if ftype == TType.STRING: | |
| 818 | + self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 819 | + else: | |
| 820 | + iprot.skip(ftype) | |
| 821 | + else: | |
| 822 | + iprot.skip(ftype) | |
| 823 | + iprot.readFieldEnd() | |
| 824 | + iprot.readStructEnd() | |
| 825 | + | |
| 826 | + def write(self, oprot): | |
| 827 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 828 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 829 | + return | |
| 830 | + oprot.writeStructBegin('getImageList_args') | |
| 831 | + if self.path is not None: | |
| 832 | + oprot.writeFieldBegin('path', TType.STRING, 1) | |
| 833 | + oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path) | |
| 834 | + oprot.writeFieldEnd() | |
| 835 | + oprot.writeFieldStop() | |
| 836 | + oprot.writeStructEnd() | |
| 837 | + | |
| 838 | + def validate(self): | |
| 839 | + return | |
| 840 | + | |
| 841 | + def __repr__(self): | |
| 842 | + L = ['%s=%r' % (key, value) | |
| 843 | + for key, value in self.__dict__.items()] | |
| 844 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 845 | + | |
| 846 | + def __eq__(self, other): | |
| 847 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 848 | + | |
| 849 | + def __ne__(self, other): | |
| 850 | + return not (self == other) | |
| 851 | +all_structs.append(getImageList_args) | |
| 852 | +getImageList_args.thrift_spec = ( | |
| 853 | + None, # 0 | |
| 854 | + (1, TType.STRING, 'path', 'UTF8', None, ), # 1 | |
| 855 | +) | |
| 856 | + | |
| 857 | + | |
| 858 | +class getImageList_result(object): | |
| 859 | + """ | |
| 860 | + Attributes: | |
| 861 | + - success | |
| 862 | + | |
| 863 | + """ | |
| 864 | + | |
| 865 | + | |
| 866 | + def __init__(self, success=None,): | |
| 867 | + self.success = success | |
| 868 | + | |
| 869 | + def read(self, iprot): | |
| 870 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 871 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 872 | + return | |
| 873 | + iprot.readStructBegin() | |
| 874 | + while True: | |
| 875 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 876 | + if ftype == TType.STOP: | |
| 877 | + break | |
| 878 | + if fid == 0: | |
| 879 | + if ftype == TType.LIST: | |
| 880 | + self.success = [] | |
| 881 | + (_etype59, _size56) = iprot.readListBegin() | |
| 882 | + for _i60 in range(_size56): | |
| 883 | + _elem61 = Image() | |
| 884 | + _elem61.read(iprot) | |
| 885 | + self.success.append(_elem61) | |
| 886 | + iprot.readListEnd() | |
| 887 | + else: | |
| 888 | + iprot.skip(ftype) | |
| 889 | + else: | |
| 890 | + iprot.skip(ftype) | |
| 891 | + iprot.readFieldEnd() | |
| 892 | + iprot.readStructEnd() | |
| 893 | + | |
| 894 | + def write(self, oprot): | |
| 895 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 896 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 897 | + return | |
| 898 | + oprot.writeStructBegin('getImageList_result') | |
| 899 | + if self.success is not None: | |
| 900 | + oprot.writeFieldBegin('success', TType.LIST, 0) | |
| 901 | + oprot.writeListBegin(TType.STRUCT, len(self.success)) | |
| 902 | + for iter62 in self.success: | |
| 903 | + iter62.write(oprot) | |
| 904 | + oprot.writeListEnd() | |
| 905 | + oprot.writeFieldEnd() | |
| 906 | + oprot.writeFieldStop() | |
| 907 | + oprot.writeStructEnd() | |
| 908 | + | |
| 909 | + def validate(self): | |
| 910 | + return | |
| 911 | + | |
| 912 | + def __repr__(self): | |
| 913 | + L = ['%s=%r' % (key, value) | |
| 914 | + for key, value in self.__dict__.items()] | |
| 915 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 916 | + | |
| 917 | + def __eq__(self, other): | |
| 918 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 919 | + | |
| 920 | + def __ne__(self, other): | |
| 921 | + return not (self == other) | |
| 922 | +all_structs.append(getImageList_result) | |
| 923 | +getImageList_result.thrift_spec = ( | |
| 924 | + (0, TType.LIST, 'success', (TType.STRUCT, [Image, None], False), None, ), # 0 | |
| 925 | +) | |
| 926 | +fix_spec(all_structs) | |
| 927 | +del all_structs | ... | ... |
| 1 | +__all__ = ['ttypes', 'constants', 'Calculator'] | ... | ... |
| 1 | +# | |
| 2 | +# Autogenerated by Thrift Compiler (0.14.2) | |
| 3 | +# | |
| 4 | +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING | |
| 5 | +# | |
| 6 | +# options string: py | |
| 7 | +# | |
| 8 | + | |
| 9 | +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException | |
| 10 | +from thrift.protocol.TProtocol import TProtocolException | |
| 11 | +from thrift.TRecursive import fix_spec | |
| 12 | + | |
| 13 | +import sys | |
| 14 | +from .ttypes import * | ... | ... |
app/modules/service/image/tutorial/test.py
0 → 100644
| 1 | +# coding=utf-8 | |
| 2 | +#author: 4N | |
| 3 | +#createtime: 2021/9/27 | |
| 4 | +#email: nheweijun@sina.com | |
| 5 | + | |
| 6 | + | |
| 7 | +# from .ttypes import RasterData | |
| 8 | + | |
| 9 | +from thrift.transport import TSocket | |
| 10 | +from thrift.transport import TTransport | |
| 11 | +from thrift.protocol import TBinaryProtocol | |
| 12 | +from app.modules.service.image.ImageDataService import ImageDataService | |
| 13 | +from . import Calculator | |
| 14 | + | |
| 15 | +from struct import Struct | |
| 16 | + | |
| 17 | +host = 1 | |
| 18 | +port = 9090 | |
| 19 | +transport: TSocket = TSocket.TSocket(host, port) | |
| 20 | +transport = TTransport.TBufferedTransport(transport) | |
| 21 | +protocol = TBinaryProtocol.TBinaryProtocol(transport) | |
| 22 | + | |
| 23 | +client = Calculator.Client(protocol) | |
| 24 | + | |
| 25 | + | |
| 26 | +transport.open() | |
| 27 | + | |
| 28 | +test = client.getData("江南_01.tif",[1340.27, -1911.31, 4351.79, 5410.6],[1340.27, -1911.31, 4351.79, 5410.6],[3,2,1],768,768) | |
| 29 | +print(type(test)) | |
| \ No newline at end of file | ... | ... |
app/modules/service/image/tutorial/ttypes.py
0 → 100644
| 1 | +# | |
| 2 | +# Autogenerated by Thrift Compiler (0.14.2) | |
| 3 | +# | |
| 4 | +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING | |
| 5 | +# | |
| 6 | +# options string: py | |
| 7 | +# | |
| 8 | + | |
| 9 | +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException | |
| 10 | +from thrift.protocol.TProtocol import TProtocolException | |
| 11 | +from thrift.TRecursive import fix_spec | |
| 12 | + | |
| 13 | +import sys | |
| 14 | + | |
| 15 | +from thrift.transport import TTransport | |
| 16 | +all_structs = [] | |
| 17 | + | |
| 18 | + | |
| 19 | +class Image(object): | |
| 20 | + """ | |
| 21 | + Structs are the basic complex data structures. They are comprised of fields | |
| 22 | + which each have an integer identifier, a type, a symbolic name, and an | |
| 23 | + optional default value. | |
| 24 | + | |
| 25 | + Fields can be declared "optional", which ensures they will not be included | |
| 26 | + in the serialized output if they aren't set. Note that this requires some | |
| 27 | + manual management in some languages. | |
| 28 | + | |
| 29 | + Attributes: | |
| 30 | + - name | |
| 31 | + - path | |
| 32 | + - size | |
| 33 | + - create_time | |
| 34 | + - type | |
| 35 | + | |
| 36 | + """ | |
| 37 | + | |
| 38 | + | |
| 39 | + def __init__(self, name=None, path=None, size=None, create_time=None, type=None,): | |
| 40 | + self.name = name | |
| 41 | + self.path = path | |
| 42 | + self.size = size | |
| 43 | + self.create_time = create_time | |
| 44 | + self.type = type | |
| 45 | + | |
| 46 | + def read(self, iprot): | |
| 47 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 48 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 49 | + return | |
| 50 | + iprot.readStructBegin() | |
| 51 | + while True: | |
| 52 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 53 | + if ftype == TType.STOP: | |
| 54 | + break | |
| 55 | + if fid == 1: | |
| 56 | + if ftype == TType.STRING: | |
| 57 | + self.name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 58 | + else: | |
| 59 | + iprot.skip(ftype) | |
| 60 | + elif fid == 2: | |
| 61 | + if ftype == TType.STRING: | |
| 62 | + self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 63 | + else: | |
| 64 | + iprot.skip(ftype) | |
| 65 | + elif fid == 3: | |
| 66 | + if ftype == TType.STRING: | |
| 67 | + self.size = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 68 | + else: | |
| 69 | + iprot.skip(ftype) | |
| 70 | + elif fid == 4: | |
| 71 | + if ftype == TType.STRING: | |
| 72 | + self.create_time = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 73 | + else: | |
| 74 | + iprot.skip(ftype) | |
| 75 | + elif fid == 5: | |
| 76 | + if ftype == TType.STRING: | |
| 77 | + self.type = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 78 | + else: | |
| 79 | + iprot.skip(ftype) | |
| 80 | + else: | |
| 81 | + iprot.skip(ftype) | |
| 82 | + iprot.readFieldEnd() | |
| 83 | + iprot.readStructEnd() | |
| 84 | + | |
| 85 | + def write(self, oprot): | |
| 86 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 87 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 88 | + return | |
| 89 | + oprot.writeStructBegin('Image') | |
| 90 | + if self.name is not None: | |
| 91 | + oprot.writeFieldBegin('name', TType.STRING, 1) | |
| 92 | + oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name) | |
| 93 | + oprot.writeFieldEnd() | |
| 94 | + if self.path is not None: | |
| 95 | + oprot.writeFieldBegin('path', TType.STRING, 2) | |
| 96 | + oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path) | |
| 97 | + oprot.writeFieldEnd() | |
| 98 | + if self.size is not None: | |
| 99 | + oprot.writeFieldBegin('size', TType.STRING, 3) | |
| 100 | + oprot.writeString(self.size.encode('utf-8') if sys.version_info[0] == 2 else self.size) | |
| 101 | + oprot.writeFieldEnd() | |
| 102 | + if self.create_time is not None: | |
| 103 | + oprot.writeFieldBegin('create_time', TType.STRING, 4) | |
| 104 | + oprot.writeString(self.create_time.encode('utf-8') if sys.version_info[0] == 2 else self.create_time) | |
| 105 | + oprot.writeFieldEnd() | |
| 106 | + if self.type is not None: | |
| 107 | + oprot.writeFieldBegin('type', TType.STRING, 5) | |
| 108 | + oprot.writeString(self.type.encode('utf-8') if sys.version_info[0] == 2 else self.type) | |
| 109 | + oprot.writeFieldEnd() | |
| 110 | + oprot.writeFieldStop() | |
| 111 | + oprot.writeStructEnd() | |
| 112 | + | |
| 113 | + def validate(self): | |
| 114 | + return | |
| 115 | + | |
| 116 | + def __repr__(self): | |
| 117 | + L = ['%s=%r' % (key, value) | |
| 118 | + for key, value in self.__dict__.items()] | |
| 119 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 120 | + | |
| 121 | + def __eq__(self, other): | |
| 122 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 123 | + | |
| 124 | + def __ne__(self, other): | |
| 125 | + return not (self == other) | |
| 126 | + | |
| 127 | + | |
| 128 | +class RasterData(object): | |
| 129 | + """ | |
| 130 | + Attributes: | |
| 131 | + - R | |
| 132 | + - G | |
| 133 | + - B | |
| 134 | + | |
| 135 | + """ | |
| 136 | + | |
| 137 | + | |
| 138 | + def __init__(self, R=None, G=None, B=None,): | |
| 139 | + self.R = R | |
| 140 | + self.G = G | |
| 141 | + self.B = B | |
| 142 | + | |
| 143 | + def read(self, iprot): | |
| 144 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 145 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 146 | + return | |
| 147 | + iprot.readStructBegin() | |
| 148 | + while True: | |
| 149 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 150 | + if ftype == TType.STOP: | |
| 151 | + break | |
| 152 | + if fid == 1: | |
| 153 | + if ftype == TType.LIST: | |
| 154 | + self.R = [] | |
| 155 | + (_etype3, _size0) = iprot.readListBegin() | |
| 156 | + for _i4 in range(_size0): | |
| 157 | + _elem5 = iprot.readI16() | |
| 158 | + self.R.append(_elem5) | |
| 159 | + iprot.readListEnd() | |
| 160 | + else: | |
| 161 | + iprot.skip(ftype) | |
| 162 | + elif fid == 2: | |
| 163 | + if ftype == TType.LIST: | |
| 164 | + self.G = [] | |
| 165 | + (_etype9, _size6) = iprot.readListBegin() | |
| 166 | + for _i10 in range(_size6): | |
| 167 | + _elem11 = iprot.readI16() | |
| 168 | + self.G.append(_elem11) | |
| 169 | + iprot.readListEnd() | |
| 170 | + else: | |
| 171 | + iprot.skip(ftype) | |
| 172 | + elif fid == 3: | |
| 173 | + if ftype == TType.LIST: | |
| 174 | + self.B = [] | |
| 175 | + (_etype15, _size12) = iprot.readListBegin() | |
| 176 | + for _i16 in range(_size12): | |
| 177 | + _elem17 = iprot.readI16() | |
| 178 | + self.B.append(_elem17) | |
| 179 | + iprot.readListEnd() | |
| 180 | + else: | |
| 181 | + iprot.skip(ftype) | |
| 182 | + else: | |
| 183 | + iprot.skip(ftype) | |
| 184 | + iprot.readFieldEnd() | |
| 185 | + iprot.readStructEnd() | |
| 186 | + | |
| 187 | + def write(self, oprot): | |
| 188 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 189 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 190 | + return | |
| 191 | + oprot.writeStructBegin('RasterData') | |
| 192 | + if self.R is not None: | |
| 193 | + oprot.writeFieldBegin('R', TType.LIST, 1) | |
| 194 | + oprot.writeListBegin(TType.I16, len(self.R)) | |
| 195 | + for iter18 in self.R: | |
| 196 | + oprot.writeI16(iter18) | |
| 197 | + oprot.writeListEnd() | |
| 198 | + oprot.writeFieldEnd() | |
| 199 | + if self.G is not None: | |
| 200 | + oprot.writeFieldBegin('G', TType.LIST, 2) | |
| 201 | + oprot.writeListBegin(TType.I16, len(self.G)) | |
| 202 | + for iter19 in self.G: | |
| 203 | + oprot.writeI16(iter19) | |
| 204 | + oprot.writeListEnd() | |
| 205 | + oprot.writeFieldEnd() | |
| 206 | + if self.B is not None: | |
| 207 | + oprot.writeFieldBegin('B', TType.LIST, 3) | |
| 208 | + oprot.writeListBegin(TType.I16, len(self.B)) | |
| 209 | + for iter20 in self.B: | |
| 210 | + oprot.writeI16(iter20) | |
| 211 | + oprot.writeListEnd() | |
| 212 | + oprot.writeFieldEnd() | |
| 213 | + oprot.writeFieldStop() | |
| 214 | + oprot.writeStructEnd() | |
| 215 | + | |
| 216 | + def validate(self): | |
| 217 | + return | |
| 218 | + | |
| 219 | + def __repr__(self): | |
| 220 | + L = ['%s=%r' % (key, value) | |
| 221 | + for key, value in self.__dict__.items()] | |
| 222 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 223 | + | |
| 224 | + def __eq__(self, other): | |
| 225 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 226 | + | |
| 227 | + def __ne__(self, other): | |
| 228 | + return not (self == other) | |
| 229 | + | |
| 230 | + | |
| 231 | +class Raster(object): | |
| 232 | + """ | |
| 233 | + Attributes: | |
| 234 | + - band_count | |
| 235 | + - overview_count | |
| 236 | + - xy_size | |
| 237 | + - origin_extent | |
| 238 | + - null_value | |
| 239 | + - sr_wkt | |
| 240 | + - epsg | |
| 241 | + - sr_proj4 | |
| 242 | + - size | |
| 243 | + - path | |
| 244 | + - cell_x_size | |
| 245 | + - cell_y_size | |
| 246 | + | |
| 247 | + """ | |
| 248 | + | |
| 249 | + | |
| 250 | + def __init__(self, band_count=None, overview_count=None, xy_size=None, origin_extent=None, null_value=None, sr_wkt=None, epsg=None, sr_proj4=None, size=None, path=None, cell_x_size=None, cell_y_size=None,): | |
| 251 | + self.band_count = band_count | |
| 252 | + self.overview_count = overview_count | |
| 253 | + self.xy_size = xy_size | |
| 254 | + self.origin_extent = origin_extent | |
| 255 | + self.null_value = null_value | |
| 256 | + self.sr_wkt = sr_wkt | |
| 257 | + self.epsg = epsg | |
| 258 | + self.sr_proj4 = sr_proj4 | |
| 259 | + self.size = size | |
| 260 | + self.path = path | |
| 261 | + self.cell_x_size = cell_x_size | |
| 262 | + self.cell_y_size = cell_y_size | |
| 263 | + | |
| 264 | + def read(self, iprot): | |
| 265 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: | |
| 266 | + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) | |
| 267 | + return | |
| 268 | + iprot.readStructBegin() | |
| 269 | + while True: | |
| 270 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 271 | + if ftype == TType.STOP: | |
| 272 | + break | |
| 273 | + if fid == 1: | |
| 274 | + if ftype == TType.I32: | |
| 275 | + self.band_count = iprot.readI32() | |
| 276 | + else: | |
| 277 | + iprot.skip(ftype) | |
| 278 | + elif fid == 2: | |
| 279 | + if ftype == TType.I32: | |
| 280 | + self.overview_count = iprot.readI32() | |
| 281 | + else: | |
| 282 | + iprot.skip(ftype) | |
| 283 | + elif fid == 3: | |
| 284 | + if ftype == TType.LIST: | |
| 285 | + self.xy_size = [] | |
| 286 | + (_etype24, _size21) = iprot.readListBegin() | |
| 287 | + for _i25 in range(_size21): | |
| 288 | + _elem26 = iprot.readI32() | |
| 289 | + self.xy_size.append(_elem26) | |
| 290 | + iprot.readListEnd() | |
| 291 | + else: | |
| 292 | + iprot.skip(ftype) | |
| 293 | + elif fid == 4: | |
| 294 | + if ftype == TType.LIST: | |
| 295 | + self.origin_extent = [] | |
| 296 | + (_etype30, _size27) = iprot.readListBegin() | |
| 297 | + for _i31 in range(_size27): | |
| 298 | + _elem32 = iprot.readDouble() | |
| 299 | + self.origin_extent.append(_elem32) | |
| 300 | + iprot.readListEnd() | |
| 301 | + else: | |
| 302 | + iprot.skip(ftype) | |
| 303 | + elif fid == 5: | |
| 304 | + if ftype == TType.DOUBLE: | |
| 305 | + self.null_value = iprot.readDouble() | |
| 306 | + else: | |
| 307 | + iprot.skip(ftype) | |
| 308 | + elif fid == 6: | |
| 309 | + if ftype == TType.STRING: | |
| 310 | + self.sr_wkt = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 311 | + else: | |
| 312 | + iprot.skip(ftype) | |
| 313 | + elif fid == 7: | |
| 314 | + if ftype == TType.STRING: | |
| 315 | + self.epsg = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 316 | + else: | |
| 317 | + iprot.skip(ftype) | |
| 318 | + elif fid == 8: | |
| 319 | + if ftype == TType.STRING: | |
| 320 | + self.sr_proj4 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 321 | + else: | |
| 322 | + iprot.skip(ftype) | |
| 323 | + elif fid == 9: | |
| 324 | + if ftype == TType.I32: | |
| 325 | + self.size = iprot.readI32() | |
| 326 | + else: | |
| 327 | + iprot.skip(ftype) | |
| 328 | + elif fid == 10: | |
| 329 | + if ftype == TType.STRING: | |
| 330 | + self.path = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 331 | + else: | |
| 332 | + iprot.skip(ftype) | |
| 333 | + elif fid == 11: | |
| 334 | + if ftype == TType.DOUBLE: | |
| 335 | + self.cell_x_size = iprot.readDouble() | |
| 336 | + else: | |
| 337 | + iprot.skip(ftype) | |
| 338 | + elif fid == 12: | |
| 339 | + if ftype == TType.DOUBLE: | |
| 340 | + self.cell_y_size = iprot.readDouble() | |
| 341 | + else: | |
| 342 | + iprot.skip(ftype) | |
| 343 | + else: | |
| 344 | + iprot.skip(ftype) | |
| 345 | + iprot.readFieldEnd() | |
| 346 | + iprot.readStructEnd() | |
| 347 | + | |
| 348 | + def write(self, oprot): | |
| 349 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 350 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 351 | + return | |
| 352 | + oprot.writeStructBegin('Raster') | |
| 353 | + if self.band_count is not None: | |
| 354 | + oprot.writeFieldBegin('band_count', TType.I32, 1) | |
| 355 | + oprot.writeI32(self.band_count) | |
| 356 | + oprot.writeFieldEnd() | |
| 357 | + if self.overview_count is not None: | |
| 358 | + oprot.writeFieldBegin('overview_count', TType.I32, 2) | |
| 359 | + oprot.writeI32(self.overview_count) | |
| 360 | + oprot.writeFieldEnd() | |
| 361 | + if self.xy_size is not None: | |
| 362 | + oprot.writeFieldBegin('xy_size', TType.LIST, 3) | |
| 363 | + oprot.writeListBegin(TType.I32, len(self.xy_size)) | |
| 364 | + for iter33 in self.xy_size: | |
| 365 | + oprot.writeI32(iter33) | |
| 366 | + oprot.writeListEnd() | |
| 367 | + oprot.writeFieldEnd() | |
| 368 | + if self.origin_extent is not None: | |
| 369 | + oprot.writeFieldBegin('origin_extent', TType.LIST, 4) | |
| 370 | + oprot.writeListBegin(TType.DOUBLE, len(self.origin_extent)) | |
| 371 | + for iter34 in self.origin_extent: | |
| 372 | + oprot.writeDouble(iter34) | |
| 373 | + oprot.writeListEnd() | |
| 374 | + oprot.writeFieldEnd() | |
| 375 | + if self.null_value is not None: | |
| 376 | + oprot.writeFieldBegin('null_value', TType.DOUBLE, 5) | |
| 377 | + oprot.writeDouble(self.null_value) | |
| 378 | + oprot.writeFieldEnd() | |
| 379 | + if self.sr_wkt is not None: | |
| 380 | + oprot.writeFieldBegin('sr_wkt', TType.STRING, 6) | |
| 381 | + oprot.writeString(self.sr_wkt.encode('utf-8') if sys.version_info[0] == 2 else self.sr_wkt) | |
| 382 | + oprot.writeFieldEnd() | |
| 383 | + if self.epsg is not None: | |
| 384 | + oprot.writeFieldBegin('epsg', TType.STRING, 7) | |
| 385 | + oprot.writeString(self.epsg.encode('utf-8') if sys.version_info[0] == 2 else self.epsg) | |
| 386 | + oprot.writeFieldEnd() | |
| 387 | + if self.sr_proj4 is not None: | |
| 388 | + oprot.writeFieldBegin('sr_proj4', TType.STRING, 8) | |
| 389 | + oprot.writeString(self.sr_proj4.encode('utf-8') if sys.version_info[0] == 2 else self.sr_proj4) | |
| 390 | + oprot.writeFieldEnd() | |
| 391 | + if self.size is not None: | |
| 392 | + oprot.writeFieldBegin('size', TType.I32, 9) | |
| 393 | + oprot.writeI32(self.size) | |
| 394 | + oprot.writeFieldEnd() | |
| 395 | + if self.path is not None: | |
| 396 | + oprot.writeFieldBegin('path', TType.STRING, 10) | |
| 397 | + oprot.writeString(self.path.encode('utf-8') if sys.version_info[0] == 2 else self.path) | |
| 398 | + oprot.writeFieldEnd() | |
| 399 | + if self.cell_x_size is not None: | |
| 400 | + oprot.writeFieldBegin('cell_x_size', TType.DOUBLE, 11) | |
| 401 | + oprot.writeDouble(self.cell_x_size) | |
| 402 | + oprot.writeFieldEnd() | |
| 403 | + if self.cell_y_size is not None: | |
| 404 | + oprot.writeFieldBegin('cell_y_size', TType.DOUBLE, 12) | |
| 405 | + oprot.writeDouble(self.cell_y_size) | |
| 406 | + oprot.writeFieldEnd() | |
| 407 | + oprot.writeFieldStop() | |
| 408 | + oprot.writeStructEnd() | |
| 409 | + | |
| 410 | + def validate(self): | |
| 411 | + return | |
| 412 | + | |
| 413 | + def __repr__(self): | |
| 414 | + L = ['%s=%r' % (key, value) | |
| 415 | + for key, value in self.__dict__.items()] | |
| 416 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 417 | + | |
| 418 | + def __eq__(self, other): | |
| 419 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 420 | + | |
| 421 | + def __ne__(self, other): | |
| 422 | + return not (self == other) | |
| 423 | + | |
| 424 | + | |
| 425 | +class InvalidOperation(TException): | |
| 426 | + """ | |
| 427 | + Structs can also be exceptions, if they are nasty. | |
| 428 | + | |
| 429 | + Attributes: | |
| 430 | + - whatOp | |
| 431 | + - why | |
| 432 | + | |
| 433 | + """ | |
| 434 | + | |
| 435 | + | |
| 436 | + def __init__(self, whatOp=None, why=None,): | |
| 437 | + super(InvalidOperation, self).__setattr__('whatOp', whatOp) | |
| 438 | + super(InvalidOperation, self).__setattr__('why', why) | |
| 439 | + | |
| 440 | + def __setattr__(self, *args): | |
| 441 | + raise TypeError("can't modify immutable instance") | |
| 442 | + | |
| 443 | + def __delattr__(self, *args): | |
| 444 | + raise TypeError("can't modify immutable instance") | |
| 445 | + | |
| 446 | + def __hash__(self): | |
| 447 | + return hash(self.__class__) ^ hash((self.whatOp, self.why, )) | |
| 448 | + | |
| 449 | + @classmethod | |
| 450 | + def read(cls, iprot): | |
| 451 | + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and cls.thrift_spec is not None: | |
| 452 | + return iprot._fast_decode(None, iprot, [cls, cls.thrift_spec]) | |
| 453 | + iprot.readStructBegin() | |
| 454 | + whatOp = None | |
| 455 | + why = None | |
| 456 | + while True: | |
| 457 | + (fname, ftype, fid) = iprot.readFieldBegin() | |
| 458 | + if ftype == TType.STOP: | |
| 459 | + break | |
| 460 | + if fid == 1: | |
| 461 | + if ftype == TType.I32: | |
| 462 | + whatOp = iprot.readI32() | |
| 463 | + else: | |
| 464 | + iprot.skip(ftype) | |
| 465 | + elif fid == 2: | |
| 466 | + if ftype == TType.STRING: | |
| 467 | + why = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() | |
| 468 | + else: | |
| 469 | + iprot.skip(ftype) | |
| 470 | + else: | |
| 471 | + iprot.skip(ftype) | |
| 472 | + iprot.readFieldEnd() | |
| 473 | + iprot.readStructEnd() | |
| 474 | + return cls( | |
| 475 | + whatOp=whatOp, | |
| 476 | + why=why, | |
| 477 | + ) | |
| 478 | + | |
| 479 | + def write(self, oprot): | |
| 480 | + if oprot._fast_encode is not None and self.thrift_spec is not None: | |
| 481 | + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) | |
| 482 | + return | |
| 483 | + oprot.writeStructBegin('InvalidOperation') | |
| 484 | + if self.whatOp is not None: | |
| 485 | + oprot.writeFieldBegin('whatOp', TType.I32, 1) | |
| 486 | + oprot.writeI32(self.whatOp) | |
| 487 | + oprot.writeFieldEnd() | |
| 488 | + if self.why is not None: | |
| 489 | + oprot.writeFieldBegin('why', TType.STRING, 2) | |
| 490 | + oprot.writeString(self.why.encode('utf-8') if sys.version_info[0] == 2 else self.why) | |
| 491 | + oprot.writeFieldEnd() | |
| 492 | + oprot.writeFieldStop() | |
| 493 | + oprot.writeStructEnd() | |
| 494 | + | |
| 495 | + def validate(self): | |
| 496 | + return | |
| 497 | + | |
| 498 | + def __str__(self): | |
| 499 | + return repr(self) | |
| 500 | + | |
| 501 | + def __repr__(self): | |
| 502 | + L = ['%s=%r' % (key, value) | |
| 503 | + for key, value in self.__dict__.items()] | |
| 504 | + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) | |
| 505 | + | |
| 506 | + def __eq__(self, other): | |
| 507 | + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ | |
| 508 | + | |
| 509 | + def __ne__(self, other): | |
| 510 | + return not (self == other) | |
| 511 | +all_structs.append(Image) | |
| 512 | +Image.thrift_spec = ( | |
| 513 | + None, # 0 | |
| 514 | + (1, TType.STRING, 'name', 'UTF8', None, ), # 1 | |
| 515 | + (2, TType.STRING, 'path', 'UTF8', None, ), # 2 | |
| 516 | + (3, TType.STRING, 'size', 'UTF8', None, ), # 3 | |
| 517 | + (4, TType.STRING, 'create_time', 'UTF8', None, ), # 4 | |
| 518 | + (5, TType.STRING, 'type', 'UTF8', None, ), # 5 | |
| 519 | +) | |
| 520 | +all_structs.append(RasterData) | |
| 521 | +RasterData.thrift_spec = ( | |
| 522 | + None, # 0 | |
| 523 | + (1, TType.LIST, 'R', (TType.I16, None, False), None, ), # 1 | |
| 524 | + (2, TType.LIST, 'G', (TType.I16, None, False), None, ), # 2 | |
| 525 | + (3, TType.LIST, 'B', (TType.I16, None, False), None, ), # 3 | |
| 526 | +) | |
| 527 | +all_structs.append(Raster) | |
| 528 | +Raster.thrift_spec = ( | |
| 529 | + None, # 0 | |
| 530 | + (1, TType.I32, 'band_count', None, None, ), # 1 | |
| 531 | + (2, TType.I32, 'overview_count', None, None, ), # 2 | |
| 532 | + (3, TType.LIST, 'xy_size', (TType.I32, None, False), None, ), # 3 | |
| 533 | + (4, TType.LIST, 'origin_extent', (TType.DOUBLE, None, False), None, ), # 4 | |
| 534 | + (5, TType.DOUBLE, 'null_value', None, None, ), # 5 | |
| 535 | + (6, TType.STRING, 'sr_wkt', 'UTF8', None, ), # 6 | |
| 536 | + (7, TType.STRING, 'epsg', 'UTF8', None, ), # 7 | |
| 537 | + (8, TType.STRING, 'sr_proj4', 'UTF8', None, ), # 8 | |
| 538 | + (9, TType.I32, 'size', None, None, ), # 9 | |
| 539 | + (10, TType.STRING, 'path', 'UTF8', None, ), # 10 | |
| 540 | + (11, TType.DOUBLE, 'cell_x_size', None, None, ), # 11 | |
| 541 | + (12, TType.DOUBLE, 'cell_y_size', None, None, ), # 12 | |
| 542 | +) | |
| 543 | +all_structs.append(InvalidOperation) | |
| 544 | +InvalidOperation.thrift_spec = ( | |
| 545 | + None, # 0 | |
| 546 | + (1, TType.I32, 'whatOp', None, None, ), # 1 | |
| 547 | + (2, TType.STRING, 'why', 'UTF8', None, ), # 2 | |
| 548 | +) | |
| 549 | +fix_spec(all_structs) | |
| 550 | +del all_structs | ... | ... |
4.5 KB
7.6 KB
| ... | ... | @@ -24,6 +24,8 @@ class Api(ApiTemplate): |
| 24 | 24 | # extent = [float(x) for x in data.get("extent").split(",")] if data.get("extent") else [0,0,0,0] |
| 25 | 25 | # top_left = [float(x) for x in data.get("top_left").split(",")] if data.get("top_left") else [0, 0] |
| 26 | 26 | |
| 27 | + | |
| 28 | + | |
| 27 | 29 | guid = uuid.uuid1().__str__() |
| 28 | 30 | tile_scheme = TileScheme( |
| 29 | 31 | guid = guid, |
| ... | ... | @@ -39,11 +41,12 @@ class Api(ApiTemplate): |
| 39 | 41 | # ymax = extent[3], |
| 40 | 42 | # origin_x = top_left[0], |
| 41 | 43 | # origin_y = top_left[1], |
| 42 | - levels = json.dumps(data.get("levels")), | |
| 44 | + levels = json.dumps(json.loads(data.get("levels"))), | |
| 43 | 45 | dpi = int(data.get("dpi")), |
| 44 | 46 | rows = int(data.get("rows")), |
| 45 | - cols = int(data.get("clos")), | |
| 46 | - update_time = datetime.datetime.now() | |
| 47 | + cols = int(data.get("cols")), | |
| 48 | + update_time = datetime.datetime.now(), | |
| 49 | + parameter=json.dumps(json.loads(data.get("parameter"))) | |
| 47 | 50 | ) |
| 48 | 51 | |
| 49 | 52 | db.session.add(tile_scheme) |
| ... | ... | @@ -89,6 +92,9 @@ class Api(ApiTemplate): |
| 89 | 92 | {"name": "levels", |
| 90 | 93 | "in": "formData", |
| 91 | 94 | "type": "string"}, |
| 95 | + {"name": "parameter", | |
| 96 | + "in": "formData", | |
| 97 | + "type": "string"}, | |
| 92 | 98 | |
| 93 | 99 | ], |
| 94 | 100 | "responses": { | ... | ... |
| ... | ... | @@ -10,6 +10,7 @@ from app.util.component.FileProcess import FileProcess |
| 10 | 10 | from app.util.component.SliceScheme import SliceScheme |
| 11 | 11 | import shutil |
| 12 | 12 | from app.util.component.StructuredPrint import StructurePrint |
| 13 | +import json | |
| 13 | 14 | class Api(ApiTemplate): |
| 14 | 15 | api_name = "解析方案" |
| 15 | 16 | |
| ... | ... | @@ -30,7 +31,8 @@ class Api(ApiTemplate): |
| 30 | 31 | "dpi": scheme.parameter.get("dpi"), |
| 31 | 32 | "rows": scheme.parameter.get("rows"), |
| 32 | 33 | "cols": scheme.parameter.get("cols"), |
| 33 | - "levels": scheme.levels | |
| 34 | + "levels": scheme.levels, | |
| 35 | + "parameter":scheme.parameter | |
| 34 | 36 | } |
| 35 | 37 | |
| 36 | 38 | res["data"] = data |
| ... | ... | @@ -47,11 +49,11 @@ class Api(ApiTemplate): |
| 47 | 49 | i+=1 |
| 48 | 50 | if i<30: |
| 49 | 51 | shutil.rmtree(dir_path,True) |
| 50 | - StructurePrint.print("删除文件成功!") | |
| 52 | + StructurePrint().print("删除文件成功!") | |
| 51 | 53 | else: |
| 52 | 54 | raise Exception("找不到文件!") |
| 53 | 55 | except Exception as e: |
| 54 | - StructurePrint.print("删除文件失败!","ERROR") | |
| 56 | + StructurePrint().print("删除文件失败!","ERROR") | |
| 55 | 57 | return res |
| 56 | 58 | |
| 57 | 59 | api_doc = { | ... | ... |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<TileCacheInfo xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="typens:TileCacheInfo"> | |
| 3 | + <SpatialReference xsi:type="typens:GeographicCoordinateSystem"> | |
| 4 | + <WKT>GEOGCS["GCS_China_Geodetic_Coordinate_System_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433],AUTHORITY["EPSG",4490]]</WKT> | |
| 5 | + <XOrigin>-400</XOrigin> | |
| 6 | + <YOrigin>-400</YOrigin> | |
| 7 | + <XYScale>11258999068426.24</XYScale> | |
| 8 | + <ZOrigin>0</ZOrigin> | |
| 9 | + <ZScale>1</ZScale> | |
| 10 | + <MOrigin>-100000</MOrigin> | |
| 11 | + <MScale>10000</MScale> | |
| 12 | + <XYTolerance>8.98315284119521e-009</XYTolerance> | |
| 13 | + <ZTolerance>2</ZTolerance> | |
| 14 | + <MTolerance>0.001</MTolerance> | |
| 15 | + <HighPrecision>true</HighPrecision> | |
| 16 | + <LeftLongitude>-180</LeftLongitude> | |
| 17 | + <WKID>4490</WKID> | |
| 18 | + <LatestWKID>4490</LatestWKID> | |
| 19 | + </SpatialReference> | |
| 20 | + <TileOrigin xsi:type="typens:PointN"> | |
| 21 | + <X>-180</X> | |
| 22 | + <Y>90</Y> | |
| 23 | + </TileOrigin> | |
| 24 | + <TileCols>256</TileCols> | |
| 25 | + <TileRows>256</TileRows> | |
| 26 | + <DPI>96</DPI> | |
| 27 | + <PreciseDPI>96</PreciseDPI> | |
| 28 | + <LODInfos xsi:type="typens:ArrayOfLODInfo"> | |
| 29 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 30 | + <LevelID>0</LevelID> | |
| 31 | + <Scale>295497593.05875003</Scale> | |
| 32 | + <Resolution>0.70312500000000022</Resolution> | |
| 33 | + </LODInfo> | |
| 34 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 35 | + <LevelID>1</LevelID> | |
| 36 | + <Scale>147748796.52937502</Scale> | |
| 37 | + <Resolution>0.35156250000000011</Resolution> | |
| 38 | + </LODInfo> | |
| 39 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 40 | + <LevelID>2</LevelID> | |
| 41 | + <Scale>73874398.264687508</Scale> | |
| 42 | + <Resolution>0.17578125000000006</Resolution> | |
| 43 | + </LODInfo> | |
| 44 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 45 | + <LevelID>3</LevelID> | |
| 46 | + <Scale>36937199.132343754</Scale> | |
| 47 | + <Resolution>0.087890625000000028</Resolution> | |
| 48 | + </LODInfo> | |
| 49 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 50 | + <LevelID>4</LevelID> | |
| 51 | + <Scale>18468599.566171877</Scale> | |
| 52 | + <Resolution>0.043945312500000014</Resolution> | |
| 53 | + </LODInfo> | |
| 54 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 55 | + <LevelID>5</LevelID> | |
| 56 | + <Scale>9234299.7830859385</Scale> | |
| 57 | + <Resolution>0.021972656250000007</Resolution> | |
| 58 | + </LODInfo> | |
| 59 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 60 | + <LevelID>6</LevelID> | |
| 61 | + <Scale>4617149.8915429693</Scale> | |
| 62 | + <Resolution>0.010986328125000003</Resolution> | |
| 63 | + </LODInfo> | |
| 64 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 65 | + <LevelID>7</LevelID> | |
| 66 | + <Scale>2308574.9457714846</Scale> | |
| 67 | + <Resolution>0.0054931640625000017</Resolution> | |
| 68 | + </LODInfo> | |
| 69 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 70 | + <LevelID>8</LevelID> | |
| 71 | + <Scale>1154287.4728857423</Scale> | |
| 72 | + <Resolution>0.0027465820312500009</Resolution> | |
| 73 | + </LODInfo> | |
| 74 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 75 | + <LevelID>9</LevelID> | |
| 76 | + <Scale>577143.73644287116</Scale> | |
| 77 | + <Resolution>0.0013732910156250004</Resolution> | |
| 78 | + </LODInfo> | |
| 79 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 80 | + <LevelID>10</LevelID> | |
| 81 | + <Scale>288571.86822143558</Scale> | |
| 82 | + <Resolution>0.00068664550781250022</Resolution> | |
| 83 | + </LODInfo> | |
| 84 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 85 | + <LevelID>11</LevelID> | |
| 86 | + <Scale>144285.93411071779</Scale> | |
| 87 | + <Resolution>0.00034332275390625011</Resolution> | |
| 88 | + </LODInfo> | |
| 89 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 90 | + <LevelID>12</LevelID> | |
| 91 | + <Scale>72142.967055358895</Scale> | |
| 92 | + <Resolution>0.00017166137695312505</Resolution> | |
| 93 | + </LODInfo> | |
| 94 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 95 | + <LevelID>13</LevelID> | |
| 96 | + <Scale>36071.483527679447</Scale> | |
| 97 | + <Resolution>8.5830688476562527e-005</Resolution> | |
| 98 | + </LODInfo> | |
| 99 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 100 | + <LevelID>14</LevelID> | |
| 101 | + <Scale>18035.741763839724</Scale> | |
| 102 | + <Resolution>4.2915344238281264e-005</Resolution> | |
| 103 | + </LODInfo> | |
| 104 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 105 | + <LevelID>15</LevelID> | |
| 106 | + <Scale>9017.8708819198619</Scale> | |
| 107 | + <Resolution>2.1457672119140632e-005</Resolution> | |
| 108 | + </LODInfo> | |
| 109 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 110 | + <LevelID>16</LevelID> | |
| 111 | + <Scale>4508.9354409599309</Scale> | |
| 112 | + <Resolution>1.0728836059570316e-005</Resolution> | |
| 113 | + </LODInfo> | |
| 114 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 115 | + <LevelID>17</LevelID> | |
| 116 | + <Scale>2254.4677204799655</Scale> | |
| 117 | + <Resolution>5.3644180297851579e-006</Resolution> | |
| 118 | + </LODInfo> | |
| 119 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 120 | + <LevelID>18</LevelID> | |
| 121 | + <Scale>1127.2338602399827</Scale> | |
| 122 | + <Resolution>2.682209014892579e-006</Resolution> | |
| 123 | + </LODInfo> | |
| 124 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 125 | + <LevelID>19</LevelID> | |
| 126 | + <Scale>563.61693011999137</Scale> | |
| 127 | + <Resolution>1.3411045074462895e-006</Resolution> | |
| 128 | + </LODInfo> | |
| 129 | + </LODInfos> | |
| 130 | +</TileCacheInfo> | |
| \ No newline at end of file | ... | ... |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<TileCacheInfo xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="typens:TileCacheInfo"> | |
| 3 | + <SpatialReference xsi:type="typens:GeographicCoordinateSystem"> | |
| 4 | + <WKT>GEOGCS["GCS_China_Geodetic_Coordinate_System_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433],AUTHORITY["EPSG",4490]]</WKT> | |
| 5 | + <XOrigin>-400</XOrigin> | |
| 6 | + <YOrigin>-400</YOrigin> | |
| 7 | + <XYScale>11258999068426.24</XYScale> | |
| 8 | + <ZOrigin>0</ZOrigin> | |
| 9 | + <ZScale>1</ZScale> | |
| 10 | + <MOrigin>-100000</MOrigin> | |
| 11 | + <MScale>10000</MScale> | |
| 12 | + <XYTolerance>8.98315284119521e-009</XYTolerance> | |
| 13 | + <ZTolerance>2</ZTolerance> | |
| 14 | + <MTolerance>0.001</MTolerance> | |
| 15 | + <HighPrecision>true</HighPrecision> | |
| 16 | + <LeftLongitude>-180</LeftLongitude> | |
| 17 | + <WKID>4490</WKID> | |
| 18 | + <LatestWKID>4490</LatestWKID> | |
| 19 | + </SpatialReference> | |
| 20 | + <TileOrigin xsi:type="typens:PointN"> | |
| 21 | + <X>-180</X> | |
| 22 | + <Y>90</Y> | |
| 23 | + </TileOrigin> | |
| 24 | + <TileCols>256</TileCols> | |
| 25 | + <TileRows>256</TileRows> | |
| 26 | + <DPI>96</DPI> | |
| 27 | + <PreciseDPI>96</PreciseDPI> | |
| 28 | + <LODInfos xsi:type="typens:ArrayOfLODInfo"> | |
| 29 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 30 | + <LevelID>0</LevelID> | |
| 31 | + <Scale>590995186.11750006</Scale> | |
| 32 | + <Resolution>1.4062500000000004</Resolution> | |
| 33 | + </LODInfo> | |
| 34 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 35 | + <LevelID>1</LevelID> | |
| 36 | + <Scale>295497593.05875003</Scale> | |
| 37 | + <Resolution>0.70312500000000022</Resolution> | |
| 38 | + </LODInfo> | |
| 39 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 40 | + <LevelID>2</LevelID> | |
| 41 | + <Scale>147748796.52937502</Scale> | |
| 42 | + <Resolution>0.35156250000000011</Resolution> | |
| 43 | + </LODInfo> | |
| 44 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 45 | + <LevelID>3</LevelID> | |
| 46 | + <Scale>73874398.264687508</Scale> | |
| 47 | + <Resolution>0.17578125000000006</Resolution> | |
| 48 | + </LODInfo> | |
| 49 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 50 | + <LevelID>4</LevelID> | |
| 51 | + <Scale>36937199.132343754</Scale> | |
| 52 | + <Resolution>0.087890625000000028</Resolution> | |
| 53 | + </LODInfo> | |
| 54 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 55 | + <LevelID>5</LevelID> | |
| 56 | + <Scale>18468599.566171877</Scale> | |
| 57 | + <Resolution>0.043945312500000014</Resolution> | |
| 58 | + </LODInfo> | |
| 59 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 60 | + <LevelID>6</LevelID> | |
| 61 | + <Scale>9234299.7830859385</Scale> | |
| 62 | + <Resolution>0.021972656250000007</Resolution> | |
| 63 | + </LODInfo> | |
| 64 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 65 | + <LevelID>7</LevelID> | |
| 66 | + <Scale>4617149.8915429693</Scale> | |
| 67 | + <Resolution>0.010986328125000003</Resolution> | |
| 68 | + </LODInfo> | |
| 69 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 70 | + <LevelID>8</LevelID> | |
| 71 | + <Scale>2308574.9457714846</Scale> | |
| 72 | + <Resolution>0.0054931640625000017</Resolution> | |
| 73 | + </LODInfo> | |
| 74 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 75 | + <LevelID>9</LevelID> | |
| 76 | + <Scale>1154287.4728857423</Scale> | |
| 77 | + <Resolution>0.0027465820312500009</Resolution> | |
| 78 | + </LODInfo> | |
| 79 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 80 | + <LevelID>10</LevelID> | |
| 81 | + <Scale>577143.73644287116</Scale> | |
| 82 | + <Resolution>0.0013732910156250004</Resolution> | |
| 83 | + </LODInfo> | |
| 84 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 85 | + <LevelID>11</LevelID> | |
| 86 | + <Scale>288571.86822143558</Scale> | |
| 87 | + <Resolution>0.00068664550781250022</Resolution> | |
| 88 | + </LODInfo> | |
| 89 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 90 | + <LevelID>12</LevelID> | |
| 91 | + <Scale>144285.93411071779</Scale> | |
| 92 | + <Resolution>0.00034332275390625011</Resolution> | |
| 93 | + </LODInfo> | |
| 94 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 95 | + <LevelID>13</LevelID> | |
| 96 | + <Scale>72142.967055358895</Scale> | |
| 97 | + <Resolution>0.00017166137695312505</Resolution> | |
| 98 | + </LODInfo> | |
| 99 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 100 | + <LevelID>14</LevelID> | |
| 101 | + <Scale>36071.483527679447</Scale> | |
| 102 | + <Resolution>8.5830688476562527e-005</Resolution> | |
| 103 | + </LODInfo> | |
| 104 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 105 | + <LevelID>15</LevelID> | |
| 106 | + <Scale>18035.741763839724</Scale> | |
| 107 | + <Resolution>4.2915344238281264e-005</Resolution> | |
| 108 | + </LODInfo> | |
| 109 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 110 | + <LevelID>16</LevelID> | |
| 111 | + <Scale>9017.8708819198619</Scale> | |
| 112 | + <Resolution>2.1457672119140632e-005</Resolution> | |
| 113 | + </LODInfo> | |
| 114 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 115 | + <LevelID>17</LevelID> | |
| 116 | + <Scale>4508.9354409599309</Scale> | |
| 117 | + <Resolution>1.0728836059570316e-005</Resolution> | |
| 118 | + </LODInfo> | |
| 119 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 120 | + <LevelID>18</LevelID> | |
| 121 | + <Scale>2254.4677204799655</Scale> | |
| 122 | + <Resolution>5.3644180297851579e-006</Resolution> | |
| 123 | + </LODInfo> | |
| 124 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 125 | + <LevelID>19</LevelID> | |
| 126 | + <Scale>1127.2338602399827</Scale> | |
| 127 | + <Resolution>2.682209014892579e-006</Resolution> | |
| 128 | + </LODInfo> | |
| 129 | + <LODInfo xsi:type="typens:LODInfo"> | |
| 130 | + <LevelID>20</LevelID> | |
| 131 | + <Scale>563.61693011999137</Scale> | |
| 132 | + <Resolution>1.3411045074462895e-006</Resolution> | |
| 133 | + </LODInfo> | |
| 134 | + </LODInfos> | |
| 135 | +</TileCacheInfo> | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -19,7 +19,7 @@ class Api(ApiTemplate): |
| 19 | 19 | try: |
| 20 | 20 | guid = self.para.get("guid") |
| 21 | 21 | service = Service.query.filter_by(guid=guid).one_or_none() |
| 22 | - db.session.remove(service) | |
| 22 | + db.session.delete(service) | |
| 23 | 23 | db.session.commit() |
| 24 | 24 | res["result"] = True |
| 25 | 25 | except Exception as e: | ... | ... |
| ... | ... | @@ -13,17 +13,16 @@ class Api(ApiTemplate): |
| 13 | 13 | def process(self): |
| 14 | 14 | res = {} |
| 15 | 15 | try: |
| 16 | - if self.para.get("type").__eq__("影像WMS"): | |
| 17 | - from app.modules.service.image.image_service_edit import Api | |
| 18 | - elif self.para.get("type").__eq__("影像WMTS"): | |
| 19 | - from app.modules.service.image.image_service_edit import Api | |
| 20 | - elif self.para.get("type").__eq__("WMS"): | |
| 21 | - from app.modules.service.wms.wms_edit import Api | |
| 22 | - elif self.para.get("type").__eq__("WMTS"): | |
| 23 | - from app.modules.service.wmts.wmts_edit import Api | |
| 16 | + | |
| 17 | + if self.para.get("type")in ["ImageWMTS","ImageWMS"]: | |
| 18 | + from app.modules.service.image.image_service_edit import Api as Api2 | |
| 19 | + elif self.para.get("type").__eq__("WMS/WFS"): | |
| 20 | + from app.modules.service.wms.wms_edit import Api as Api2 | |
| 21 | + elif self.para.get("type") in ["WMTS","MTS"]: | |
| 22 | + from app.modules.service.wmts.wmts_edit import Api as Api2 | |
| 24 | 23 | else: |
| 25 | 24 | return res |
| 26 | - api = Api() | |
| 25 | + api = Api2() | |
| 27 | 26 | api.para = self.para |
| 28 | 27 | res = api.process() |
| 29 | 28 | ... | ... |
app/modules/service/service_info.py
0 → 100644
| 1 | +# coding=utf-8 | |
| 2 | +#author: 4N | |
| 3 | +#createtime: 2021/9/22 | |
| 4 | +#email: nheweijun@sina.com | |
| 5 | + | |
| 6 | + | |
| 7 | +from app.util.component.ApiTemplate import ApiTemplate | |
| 8 | +from app.util.component.ModelVisitor import ModelVisitor | |
| 9 | +from app.models import Service | |
| 10 | + | |
| 11 | +class Api(ApiTemplate): | |
| 12 | + api_name = "服务Info" | |
| 13 | + def process(self): | |
| 14 | + res = {} | |
| 15 | + try: | |
| 16 | + guid = self.para.get("guid") | |
| 17 | + service = Service.query.filter_by(guid=guid).one_or_none() | |
| 18 | + | |
| 19 | + if service.type in ["ImageWMS","ImageWMTS"]: | |
| 20 | + from app.modules.service.image.models import ImageService | |
| 21 | + speci_service = ImageService.query.filter_by(guid=guid).one_or_none() | |
| 22 | + elif service.type.__eq__("WMTS") or service.type.__eq__("MTS"): | |
| 23 | + from app.modules.service.wmts.models import WMTS | |
| 24 | + speci_service = WMTS.query.filter_by(guid=guid).one_or_none() | |
| 25 | + elif service.type.__eq__("WMS/WFS"): | |
| 26 | + from app.modules.service.wms.models import WMS | |
| 27 | + speci_service = WMS.query.filter_by(guid=guid).one_or_none() | |
| 28 | + else: | |
| 29 | + speci_service = {} | |
| 30 | + res["data"] = ModelVisitor.object_to_json(speci_service) | |
| 31 | + except Exception as e: | |
| 32 | + raise e | |
| 33 | + return res | |
| 34 | + | |
| 35 | + | |
| 36 | + api_doc = { | |
| 37 | + "tags": ["服务接口"], | |
| 38 | + "parameters": [ | |
| 39 | + {"name": "guid", | |
| 40 | + "in": "formData", | |
| 41 | + "type": "string", | |
| 42 | + "description": "guid"}, | |
| 43 | + ], | |
| 44 | + "responses": { | |
| 45 | + 200: { | |
| 46 | + "schema": { | |
| 47 | + "properties": { | |
| 48 | + } | |
| 49 | + } | |
| 50 | + } | |
| 51 | + } | |
| 52 | + } | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -4,23 +4,28 @@ |
| 4 | 4 | #email: nheweijun@sina.com |
| 5 | 5 | |
| 6 | 6 | from app.util.component.ApiTemplate import ApiTemplate |
| 7 | - | |
| 7 | +from app.models import Service | |
| 8 | 8 | class Api(ApiTemplate): |
| 9 | 9 | api_name = "注册服务" |
| 10 | 10 | def process(self): |
| 11 | 11 | res = {} |
| 12 | 12 | try: |
| 13 | - if self.para.get("type").__eq__("影像WMS"): | |
| 14 | - from app.modules.service.image.image_service_register import Api | |
| 15 | - elif self.para.get("type").__eq__("影像WMTS"): | |
| 16 | - from app.modules.service.image.image_service_register import Api | |
| 13 | + | |
| 14 | + service = Service.query.filter_by(name=self.para.get("name")).one_or_none() | |
| 15 | + if service: | |
| 16 | + raise Exception("服务已存在!") | |
| 17 | + | |
| 18 | + if self.para.get("type").__eq__("ImageWMS"): | |
| 19 | + from app.modules.service.image.image_service_register import Api as Api2 | |
| 20 | + elif self.para.get("type").__eq__("ImageWMTS"): | |
| 21 | + from app.modules.service.image.image_service_register import Api as Api2 | |
| 17 | 22 | elif self.para.get("type").__eq__("WMS"): |
| 18 | - from app.modules.service.wms.wms_register import Api | |
| 19 | - elif self.para.get("type").__eq__("WMTS"): | |
| 20 | - from app.modules.service.wmts.wmts_register import Api | |
| 23 | + from app.modules.service.wms.wms_register import Api as Api2 | |
| 24 | + elif self.para.get("type").__eq__("WMTS") or self.para.get("type").__eq__("MTS"): | |
| 25 | + from app.modules.service.wmts.wmts_register import Api as Api2 | |
| 21 | 26 | else: |
| 22 | 27 | return res |
| 23 | - api = Api() | |
| 28 | + api = Api2() | |
| 24 | 29 | api.para = self.para |
| 25 | 30 | res = api.process() |
| 26 | 31 | except Exception as e: |
| ... | ... | @@ -31,6 +36,134 @@ class Api(ApiTemplate): |
| 31 | 36 | api_doc = { |
| 32 | 37 | "tags": ["服务接口"], |
| 33 | 38 | "parameters": [ |
| 39 | + | |
| 40 | + #通用参数 | |
| 41 | + {"name": "name", | |
| 42 | + "in": "formData", | |
| 43 | + "type": "string", | |
| 44 | + "required": "true", | |
| 45 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 46 | + {"name": "alias", | |
| 47 | + "in": "formData", | |
| 48 | + "type": "string", | |
| 49 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 50 | + {"name": "description", | |
| 51 | + "in": "formData", | |
| 52 | + "type": "string", | |
| 53 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 54 | + {"name": "type", | |
| 55 | + "in": "formData", | |
| 56 | + "type": "string", | |
| 57 | + "enum":["WMS/WFS","WMTS","MTS","ImageWMS","ImageWMTS"], | |
| 58 | + "required": "true", | |
| 59 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 60 | + {"name": "catalog_guid", | |
| 61 | + "in": "formData", | |
| 62 | + "type": "string", | |
| 63 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 64 | + | |
| 65 | + #影像参数 | |
| 66 | + {"name": "guids", | |
| 67 | + "in": "formData", | |
| 68 | + "type": "string", | |
| 69 | + "description": "[影像WMS,影像WMTS]影像guids,以英文逗号相隔"}, | |
| 70 | + {"name": "scheme_guid", | |
| 71 | + "in": "formData", | |
| 72 | + "type": "string", | |
| 73 | + "description": "[WMTS,影像WMTS]切片方案"}, | |
| 74 | + | |
| 75 | + # WMTS参数 | |
| 76 | + {"name": "overview", | |
| 77 | + "in": "formData", | |
| 78 | + "type": "string", | |
| 79 | + "description": "[WMTS]缩略图"}, | |
| 80 | + {"name": "wmts_type", | |
| 81 | + "in": "formData", | |
| 82 | + "type": "string", | |
| 83 | + "description": "[WMTS]wmts_type"}, | |
| 84 | + {"name": "vendor", | |
| 85 | + "in": "formData", | |
| 86 | + "type": "string", | |
| 87 | + "description": "[WMTS]厂商"}, | |
| 88 | + {"name": "crs", | |
| 89 | + "in": "formData", | |
| 90 | + "type": "string", | |
| 91 | + "description": "[WMTS]坐标系"}, | |
| 92 | + {"name": "datasource", | |
| 93 | + "in": "formData", | |
| 94 | + "type": "string", | |
| 95 | + "description": "[WMTS]数据路径"}, | |
| 96 | + {"name": "layer_name", | |
| 97 | + "in": "formData", | |
| 98 | + "type": "string", | |
| 99 | + "description": "[WMTS]图层名"}, | |
| 100 | + {"name": "layer_alias", | |
| 101 | + "in": "formData", | |
| 102 | + "type": "string", | |
| 103 | + "description": "[WMTS]图层别名"}, | |
| 104 | + {"name": "layer_title", | |
| 105 | + "in": "formData", | |
| 106 | + "type": "string", | |
| 107 | + "description": "[WMTS]图层标题"}, | |
| 108 | + {"name": "layer_style", | |
| 109 | + "in": "formData", | |
| 110 | + "type": "string", | |
| 111 | + "description": "[WMTS,WMS]图层样式"}, | |
| 112 | + {"name": "layer_format", | |
| 113 | + "in": "formData", | |
| 114 | + "type": "string", | |
| 115 | + "description": "[WMTS]图层format"}, | |
| 116 | + {"name": "layer_extent", | |
| 117 | + "in": "formData", | |
| 118 | + "type": "string", | |
| 119 | + "description": "[WMTS]图层范围"}, | |
| 120 | + {"name": "layer_description", | |
| 121 | + "in": "formData", | |
| 122 | + "type": "string", | |
| 123 | + "description": "[WMTS]图层描述"}, | |
| 124 | + | |
| 125 | + #WMS参数 | |
| 126 | + {"name": "status", | |
| 127 | + "in": "formData", | |
| 128 | + "type": "string", | |
| 129 | + "description": "[WMS]status"}, | |
| 130 | + {"name": "username", | |
| 131 | + "in": "formData", | |
| 132 | + "type": "string", | |
| 133 | + "description": "[WMS]username"}, | |
| 134 | + {"name": "readonly", | |
| 135 | + "in": "formData", | |
| 136 | + "type": "string", | |
| 137 | + "description": "[WMS]readonly"}, | |
| 138 | + {"name": "sid", | |
| 139 | + "in": "formData", | |
| 140 | + "type": "string", | |
| 141 | + "description": "[WMS]sid"}, | |
| 142 | + {"name": "stype", | |
| 143 | + "in": "formData", | |
| 144 | + "type": "string", | |
| 145 | + "description": "[WMS]stype"}, | |
| 146 | + {"name": "ssupply", | |
| 147 | + "in": "formData", | |
| 148 | + "type": "string", | |
| 149 | + "description": "[WMS]ssupply"}, | |
| 150 | + {"name": "sctime", | |
| 151 | + "in": "formData", | |
| 152 | + "type": "string", | |
| 153 | + "description": "[WMS]sctime"}, | |
| 154 | + {"name": "company", | |
| 155 | + "in": "formData", | |
| 156 | + "type": "string", | |
| 157 | + "description": "[WMS]company"}, | |
| 158 | + {"name": "abstract", | |
| 159 | + "in": "formData", | |
| 160 | + "type": "string", | |
| 161 | + "description": "[WMS]abstract"}, | |
| 162 | + {"name": "thumbnail", | |
| 163 | + "in": "formData", | |
| 164 | + "type": "string", | |
| 165 | + "description": "[WMS]thumbnail"}, | |
| 166 | + | |
| 34 | 167 | ], |
| 35 | 168 | "responses": { |
| 36 | 169 | 200: { | ... | ... |
| ... | ... | @@ -36,4 +36,5 @@ class WMS(db.Model): |
| 36 | 36 | |
| 37 | 37 | layer_style = Column(Text) |
| 38 | 38 | |
| 39 | - service_guid = Column(String,ForeignKey('dmdms_service.guid')) | |
| \ No newline at end of file | ||
| 39 | + # service_guid = Column(String,ForeignKey('dmdms_service.guid')) | |
| 40 | + service_guid = Column(String) | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -2,3 +2,67 @@ |
| 2 | 2 | #author: 4N |
| 3 | 3 | #createtime: 2021/9/17 |
| 4 | 4 | #email: nheweijun@sina.com |
| 5 | + | |
| 6 | + | |
| 7 | +from app.util.component.ApiTemplate import ApiTemplate | |
| 8 | +import uuid | |
| 9 | +from .models import WMS | |
| 10 | +from app.models import Service,db | |
| 11 | + | |
| 12 | +import datetime | |
| 13 | +class Api(ApiTemplate): | |
| 14 | + | |
| 15 | + api_name = "修改WMTS服务" | |
| 16 | + | |
| 17 | + def process(self): | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + # 返回结果 | |
| 22 | + res = {} | |
| 23 | + | |
| 24 | + try: | |
| 25 | + guid = self.para.get("guid") | |
| 26 | + service = Service.query.filter_by(guid=guid).one_or_none() | |
| 27 | + this_time = datetime.datetime.now() | |
| 28 | + | |
| 29 | + | |
| 30 | + service_update = {"upate_time":this_time} | |
| 31 | + wms_update = {"upatetime":this_time} | |
| 32 | + for key in self.para.keys(): | |
| 33 | + if key in ["name","alias","state","description","overview","catalog_guid"]: | |
| 34 | + service_update[key] = self.para.get(key) | |
| 35 | + if key in ["status","description","username","readonly", | |
| 36 | + "sid","stype","ssupply","sctime","company","abstract","thumbnail","layer_style"]: | |
| 37 | + wms_update[key] = self.para.get(key) | |
| 38 | + if key.__eq__("name"): | |
| 39 | + wms_update["service"] = self.para.get(key) | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + wms = WMS.query.filter_by(guid=service.service_guid).one_or_none() | |
| 44 | + service.update(service_update) | |
| 45 | + wms.update(wms_update) | |
| 46 | + | |
| 47 | + db.session.commit() | |
| 48 | + | |
| 49 | + res["result"] = True | |
| 50 | + except Exception as e: | |
| 51 | + raise e | |
| 52 | + | |
| 53 | + return res | |
| 54 | + | |
| 55 | + api_doc = { | |
| 56 | + "tags": ["影像接口"], | |
| 57 | + "parameters": [ | |
| 58 | + | |
| 59 | + ], | |
| 60 | + "responses": { | |
| 61 | + 200: { | |
| 62 | + "schema": { | |
| 63 | + "properties": { | |
| 64 | + } | |
| 65 | + } | |
| 66 | + } | |
| 67 | + } | |
| 68 | + } | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -36,15 +36,16 @@ class Api(ApiTemplate): |
| 36 | 36 | update_time = this_time, |
| 37 | 37 | description = self.para.get("description"), |
| 38 | 38 | #node = Column(Integer), |
| 39 | + node = 1 , | |
| 39 | 40 | overview = "xxxx", |
| 40 | - type = self.para.get("service_type"), | |
| 41 | + type = self.para.get("type"), | |
| 41 | 42 | service_guid = wms_service_guid, |
| 42 | 43 | catalog_guid = self.para.get("catalog_guid") |
| 43 | 44 | ) |
| 44 | 45 | |
| 45 | 46 | wms = WMS( |
| 46 | 47 | guid = wms_service_guid, |
| 47 | - name = self.para.get("name"), | |
| 48 | + service = self.para.get("name"), | |
| 48 | 49 | status = self.para.get("status"), |
| 49 | 50 | description=self.para.get("description"), |
| 50 | 51 | username = self.para.get("username"), |
| ... | ... | @@ -76,6 +77,80 @@ class Api(ApiTemplate): |
| 76 | 77 | "tags": ["WMTS接口"], |
| 77 | 78 | "parameters": [ |
| 78 | 79 | |
| 80 | + {"name": "name", | |
| 81 | + "in": "formData", | |
| 82 | + "type": "string", | |
| 83 | + "required": "true", | |
| 84 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 85 | + {"name": "alias", | |
| 86 | + "in": "formData", | |
| 87 | + "type": "string", | |
| 88 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 89 | + {"name": "description", | |
| 90 | + "in": "formData", | |
| 91 | + "type": "string", | |
| 92 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 93 | + {"name": "type", | |
| 94 | + "in": "formData", | |
| 95 | + "type": "string", | |
| 96 | + "enum": ["WMS", "WMTS", "影像WMS", "影像WMTS"], | |
| 97 | + "required": "true", | |
| 98 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 99 | + {"name": "catalog_guid", | |
| 100 | + "in": "formData", | |
| 101 | + "type": "string", | |
| 102 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 103 | + | |
| 104 | + {"name": "catalog_guid", | |
| 105 | + "in": "formData", | |
| 106 | + "type": "string", | |
| 107 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 108 | + | |
| 109 | + {"name": "status", | |
| 110 | + "in": "formData", | |
| 111 | + "type": "string", | |
| 112 | + "description": "[WMS]status"}, | |
| 113 | + {"name": "username", | |
| 114 | + "in": "formData", | |
| 115 | + "type": "string", | |
| 116 | + "description": "[WMS]username"}, | |
| 117 | + {"name": "readonly", | |
| 118 | + "in": "formData", | |
| 119 | + "type": "string", | |
| 120 | + "description": "[WMS]readonly"}, | |
| 121 | + {"name": "sid", | |
| 122 | + "in": "formData", | |
| 123 | + "type": "string", | |
| 124 | + "description": "[WMS]sid"}, | |
| 125 | + {"name": "stype", | |
| 126 | + "in": "formData", | |
| 127 | + "type": "string", | |
| 128 | + "description": "[WMS]stype"}, | |
| 129 | + {"name": "ssupply", | |
| 130 | + "in": "formData", | |
| 131 | + "type": "string", | |
| 132 | + "description": "[WMS]ssupply"}, | |
| 133 | + {"name": "sctime", | |
| 134 | + "in": "formData", | |
| 135 | + "type": "string", | |
| 136 | + "description": "[WMS]sctime"}, | |
| 137 | + {"name": "company", | |
| 138 | + "in": "formData", | |
| 139 | + "type": "string", | |
| 140 | + "description": "[WMS]company"}, | |
| 141 | + {"name": "abstract", | |
| 142 | + "in": "formData", | |
| 143 | + "type": "string", | |
| 144 | + "description": "[WMS]abstract"}, | |
| 145 | + {"name": "thumbnail", | |
| 146 | + "in": "formData", | |
| 147 | + "type": "string", | |
| 148 | + "description": "[WMS]thumbnail"}, | |
| 149 | + {"name": "layer_style", | |
| 150 | + "in": "formData", | |
| 151 | + "type": "string", | |
| 152 | + "description": "[WMS,WMTS]layer_style"}, | |
| 153 | + | |
| 79 | 154 | ], |
| 80 | 155 | "responses": { |
| 81 | 156 | 200: { | ... | ... |
| ... | ... | @@ -25,12 +25,3 @@ class DataManager(BlueprintApi): |
| 25 | 25 | 上传缩略图 |
| 26 | 26 | """ |
| 27 | 27 | return upload_oview.Api().result |
| 28 | - | |
| 29 | - @staticmethod | |
| 30 | - @bp.route('/UploadOverview', methods=['POST']) | |
| 31 | - @swag_from(upload_oview.Api.api_doc) | |
| 32 | - def api_upload_oview(): | |
| 33 | - """ | |
| 34 | - 上传缩略图 | |
| 35 | - """ | |
| 36 | - return upload_oview.Api().result | ... | ... |
| ... | ... | @@ -48,6 +48,9 @@ class WMTS(db.Model): |
| 48 | 48 | #图层描述 |
| 49 | 49 | layer_description = Column(String) |
| 50 | 50 | |
| 51 | - scheme_guid = Column(String,ForeignKey('dmap_tile_scheme.guid')) | |
| 51 | + # scheme_guid = Column(String,ForeignKey('dmap_tile_scheme.guid')) | |
| 52 | + # | |
| 53 | + # service_guid = Column(String,ForeignKey('dmap_service.guid')) | |
| 52 | 54 | |
| 53 | - service_guid = Column(String,ForeignKey('dmap_service.guid')) | |
| \ No newline at end of file | ||
| 55 | + scheme_guid = Column(String) | |
| 56 | + service_guid = Column(String) | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -10,6 +10,9 @@ from .models import WMTS |
| 10 | 10 | from app.models import Service,db |
| 11 | 11 | import datetime |
| 12 | 12 | import configure |
| 13 | +import requests | |
| 14 | +from requests import Response | |
| 15 | +import json | |
| 13 | 16 | class Api(ApiTemplate): |
| 14 | 17 | |
| 15 | 18 | api_name = "注册WMTS服务" |
| ... | ... | @@ -24,25 +27,28 @@ class Api(ApiTemplate): |
| 24 | 27 | service_guid = uuid.uuid1().__str__() |
| 25 | 28 | wmts_service_guid = uuid.uuid1().__str__() |
| 26 | 29 | |
| 27 | - | |
| 28 | - | |
| 29 | 30 | service = Service( |
| 30 | 31 | guid = service_guid, |
| 31 | 32 | name = self.para.get("name"), |
| 32 | 33 | alias = self.para.get("alias"), |
| 33 | - state = int(self.para.get("state")) if self.para.get("state") else None, | |
| 34 | + state = 1, | |
| 34 | 35 | create_time = this_time, |
| 35 | 36 | update_time = this_time, |
| 36 | 37 | description = self.para.get("description"), |
| 37 | - #node = Column(Integer), | |
| 38 | + node = 1, | |
| 38 | 39 | overview = "http://{}/API/Service/Overview/{}".format( |
| 39 | 40 | configure.deploy_ip_host, |
| 40 | 41 | self.para.get("overview") if self.para.get("overview") else "wmts_tb.png"), |
| 41 | - type = self.para.get("service_type"), | |
| 42 | + type = self.para.get("type"), | |
| 42 | 43 | service_guid = wmts_service_guid, |
| 43 | 44 | catalog_guid = self.para.get("catalog_guid") |
| 44 | 45 | ) |
| 45 | 46 | |
| 47 | + #已存在就删除 | |
| 48 | + wmts_isexist = WMTS.query.filter_by(name=self.para.get("name")).one_or_none() | |
| 49 | + if wmts_isexist: | |
| 50 | + db.session.delete(wmts_isexist) | |
| 51 | + | |
| 46 | 52 | wmts = WMTS( |
| 47 | 53 | guid = wmts_service_guid, |
| 48 | 54 | name = self.para.get("name"), |
| ... | ... | @@ -60,16 +66,25 @@ class Api(ApiTemplate): |
| 60 | 66 | layer_extent = self.para.get("layer_extent"), |
| 61 | 67 | layer_description = self.para.get("layer_description"), |
| 62 | 68 | scheme_guid = self.para.get("scheme_guid"), |
| 63 | - service_guid = service_guid | |
| 69 | + service_guid = service_guid, | |
| 70 | + metadata_url="{}/DMap/Services/{}/MapServer/WMTSServer".format(configure.wmts_url,self.para.get("name")) | |
| 64 | 71 | ) |
| 65 | 72 | |
| 66 | - | |
| 67 | - #调用WMTS的注册服务接口 | |
| 68 | - | |
| 69 | - | |
| 70 | 73 | db.session.add(service) |
| 71 | 74 | db.session.add(wmts) |
| 72 | 75 | db.session.commit() |
| 76 | + | |
| 77 | + # 调用WMTS的注册服务接口 | |
| 78 | + try: | |
| 79 | + url = "{}/dmap/api/manager/updatecache?servicename={}".format(configure.wmts_url,service.name) | |
| 80 | + resp:Response = requests.get(url) | |
| 81 | + if not resp.json()["status"].__eq__("true"): | |
| 82 | + raise Exception("调用WMTS的注册服务接口失败!") | |
| 83 | + except Exception as e: | |
| 84 | + db.session.delete(service) | |
| 85 | + db.session.delete(wmts) | |
| 86 | + db.session.commit() | |
| 87 | + raise e | |
| 73 | 88 | res["data"] = service_guid |
| 74 | 89 | res["result"] = True |
| 75 | 90 | except Exception as e: |
| ... | ... | @@ -80,7 +95,78 @@ class Api(ApiTemplate): |
| 80 | 95 | api_doc = { |
| 81 | 96 | "tags": ["WMTS接口"], |
| 82 | 97 | "parameters": [ |
| 83 | - | |
| 98 | + {"name": "name", | |
| 99 | + "in": "formData", | |
| 100 | + "type": "string", | |
| 101 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 102 | + {"name": "alias", | |
| 103 | + "in": "formData", | |
| 104 | + "type": "string", | |
| 105 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 106 | + {"name": "description", | |
| 107 | + "in": "formData", | |
| 108 | + "type": "string", | |
| 109 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 110 | + {"name": "type", | |
| 111 | + "in": "formData", | |
| 112 | + "type": "string", | |
| 113 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 114 | + {"name": "catalog_guid", | |
| 115 | + "in": "formData", | |
| 116 | + "type": "string", | |
| 117 | + "description": "[WMS,WMTS,影像WMS,影像WMTS]"}, | |
| 118 | + {"name": "scheme_guid", | |
| 119 | + "in": "formData", | |
| 120 | + "type": "string", | |
| 121 | + "description": "[WMTS,影像WMTS]切片方案"}, | |
| 122 | + {"name": "overview", | |
| 123 | + "in": "formData", | |
| 124 | + "type": "string", | |
| 125 | + "description": "[WMTS]缩略图"}, | |
| 126 | + {"name": "wmts_type", | |
| 127 | + "in": "formData", | |
| 128 | + "type": "string", | |
| 129 | + "description": "[WMTS]wmts_type"}, | |
| 130 | + {"name": "vendor", | |
| 131 | + "in": "formData", | |
| 132 | + "type": "string", | |
| 133 | + "description": "[WMTS]厂商"}, | |
| 134 | + {"name": "crs", | |
| 135 | + "in": "formData", | |
| 136 | + "type": "string", | |
| 137 | + "description": "[WMTS]坐标系"}, | |
| 138 | + {"name": "datasource", | |
| 139 | + "in": "formData", | |
| 140 | + "type": "string", | |
| 141 | + "description": "[WMTS]数据路径"}, | |
| 142 | + {"name": "layer_name", | |
| 143 | + "in": "formData", | |
| 144 | + "type": "string", | |
| 145 | + "description": "[WMTS]图层名"}, | |
| 146 | + {"name": "layer_alias", | |
| 147 | + "in": "formData", | |
| 148 | + "type": "string", | |
| 149 | + "description": "[WMTS]图层别名"}, | |
| 150 | + {"name": "layer_title", | |
| 151 | + "in": "formData", | |
| 152 | + "type": "string", | |
| 153 | + "description": "[WMTS]图层标题"}, | |
| 154 | + {"name": "layer_style", | |
| 155 | + "in": "formData", | |
| 156 | + "type": "string", | |
| 157 | + "description": "[WMTS]图层样式"}, | |
| 158 | + {"name": "layer_format", | |
| 159 | + "in": "formData", | |
| 160 | + "type": "string", | |
| 161 | + "description": "[WMTS]图层format"}, | |
| 162 | + {"name": "layer_extent", | |
| 163 | + "in": "formData", | |
| 164 | + "type": "string", | |
| 165 | + "description": "[WMTS]图层范围"}, | |
| 166 | + {"name": "layer_description", | |
| 167 | + "in": "formData", | |
| 168 | + "type": "string", | |
| 169 | + "description": "[WMTS]图层描述"}, | |
| 84 | 170 | ], |
| 85 | 171 | "responses": { |
| 86 | 172 | 200: { | ... | ... |
| ... | ... | @@ -65,7 +65,7 @@ class EntryData: |
| 65 | 65 | except Exception as e: |
| 66 | 66 | this_task.write_process("{} 任务结束!".format(e.__str__())) |
| 67 | 67 | this_task.update({"state": -1, "process": "入库失败", "update_time": datetime.datetime.now()}) |
| 68 | - StructurePrint.print(e.__str__(),"ERROR") | |
| 68 | + StructurePrint().print(e.__str__(),"ERROR") | |
| 69 | 69 | # rollback |
| 70 | 70 | this_task.pg_ds.RollbackTransaction() |
| 71 | 71 | finally: |
| ... | ... | @@ -79,13 +79,13 @@ class EntryData: |
| 79 | 79 | i+=1 |
| 80 | 80 | if i<30: |
| 81 | 81 | shutil.rmtree(dir_path,True) |
| 82 | - StructurePrint.print("删除文件成功!") | |
| 82 | + StructurePrint().print("删除文件成功!") | |
| 83 | 83 | else: |
| 84 | 84 | raise Exception("找不到文件!") |
| 85 | 85 | |
| 86 | 86 | except Exception as e: |
| 87 | - StructurePrint.print(e.__str__(), "ERROR") | |
| 88 | - StructurePrint.print("删除文件失败!","ERROR") | |
| 87 | + StructurePrint().print(e.__str__(), "ERROR") | |
| 88 | + StructurePrint().print("删除文件失败!","ERROR") | |
| 89 | 89 | |
| 90 | 90 | def entry_shp(self,data_path,this_task): |
| 91 | 91 | ''' |
| ... | ... | @@ -186,7 +186,7 @@ class EntryData: |
| 186 | 186 | for feature in layer: |
| 187 | 187 | count+=1 |
| 188 | 188 | if count%10000==0: |
| 189 | - StructurePrint.print("{}图层已入库{}个对象".format(new_layer_name,count)) | |
| 189 | + StructurePrint().print("{}图层已入库{}个对象".format(new_layer_name,count)) | |
| 190 | 190 | # print(time.time()-this_time) |
| 191 | 191 | this_time=time.time() |
| 192 | 192 | geo :Geometry = feature.GetGeometryRef() |
| ... | ... | @@ -194,7 +194,7 @@ class EntryData: |
| 194 | 194 | if geo is not None: |
| 195 | 195 | if geo.IsEmpty(): |
| 196 | 196 | this_task.write_process("FID:{}要素的空间字段为空,跳过该要素!".format(feature.GetFID())) |
| 197 | - StructurePrint.print("FID:{}要素的空间字段为空,跳过该要素!".format(feature.GetFID()),"WARN") | |
| 197 | + StructurePrint().print("FID:{}要素的空间字段为空,跳过该要素!".format(feature.GetFID()),"WARN") | |
| 198 | 198 | continue |
| 199 | 199 | out_feature: Feature = copy.copy(feature) |
| 200 | 200 | |
| ... | ... | @@ -210,7 +210,7 @@ class EntryData: |
| 210 | 210 | except Exception as e: |
| 211 | 211 | # this_task.pg_ds.RollbackTransaction() |
| 212 | 212 | this_task.write_process("{}入库失败,数据回滚!原因:{}".format(new_layer_name,e.__str__())) |
| 213 | - StructurePrint.print("{}入库失败,数据回滚!原因:{}".format(new_layer_name,e.__str__()), "error") | |
| 213 | + StructurePrint().print("{}入库失败,数据回滚!原因:{}".format(new_layer_name,e.__str__()), "error") | |
| 214 | 214 | return False,new_layer_name |
| 215 | 215 | # finally: |
| 216 | 216 | ... | ... |
| ... | ... | @@ -87,7 +87,7 @@ class EntryDataVacuate: |
| 87 | 87 | except Exception as e: |
| 88 | 88 | this_task.write_process("{} 任务结束!".format(e.__str__())) |
| 89 | 89 | this_task.update({"state": -1, "process": "入库失败", "update_time": datetime.datetime.now()}) |
| 90 | - StructurePrint.print(e.__str__(),"ERROR") | |
| 90 | + StructurePrint().print(e.__str__(),"ERROR") | |
| 91 | 91 | # rollback |
| 92 | 92 | this_task.rollback() |
| 93 | 93 | finally: |
| ... | ... | @@ -101,13 +101,13 @@ class EntryDataVacuate: |
| 101 | 101 | i+=1 |
| 102 | 102 | if i<30: |
| 103 | 103 | shutil.rmtree(dir_path,True) |
| 104 | - StructurePrint.print("删除文件成功!") | |
| 104 | + StructurePrint().print("删除文件成功!") | |
| 105 | 105 | else: |
| 106 | 106 | raise Exception("找不到文件!") |
| 107 | 107 | |
| 108 | 108 | except Exception as e: |
| 109 | - StructurePrint.print(e.__str__(), "ERROR") | |
| 110 | - StructurePrint.print("删除文件失败!","ERROR") | |
| 109 | + StructurePrint().print(e.__str__(), "ERROR") | |
| 110 | + StructurePrint().print("删除文件失败!","ERROR") | |
| 111 | 111 | |
| 112 | 112 | |
| 113 | 113 | def entry_shp(self,data_path,this_task,meta): |
| ... | ... | @@ -209,7 +209,7 @@ class EntryDataVacuate: |
| 209 | 209 | for feature in layer: |
| 210 | 210 | count+=1 |
| 211 | 211 | if count%10000==0: |
| 212 | - StructurePrint.print("{}图层已入库{}个对象".format(new_layer_name,count)) | |
| 212 | + StructurePrint().print("{}图层已入库{}个对象".format(new_layer_name,count)) | |
| 213 | 213 | # print(time.time()-this_time) |
| 214 | 214 | #this_time=time.time() |
| 215 | 215 | geo :Geometry = feature.GetGeometryRef() |
| ... | ... | @@ -217,7 +217,7 @@ class EntryDataVacuate: |
| 217 | 217 | if geo is not None: |
| 218 | 218 | if geo.IsEmpty(): |
| 219 | 219 | this_task.write_process("FID:{}要素的空间字段为空,跳过该要素!".format(feature.GetFID())) |
| 220 | - StructurePrint.print("FID:{}要素的空间字段为空,跳过该要素!".format(feature.GetFID()),"WARN") | |
| 220 | + StructurePrint().print("FID:{}要素的空间字段为空,跳过该要素!".format(feature.GetFID()),"WARN") | |
| 221 | 221 | continue |
| 222 | 222 | |
| 223 | 223 | out_feature: Feature = copy.copy(feature) |
| ... | ... | @@ -248,7 +248,7 @@ class EntryDataVacuate: |
| 248 | 248 | except Exception as e: |
| 249 | 249 | |
| 250 | 250 | this_task.write_process("{}入库失败,数据回滚!原因:{}".format(new_layer_name,e.__str__())) |
| 251 | - StructurePrint.print("{}入库失败,数据回滚!原因:{}".format(new_layer_name,e.__str__()), "error") | |
| 251 | + StructurePrint().print("{}入库失败,数据回滚!原因:{}".format(new_layer_name,e.__str__()), "error") | |
| 252 | 252 | print(traceback.format_exc()) |
| 253 | 253 | # 抽稀回滚 |
| 254 | 254 | # vacuate_process.rollback() |
| ... | ... | @@ -440,7 +440,7 @@ class VacuateProcess: |
| 440 | 440 | p_x = (extent[1]-extent[0])/10.0 |
| 441 | 441 | p_y = (extent[3] - extent[2]) / 10.0 |
| 442 | 442 | fill_precent=0 |
| 443 | - StructurePrint.print("判断疏密") | |
| 443 | + StructurePrint().print("判断疏密") | |
| 444 | 444 | for ix in range(10): |
| 445 | 445 | for iy in range(10): |
| 446 | 446 | grid_extent = [extent[0]+ix*p_x,extent[0]+ix*p_x+p_x,extent[2]+iy*p_y,extent[2]+iy*p_y+p_y] |
| ... | ... | @@ -453,7 +453,7 @@ class VacuateProcess: |
| 453 | 453 | fill_precent += 1 |
| 454 | 454 | |
| 455 | 455 | print(fill_precent) |
| 456 | - StructurePrint.print("判断疏密结束") | |
| 456 | + StructurePrint().print("判断疏密结束") | |
| 457 | 457 | |
| 458 | 458 | layer.SetSpatialFilter(None) |
| 459 | 459 | layer.ResetReading() | ... | ... |
| ... | ... | @@ -155,6 +155,19 @@ class GeometryAdapter: |
| 155 | 155 | return poly |
| 156 | 156 | |
| 157 | 157 | @classmethod |
| 158 | + def bbox_2_polygon(cls,bbox): | |
| 159 | + ring = ogr.Geometry(ogr.wkbLinearRing) | |
| 160 | + ring.AddPoint(bbox[0], bbox[1]) | |
| 161 | + ring.AddPoint(bbox[0], bbox[3]) | |
| 162 | + ring.AddPoint(bbox[2], bbox[3]) | |
| 163 | + ring.AddPoint(bbox[2], bbox[1]) | |
| 164 | + ring.AddPoint(bbox[0], bbox[1]) | |
| 165 | + # Create polygon | |
| 166 | + poly = ogr.Geometry(ogr.wkbPolygon) | |
| 167 | + poly.AddGeometry(ring) | |
| 168 | + return poly | |
| 169 | + | |
| 170 | + @classmethod | |
| 158 | 171 | def tuple_2_point(cls,tup): |
| 159 | 172 | point = ogr.Geometry(ogr.wkbPoint) |
| 160 | 173 | point.AddPoint(tup[0], tup[1]) | ... | ... |
| ... | ... | @@ -51,8 +51,8 @@ class SliceScheme: |
| 51 | 51 | col = int(col) |
| 52 | 52 | detaxy = parameter.get(str(level)).get("resolution")* parameter.get("cols") |
| 53 | 53 | |
| 54 | - minx = detaxy*col + parameter.get("x") | |
| 55 | - maxy = -detaxy*row +parameter.get("y") | |
| 54 | + minx = detaxy * col + parameter.get("x") | |
| 55 | + maxy = -detaxy * row + parameter.get("y") | |
| 56 | 56 | maxx = detaxy + minx |
| 57 | 57 | miny = -detaxy + maxy |
| 58 | 58 | ... | ... |
| ... | ... | @@ -5,15 +5,42 @@ |
| 5 | 5 | import datetime |
| 6 | 6 | import os |
| 7 | 7 | |
| 8 | +import logging | |
| 9 | + | |
| 8 | 10 | class StructurePrint: |
| 9 | 11 | |
| 12 | + # 单例模式作为打印 | |
| 13 | + singleton = None | |
| 14 | + f = None | |
| 15 | + | |
| 16 | + | |
| 17 | + def __new__(cls, *args, **kwargs): | |
| 18 | + if not cls.singleton: | |
| 19 | + cls.singleton = super().__new__(cls) | |
| 20 | + return cls.singleton | |
| 21 | + | |
| 10 | 22 | log_file = os.path.join(os.path.dirname( |
| 11 | 23 | os.path.dirname( |
| 12 | 24 | os.path.dirname( |
| 13 | 25 | os.path.dirname( |
| 14 | 26 | os.path.realpath(__file__))))), "logs", "log.txt") |
| 15 | - @classmethod | |
| 16 | - def print(cls,mes, type="info"): | |
| 17 | - with open(cls.log_file,"a",encoding="utf-8") as f: | |
| 27 | + | |
| 28 | + def __init__(self): | |
| 29 | + if not self.f: | |
| 30 | + self.f = open(self.log_file,"a",encoding="utf-8") | |
| 31 | + | |
| 32 | + | |
| 33 | + # def print(self,mes, type="info"): | |
| 34 | + # message = "[{}] {} {}\n".format(type.upper(), datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), mes) | |
| 35 | + # self.f.write(message) | |
| 36 | + # dd =1 | |
| 37 | + | |
| 38 | + | |
| 39 | + def print(self,mes, type="info"): | |
| 40 | + with open(self.log_file,"a",encoding="utf-8") as f: | |
| 18 | 41 | message = "[{}] {} {}\n".format(type.upper(), datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), mes) |
| 19 | 42 | f.write(message) |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | ... | ... |
| ... | ... | @@ -4,11 +4,11 @@ |
| 4 | 4 | deploy_ip_host = "172.26.40.105:8840" |
| 5 | 5 | # 系统数据库 |
| 6 | 6 | |
| 7 | -SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager" | |
| 7 | +SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager_test" | |
| 8 | 8 | |
| 9 | 9 | # 指定精华表所在位置(必须为空间库),设置为None则存放在各自的实体库中 |
| 10 | -VACUATE_DB_URI = None | |
| 11 | -# VACUATE_DB_URI = SQLALCHEMY_DATABASE_URI | |
| 10 | +#VACUATE_DB_URI = None | |
| 11 | +VACUATE_DB_URI = SQLALCHEMY_DATABASE_URI | |
| 12 | 12 | |
| 13 | 13 | # 部署模式cluster,standalone |
| 14 | 14 | deployment_mode = "cluster" |
| ... | ... | @@ -17,6 +17,10 @@ application_name = "master" |
| 17 | 17 | |
| 18 | 18 | zookeeper = "172.26.99.168:2181" |
| 19 | 19 | |
| 20 | +#WMTS服务器 | |
| 21 | +wmts_url = "http://172.26.99.160:6080" | |
| 22 | + | |
| 23 | + | |
| 20 | 24 | # 固定配置不需要修改 |
| 21 | 25 | swagger_configure = {"title": "DMapManager"} |
| 22 | 26 | entry_data_thread = 3 | ... | ... |
| 1 | 1 | #! /bin/sh |
| 2 | - | |
| 2 | +dn="dmapmanager" | |
| 3 | 3 | #停止容器 |
| 4 | 4 | echo "正在关闭容器..." |
| 5 | -docker stop dmapmanager | |
| 6 | -docker rm dmapmanager | |
| 5 | +docker stop $dn | |
| 6 | +docker rm $dn | |
| 7 | 7 | |
| 8 | 8 | curPath=$(readlink -f $(dirname $0)) |
| 9 | 9 | |
| ... | ... | @@ -24,7 +24,7 @@ fi |
| 24 | 24 | #启动容器和apache |
| 25 | 25 | echo "正在启动容器..." |
| 26 | 26 | set="--privileged=true -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0" |
| 27 | -docker run -d --name dmapmanager $set -p $port:80 -v $curPath:/usr/src/app -v $curPath/httpd.conf:/etc/httpd/conf/httpd.conf dci/dmapmanager:4.0 /usr/sbin/init | |
| 28 | -docker exec -d dmapmanager systemctl start httpd | |
| 27 | +docker run -d --name $dn $set -p $port:80 -v $curPath:/usr/src/app -v $curPath/httpd.conf:/etc/httpd/conf/httpd.conf dci/dmapmanager:4.0 /usr/sbin/init | |
| 28 | +docker exec -d $dn systemctl start httpd | |
| 29 | 29 | sleep 5 |
| 30 | 30 | curl localhost:$port/release | ... | ... |
| 1 | 1 | #! /bin/bash |
| 2 | -docker stop dmapmanager | |
| 3 | -docker rm dmapmanager | |
| 2 | +dn="dmapmanager" | |
| 3 | +#停止容器 | |
| 4 | +echo "正在关闭容器..." | |
| 5 | +docker stop $dn | |
| 6 | +docker rm $dn | |
| 4 | 7 | curPath=$(readlink -f "$(dirname "$0")") |
| 5 | 8 | #设置端口 |
| 6 | 9 | port="" |
| ... | ... | @@ -11,7 +14,7 @@ else |
| 11 | 14 | port=$1 |
| 12 | 15 | echo "端口设置为$1 ..." |
| 13 | 16 | fi |
| 14 | -docker run -d --name dmapmanager -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port:8840 -v $curPath:/usr/src/app -w /usr/src/app dci/dmapdms:4.0 gunicorn -c gun_conf.py run:app | |
| 17 | +docker run -d --name $dn -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port:8840 -v $curPath:/usr/src/app -w /usr/src/app dci/dmapdms:4.0 gunicorn -c gun_conf.py run:app | |
| 15 | 18 | # 清除未完成的任务任务 |
| 16 | 19 | sleep 5 |
| 17 | 20 | curl localhost:$port/release |
| \ No newline at end of file | ... | ... |
| 1 | 1 | #! /bin/bash |
| 2 | -docker stop dmapmanager | |
| 3 | -docker rm dmapmanager | |
| 2 | +dn="dmapmanager" | |
| 3 | +#停止容器 | |
| 4 | +echo "正在关闭容器..." | |
| 5 | +docker stop $dn | |
| 6 | +docker rm $dn | |
| 7 | + | |
| 4 | 8 | curPath=$(readlink -f "$(dirname "$0")") |
| 5 | 9 | #设置端口 |
| 6 | 10 | port="" |
| ... | ... | @@ -12,7 +16,7 @@ else |
| 12 | 16 | echo "端口设置为$1 ..." |
| 13 | 17 | fi |
| 14 | 18 | |
| 15 | -docker run -d --name dmapmanager -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port:8840 -v $curPath:/usr/src/app -w /usr/src/app dci/dmapdms:3.0 python3 ./run.py | |
| 19 | +docker run -d --name $dn -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port:8840 -v $curPath:/usr/src/app -w /usr/src/app dci/dmapdms:3.0 python3 ./run.py | |
| 16 | 20 | # 清除未完成的任务任务 |
| 17 | 21 | sleep 5 |
| 18 | 22 | curl localhost:$port/release |
| \ No newline at end of file | ... | ... |
请
注册
或
登录
后发表评论