提交 9d1053c1c083046fce17aaf4b22f97d1bd185962

作者 nheweijun
1 个父辈 6ca42a95

中秋节前备份

正在显示 60 个修改的文件 包含 2258 行增加394 行删除
... ... @@ -53,10 +53,10 @@ class Table(db.Model):
53 53 '''
54 54 数据表元数据
55 55 '''
56   - __tablename__ = 'dmdms_table'
  56 + __tablename__ = 'dmap_table'
57 57 guid = Column(String(256), primary_key=True)
58 58 # 数据源外键
59   - database_guid = Column(String(256), ForeignKey('dmdms_database.guid'))
  59 + database_guid = Column(String(256), ForeignKey('dmap_database.guid'))
60 60
61 61 # 点线面123
62 62 table_type = Column(Integer)
... ... @@ -77,7 +77,7 @@ class Table(db.Model):
77 77 is_vacuate=Column(Integer,default=0)
78 78
79 79 # 目录外键
80   - catalog_guid = Column(String(256), ForeignKey('dmdms_catalog.guid'))
  80 + catalog_guid = Column(String(256), ForeignKey('dmap_catalog.guid'))
81 81
82 82 relate_columns = relationship('Columns', backref='relate_table', lazy='dynamic')
83 83 relate_table_vacuates = relationship('TableVacuate', backref='relate_table', lazy='dynamic')
... ... @@ -87,12 +87,12 @@ class TableVacuate(db.Model):
87 87 '''
88 88 sub数据表元数据
89 89 '''
90   - __tablename__ = 'dmdms_table_vacuate'
  90 + __tablename__ = 'dmap_table_vacuate'
91 91 guid = Column(String(256), primary_key=True)
92 92 name = Column(String(256))
93 93 level = Column(Integer)
94 94 pixel_distance = Column(Float)
95   - table_guid = Column(String(256), ForeignKey('dmdms_table.guid'))
  95 + table_guid = Column(String(256), ForeignKey('dmap_table.guid'))
96 96
97 97 #所在的库
98 98 connectstr= Column(Text)
... ... @@ -101,10 +101,10 @@ class Columns(db.Model):
101 101 '''
102 102 数据表的列
103 103 '''
104   - __tablename__ = 'dmdms_column'
  104 + __tablename__ = 'dmap_column'
105 105 guid = Column(String(256), primary_key=True)
106 106 # 表外键
107   - table_guid= Column(String(256), ForeignKey('dmdms_table.guid'))
  107 + table_guid= Column(String(256), ForeignKey('dmap_table.guid'))
108 108 name=Column(String(256))
109 109 alias = Column(String(256))
110 110 create_time = Column(DateTime)
... ... @@ -114,7 +114,7 @@ class Task(db.Model):
114 114 '''
115 115 任务表
116 116 '''
117   - __tablename__ = 'dmdms_task'
  117 + __tablename__ = 'dmap_task'
118 118 guid = Column(String(256), primary_key=True)
119 119 name = Column(Text)
120 120 process = Column(Text)
... ... @@ -122,9 +122,9 @@ class Task(db.Model):
122 122 update_time = Column(DateTime)
123 123 state = Column(Integer)
124 124 #数据源外键
125   - database_guid = Column(String(256), ForeignKey('dmdms_database.guid'))
  125 + database_guid = Column(String(256), ForeignKey('dmap_database.guid'))
126 126 #目录外键
127   - catalog_guid = Column(String(256), ForeignKey('dmdms_catalog.guid'))
  127 + catalog_guid = Column(String(256), ForeignKey('dmap_catalog.guid'))
128 128 #抽稀任务指定表的guid
129 129 table_guid = Column(String(256))
130 130 #任务类型
... ... @@ -146,10 +146,10 @@ class Process(db.Model):
146 146 '''
147 147 过程信息表
148 148 '''
149   - __tablename__ = 'dmdms_process'
  149 + __tablename__ = 'dmap_process'
150 150 guid = Column(String(256), primary_key=True)
151 151 # 任务外键
152   - task_guid = Column(String(256), ForeignKey('dmdms_task.guid'))
  152 + task_guid = Column(String(256), ForeignKey('dmap_task.guid'))
153 153 time = Column(DateTime)
154 154 message = Column(Text)
155 155
... ... @@ -158,9 +158,9 @@ class Catalog(db.Model):
158 158 '''
159 159 目录表
160 160 '''
161   - __tablename__ = 'dmdms_catalog'
  161 + __tablename__ = 'dmap_catalog'
162 162 guid = Column(String(256), primary_key=True)
163   - database_guid = Column(String(256), ForeignKey('dmdms_database.guid'))
  163 + database_guid = Column(String(256), ForeignKey('dmap_database.guid'))
164 164 pguid = Column(String(256))
165 165 path = Column(Text)
166 166 name = Column(String(256))
... ... @@ -169,11 +169,12 @@ class Catalog(db.Model):
169 169 relate_tables = relationship('Table', backref='relate_catalog', lazy='dynamic')
170 170 relate_tasks = relationship('Task', backref='relate_catalog', lazy='dynamic')
171 171
  172 +
172 173 class Database(db.Model):
173 174 '''
174 175 数据源表
175 176 '''
176   - __tablename__ = 'dmdms_database'
  177 + __tablename__ = 'dmap_database'
177 178 guid = Column(String(256), primary_key=True)
178 179 name = Column(String(256))
179 180 alias = Column(String(256))
... ... @@ -194,7 +195,7 @@ class InsertingLayerName(db.Model):
194 195 '''
195 196 正在入库的数据
196 197 '''
197   - __tablename__ = 'dmdms_iln'
  198 + __tablename__ = 'dmap_iln'
198 199 guid = Column(String(256), primary_key=True)
199 200 task_guid = Column(String(256))
200 201 name = Column(String(256))
... ... @@ -203,9 +204,9 @@ class InsertingLayerName(db.Model):
203 204 class Service(db.Model):
204 205 '''
205 206 '''
206   - __tablename__ = 'dmdms_service'
  207 + __tablename__ = 'dmap_service'
207 208 guid = Column(String(256), primary_key=True)
208   - name=Column(String(256))
  209 + name = Column(String(256))
209 210 alias = Column(String(256))
210 211 #服务状态
211 212 state= Column(Integer)
... ... @@ -216,5 +217,55 @@ class Service(db.Model):
216 217 #服务节点
217 218 node = Column(Integer)
218 219 #服务缩略图
219   - overview = Column(Binary)
  220 + overview = Column(Text)
  221 + #服务类型
  222 + type = Column(String(256))
  223 + #具体服务id
  224 + service_guid = Column(String(256))
  225 + # 目录外键
  226 + catalog_guid = Column(String(256), ForeignKey('dmap_service_catalog.guid'))
220 227
  228 +
  229 +class ServiceCatalog(db.Model):
  230 + '''
  231 + 目录表
  232 + '''
  233 + __tablename__ = 'dmap_service_catalog'
  234 + guid = Column(String(256), primary_key=True)
  235 + database_guid = Column(String(256), ForeignKey('dmap_database.guid'))
  236 + pguid = Column(String(256))
  237 + path = Column(Text)
  238 + name = Column(String(256))
  239 + sort = Column(Integer)
  240 + description = Column(Text)
  241 + relate_services = relationship('Service', backref='relate_catalog', lazy='dynamic')
  242 +
  243 +
  244 +
  245 +class TileScheme(db.Model):
  246 + '''
  247 + 切片方案表
  248 + '''
  249 + __tablename__ = 'dmap_tile_scheme'
  250 + guid = Column(String(256), primary_key=True)
  251 + name = Column(String(256))
  252 + alias = Column(String(256))
  253 + description = Column(Text)
  254 + crs = Column(String(256))
  255 + crs_wkt = Column(Text)
  256 +
  257 + extent = Column(Text)
  258 + top_left = Column(String(256))
  259 +
  260 + # xmin = Column(Float)
  261 + # ymin = Column(Float)
  262 + # xmax = Column(Float)
  263 + # ymax = Column(Float)
  264 + # origin_x = Column(Float)
  265 + # origin_y = Column(Float)
  266 +
  267 + levels = Column(Text)
  268 + dpi = Column(Integer)
  269 + rows = Column(Integer)
  270 + cols = Column(Integer)
  271 + update_time = Column(DateTime)
\ No newline at end of file
... ...
... ... @@ -13,7 +13,7 @@ class User (db.Model):
13 13 '''
14 14 用户信息表
15 15 '''
16   - __tablename__ = "dmdms_user"
  16 + __tablename__ = "dmap_user"
17 17 id = Column(Integer, primary_key=True)
18 18 username = Column(Text)
19 19 password = Column(Text)
... ... @@ -33,28 +33,28 @@ class User (db.Model):
33 33
34 34
35 35 class OAuth2Client(db.Model, OAuth2ClientMixin):
36   - __tablename__ = 'dmdms_oauth2_client'
  36 + __tablename__ = 'dmap_oauth2_client'
37 37
38 38 id = Column(Integer, primary_key=True)
39 39 user_id = Column(
40   - Integer, ForeignKey('dmdms_user.id', ondelete='CASCADE'))
  40 + Integer, ForeignKey('dmap_user.id', ondelete='CASCADE'))
41 41 user = relationship('User')
42 42
43 43
44 44 class OAuth2AuthorizationCode(db.Model, OAuth2AuthorizationCodeMixin):
45   - __tablename__ = 'dmdms_oauth2_code'
  45 + __tablename__ = 'dmap_oauth2_code'
46 46
47 47 id = Column(Integer, primary_key=True)
48 48 user_id = Column(
49   - Integer, ForeignKey('dmdms_user.id', ondelete='CASCADE'))
  49 + Integer, ForeignKey('dmap_user.id', ondelete='CASCADE'))
50 50 user = relationship('User')
51 51
52 52
53 53 class OAuth2Token(db.Model, OAuth2TokenMixin):
54   - __tablename__ = 'dmdms_oauth2_token'
  54 + __tablename__ = 'dmap_oauth2_token'
55 55
56 56 id = Column(Integer, primary_key=True)
57 57 user_id = Column(
58   - Integer, ForeignKey('dmdms_user.id', ondelete='CASCADE'))
  58 + Integer, ForeignKey('dmap_user.id', ondelete='CASCADE'))
59 59 # name = Column(Text)
60 60 user = relationship('User')
\ No newline at end of file
... ...
  1 +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
... ...
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<metadata xml:lang="zh"><Esri><CreaDate>20170418</CreaDate><CreaTime>19355600</CreaTime><ArcGISFormat>1.0</ArcGISFormat><SyncOnce>FALSE</SyncOnce><DataProperties><itemProps><itemName Sync="TRUE">北京县区</itemName><imsContentType Sync="TRUE">002</imsContentType><itemLocation><linkage Sync="TRUE">file://\\4N\E$\Data\北京县区区划\北京县区.shp</linkage><protocol Sync="TRUE">Local Area Network</protocol></itemLocation><nativeExtBox><westBL Sync="TRUE">115.417282</westBL><eastBL Sync="TRUE">117.500126</eastBL><southBL Sync="TRUE">39.438282</southBL><northBL Sync="TRUE">41.059244</northBL><exTypeCode Sync="TRUE">1</exTypeCode></nativeExtBox><itemSize Sync="TRUE">0.270</itemSize></itemProps><coordRef><type Sync="TRUE">Geographic</type><geogcsn Sync="TRUE">GCS_WGS_1984</geogcsn><csUnits Sync="TRUE">Angular Unit: Degree (0.017453)</csUnits><peXml Sync="TRUE">&lt;GeographicCoordinateSystem xsi:type='typens:GeographicCoordinateSystem' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://www.esri.com/schemas/ArcGIS/10.1'&gt;&lt;WKT&gt;GEOGCS[&amp;quot;GCS_WGS_1984&amp;quot;,DATUM[&amp;quot;D_WGS_1984&amp;quot;,SPHEROID[&amp;quot;WGS_1984&amp;quot;,6378137.0,298.257223563]],PRIMEM[&amp;quot;Greenwich&amp;quot;,0.0],UNIT[&amp;quot;Degree&amp;quot;,0.0174532925199433],AUTHORITY[&amp;quot;EPSG&amp;quot;,4326]]&lt;/WKT&gt;&lt;XOrigin&gt;-400&lt;/XOrigin&gt;&lt;YOrigin&gt;-400&lt;/YOrigin&gt;&lt;XYScale&gt;11258999068426.238&lt;/XYScale&gt;&lt;ZOrigin&gt;-100000&lt;/ZOrigin&gt;&lt;ZScale&gt;10000&lt;/ZScale&gt;&lt;MOrigin&gt;-100000&lt;/MOrigin&gt;&lt;MScale&gt;10000&lt;/MScale&gt;&lt;XYTolerance&gt;8.983152841195215e-009&lt;/XYTolerance&gt;&lt;ZTolerance&gt;0.001&lt;/ZTolerance&gt;&lt;MTolerance&gt;0.001&lt;/MTolerance&gt;&lt;HighPrecision&gt;true&lt;/HighPrecision&gt;&lt;LeftLongitude&gt;-180&lt;/LeftLongitude&gt;&lt;WKID&gt;4326&lt;/WKID&gt;&lt;LatestWKID&gt;4326&lt;/LatestWKID&gt;&lt;/GeographicCoordinateSystem&gt;</peXml></coordRef></DataProperties><SyncDate>20210316</SyncDate><SyncTime>11462400</SyncTime><ModDate>20210316</ModDate><ModTime>11462400</ModTime></Esri><dataIdInfo><envirDesc Sync="TRUE"> Version 6.2 (Build 9200) ; Esri ArcGIS 10.2.0.3348</envirDesc><dataLang><languageCode value="zho" Sync="TRUE"></languageCode><countryCode value="CHN" Sync="TRUE"></countryCode></dataLang><idCitation><resTitle Sync="TRUE">北京县区</resTitle><presForm><PresFormCd value="005" Sync="TRUE"></PresFormCd></presForm></idCitation><spatRpType><SpatRepTypCd value="001" Sync="TRUE"></SpatRepTypCd></spatRpType><dataExt><geoEle><GeoBndBox esriExtentType="search"><exTypeCode Sync="TRUE">1</exTypeCode><westBL Sync="TRUE">115.417282</westBL><eastBL Sync="TRUE">117.500126</eastBL><northBL Sync="TRUE">41.059244</northBL><southBL Sync="TRUE">39.438282</southBL></GeoBndBox></geoEle></dataExt></dataIdInfo><mdLang><languageCode value="zho" Sync="TRUE"></languageCode><countryCode value="CHN" Sync="TRUE"></countryCode></mdLang><distInfo><distFormat><formatName Sync="TRUE">Shapefile</formatName></distFormat><distTranOps><transSize Sync="TRUE">0.270</transSize></distTranOps></distInfo><mdHrLv><ScopeCd value="005" Sync="TRUE"></ScopeCd></mdHrLv><mdHrLvName Sync="TRUE">dataset</mdHrLvName><refSysInfo><RefSystem><refSysID><identCode code="4326" Sync="TRUE"></identCode><idCodeSpace Sync="TRUE">EPSG</idCodeSpace><idVersion Sync="TRUE">8.1.1</idVersion></refSysID></RefSystem></refSysInfo><spatRepInfo><VectSpatRep><geometObjs Name="北京县区"><geoObjTyp><GeoObjTypCd value="002" Sync="TRUE"></GeoObjTypCd></geoObjTyp><geoObjCnt Sync="TRUE">17</geoObjCnt></geometObjs><topLvl><TopoLevCd value="001" Sync="TRUE"></TopoLevCd></topLvl></VectSpatRep></spatRepInfo><spdoinfo><ptvctinf><esriterm Name="北京县区"><efeatyp Sync="TRUE">Simple</efeatyp><efeageom code="4" Sync="TRUE"></efeageom><esritopo Sync="TRUE">FALSE</esritopo><efeacnt Sync="TRUE">17</efeacnt><spindex Sync="TRUE">TRUE</spindex><linrefer Sync="TRUE">FALSE</linrefer></esriterm></ptvctinf></spdoinfo><eainfo><detailed Name="北京县区"><enttyp><enttypl Sync="TRUE">北京县区</enttypl><enttypt Sync="TRUE">Feature Class</enttypt><enttypc Sync="TRUE">17</enttypc></enttyp><attr><attrlabl Sync="TRUE">FID</attrlabl><attalias Sync="TRUE">FID</attalias><attrtype Sync="TRUE">OID</attrtype><attwidth Sync="TRUE">4</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale><attrdef Sync="TRUE">Internal feature number.</attrdef><attrdefs Sync="TRUE">Esri</attrdefs><attrdomv><udom Sync="TRUE">Sequential unique whole numbers that are automatically generated.</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">OBJECTID</attrlabl><attalias Sync="TRUE">OBJECTID</attalias><attrtype Sync="TRUE">Double</attrtype><attwidth Sync="TRUE">10</attwidth><atprecis Sync="TRUE">10</atprecis><attscale Sync="TRUE">0</attscale><attrdef Sync="TRUE">Internal feature number.</attrdef><attrdefs Sync="TRUE">Esri</attrdefs><attrdomv><udom Sync="TRUE">Sequential unique whole numbers that are automatically generated.</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">Shape</attrlabl><attalias Sync="TRUE">Shape</attalias><attrtype Sync="TRUE">Geometry</attrtype><attwidth Sync="TRUE">0</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale><attrdef Sync="TRUE">Feature geometry.</attrdef><attrdefs Sync="TRUE">Esri</attrdefs><attrdomv><udom Sync="TRUE">Coordinates defining the features.</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">NAME</attrlabl><attalias Sync="TRUE">NAME</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">60</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale></attr><attr><attrlabl Sync="TRUE">KIND</attrlabl><attalias Sync="TRUE">KIND</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">4</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale></attr><attr><attrlabl Sync="TRUE">Shape_Leng</attrlabl><attalias Sync="TRUE">Shape_Leng</attalias><attrtype Sync="TRUE">Double</attrtype><attwidth Sync="TRUE">19</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale></attr><attr><attrlabl Sync="TRUE">Shape_Area</attrlabl><attalias Sync="TRUE">Shape_Area</attalias><attrtype Sync="TRUE">Double</attrtype><attwidth Sync="TRUE">19</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale><attrdef Sync="TRUE">Area of feature in internal units squared.</attrdef><attrdefs Sync="TRUE">Esri</attrdefs><attrdomv><udom Sync="TRUE">Positive real numbers that are automatically generated.</udom></attrdomv></attr></detailed></eainfo><mdDateSt Sync="TRUE">20210316</mdDateSt><mdChar><CharSetCd value="004" Sync="TRUE"></CharSetCd></mdChar></metadata>
... ...
... ... @@ -51,7 +51,7 @@ class Api(ApiTemplate):
51 51
52 52 else:
53 53 # 保存文件
54   - parent = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
  54 + parent = os.path.dirname(os.path.realpath(__file__))
55 55 dir_path, store_file = FileProcess.save(parent)
56 56 store_path = ZipUtil.unzip(store_file)
57 57
... ...
... ... @@ -2,11 +2,13 @@
2 2 #createtime: 2021/1/27
3 3 #email: nheweijun@sina.com
4 4
5   -from app.models import Table,Columns
  5 +from app.models import Table,Columns,DES
6 6
7 7 from app.util.component.ApiTemplate import ApiTemplate
8 8 from app.util.component.ModelVisitor import ModelVisitor
9   -
  9 +from app.util.component.PGUtil import PGUtil
  10 +from osgeo.ogr import DataSource,Layer
  11 +from osgeo.osr import SpatialReference
10 12 class Api(ApiTemplate):
11 13 api_name = "表信息"
12 14 def process(self):
... ... @@ -16,10 +18,21 @@ class Api(ApiTemplate):
16 18 table = Table.query.filter_by(guid=table_guid).one_or_none()
17 19 if not table:
18 20 raise Exception("数据不存在!")
19   -
  21 + pg_ds = PGUtil.open_pg_data_source(0,DES.decode(table.relate_database.sqlalchemy_uri))
  22 + layer:Layer = pg_ds.GetLayerByName(table.name)
  23 + append_dict ={"epsg":None,"sr_wkt":None,"sr_proj4":None,"exist":1}
  24 + if layer:
  25 + sr:SpatialReference = layer.GetSpatialRef()
  26 + if sr:
  27 + append_dict["epsg"] = sr.GetAuthorityCode(None)
  28 + append_dict["sr_wkt"] = sr.ExportToWkt()
  29 + append_dict["sr_proj4"] = sr.ExportToProj4()
  30 + else:
  31 + append_dict["exist"]=0
20 32 columns = table.relate_columns.order_by(Columns.name).all()
21 33 res["data"]=ModelVisitor.table_to_json(table)
22 34 res["data"]["columns"] = ModelVisitor.objects_to_jsonarray(columns)
  35 + res["data"].update(append_dict)
23 36 res["result"] = True
24 37
25 38 except Exception as e:
... ...
... ... @@ -5,18 +5,20 @@
5 5
6 6 import datetime
7 7 import traceback
8   -from app.models import Table, Database, DES,Task,db,TableVacuate
  8 +from app.models import Table, Database, DES,Task,db,TableVacuate,Process
9 9
10 10 from sqlalchemy.engine import ResultProxy
11 11 from app.util.component.ApiTemplate import ApiTemplate
12   -from app.util.component.PGUtil import PGUtil
13   -from app.util.component.EntryDataVacuate import VacuateProcess,ThisTask,Process
  12 +
14 13 from app.util.component.StructuredPrint import StructurePrint
15 14 from app.util.component.PGUtil import PGUtil
16 15 import multiprocessing
17 16 import uuid
18 17 import configure
19   -from osgeo.ogr import DataSource,Layer
  18 +from osgeo.ogr import DataSource,Layer,Geometry
  19 +from osgeo import ogr
  20 +from app.util.component.VacuateConf import VacuateConf
  21 +from app.util.component.GeometryAdapter import GeometryAdapter
20 22
21 23 from .table_vacuate_ref import Api as RefApi
22 24
... ... @@ -139,8 +141,9 @@ class Api(ApiTemplate):
139 141 geo = feature.GetGeometryRef()
140 142 #插入抽稀图层
141 143 if geo is not None:
142   - vacuate_process.vacuate(geo)
  144 + vacuate_process.vacuate(geo,feature)
143 145
  146 + vacuate_process.set_vacuate_count()
144 147
145 148 #新增
146 149 if configure.VACUATE_DB_URI:
... ... @@ -212,4 +215,221 @@ class Api(ApiTemplate):
212 215 }
213 216 }
214 217 }
215   - }
\ No newline at end of file
  218 + }
  219 +
  220 +class VacuateProcess:
  221 +
  222 + max_level=0
  223 + fill_dict={}
  224 + vacuate_layers={}
  225 + vacuate_layers_gridsize={}
  226 + pg_ds_dict = {}
  227 + # 图层要素大于5W才抽稀
  228 + least_vacuate_count = VacuateConf.least_vacuate_count
  229 +
  230 + extent=[]
  231 + is_spatial=False
  232 +
  233 + lonlat_gridsize = VacuateConf.lonlat_gridsize
  234 + project_gridsize = VacuateConf.project_gridsize
  235 +
  236 + # 该抽稀过程使用的grid_size
  237 + t_grid_size = []
  238 +
  239 + # 该抽稀过程的抽稀网格
  240 + this_gridsize=[]
  241 +
  242 +
  243 + def __init__(self,layer:Layer,table_guid, options,sqlalchemy_uri):
  244 +
  245 + #是空间图层才初始化
  246 + if layer.GetExtent()[0] > 0 or layer.GetExtent()[0] < 0:
  247 +
  248 + self.is_spatial=True
  249 +
  250 + # 判断需要抽稀多少级
  251 +
  252 + lc = layer.GetFeatureCount()
  253 + extent = layer.GetExtent()
  254 + self.extent=extent
  255 +
  256 + #判断疏密程度
  257 + p_x = (extent[1]-extent[0])/10.0
  258 + p_y = (extent[3] - extent[2]) / 10.0
  259 + fill_precent=0
  260 + StructurePrint.print("判断疏密")
  261 + for ix in range(10):
  262 + for iy in range(10):
  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]
  264 + poly = GeometryAdapter.envelop_2_polygon(grid_extent)
  265 +
  266 + layer.SetSpatialFilter(None)
  267 + layer.SetSpatialFilter(poly)
  268 + layer.ResetReading()
  269 + if layer.GetNextFeature():
  270 + fill_precent += 1
  271 +
  272 + print(fill_precent)
  273 + StructurePrint.print("判断疏密结束")
  274 +
  275 + layer.SetSpatialFilter(None)
  276 + layer.ResetReading()
  277 + # 固有疏密程度
  278 + original_density=8
  279 +
  280 +
  281 + # 额外一层
  282 + # self.this_gridsize.append(0.000075)
  283 + # self.max_level += 1
  284 + ######
  285 +
  286 + if extent[0]>180:
  287 + self.t_grid_size=self.project_gridsize
  288 + else:
  289 + self.t_grid_size = self.lonlat_gridsize
  290 +
  291 + for grid_size in self.t_grid_size:
  292 + # 最少抽稀个数
  293 + if lc > self.least_vacuate_count:
  294 + # 网格数至少大于
  295 + if ((extent[1] - extent[0]) * (extent[3] - extent[2])) / (grid_size**2)>self.least_vacuate_count:
  296 + # 要素数量大于网格数量
  297 + # 要考虑图层的疏密程度,original_density*(100.0/fill_precent) 为疏密指数
  298 + if lc * original_density * (100.0/fill_precent)>((extent[1] - extent[0])*(extent[3] - extent[2]))/(grid_size**2) :
  299 + print(grid_size)
  300 + self.this_gridsize.append(grid_size)
  301 + self.max_level += 1
  302 +
  303 +
  304 +
  305 + # 创建抽稀ds
  306 + for l in range(self.max_level):
  307 + # pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, DES.decode(sqlalchemy_uri))
  308 + if configure.VACUATE_DB_URI:
  309 + pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, configure.VACUATE_DB_URI)
  310 + else:
  311 + pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, DES.decode(sqlalchemy_uri))
  312 + pg_ds_l.StartTransaction()
  313 + self.pg_ds_dict[l] = pg_ds_l
  314 +
  315 + # 生成抽稀图层
  316 + options = options[1:]
  317 + options.append("OVERWRITE=yes")
  318 + options.append("LAUNDER=no")
  319 +
  320 + schema = layer.schema
  321 + # 增加统计字段
  322 + schema.append(ogr.FieldDefn("_dcigrid_count_", ogr.OFTInteger))
  323 + schema.append(ogr.FieldDefn("_dcigrid_name_", ogr.OFTString))
  324 +
  325 + for l in range(self.max_level):
  326 + this_grid_len = self.this_gridsize[l]
  327 +
  328 + self.vacuate_layers_gridsize[l] = this_grid_len
  329 +
  330 + pg = self.pg_ds_dict[l]
  331 +
  332 + grid_name = str(this_grid_len)
  333 + if this_grid_len<1:
  334 + grid_name = str(this_grid_len).split(".")[-1]
  335 + if this_grid_len.__eq__(0.00008):
  336 + grid_name = "00008"
  337 +
  338 + # 抽稀图层是点面混合的
  339 + # 抽稀表有固定的命名规则
  340 + # 抽稀表一定要覆盖
  341 +
  342 +
  343 + print("{}:{}".format(self.t_grid_size.index(this_grid_len),this_grid_len))
  344 +
  345 +
  346 + v_ln = "z{}_vacuate_{}_{}".format(table_guid, self.t_grid_size.index(this_grid_len), grid_name)
  347 + vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options)
  348 + # 抽稀表需要属性
  349 + vl.CreateFields(schema)
  350 + self.vacuate_layers[l] = vl
  351 +
  352 + else:
  353 + pass
  354 +
  355 +
  356 + def vacuate(self,g,feature):
  357 +
  358 + if self.is_spatial:
  359 +
  360 + # 插入到所有抽稀图层中
  361 + for level in range(self.max_level):
  362 +
  363 + center: Geometry = g.Centroid()
  364 +
  365 + extent = g.GetEnvelope()
  366 + long_extent= extent[1]-extent[0]
  367 + lat_extent = extent[3]-extent[2]
  368 +
  369 + this_grid_len =self.vacuate_layers_gridsize[level]
  370 + #超大的直接加入
  371 + # if long_extent > 10*this_grid_len or lat_extent >10*this_grid_len:
  372 + # vacuate_layer: Layer = self.vacuate_layers.get(level)
  373 + # feat = ogr.Feature(vacuate_layer.GetLayerDefn())
  374 + # feat.SetGeometry(g)
  375 + # vacuate_layer.CreateFeature(feat)
  376 + # else:
  377 +
  378 + row = int((center.GetY() - self.extent[2]) / this_grid_len)
  379 + col = int((center.GetX() - self.extent[0]) / this_grid_len)
  380 + key = "{}.{}.{}".format(level, row, col)
  381 +
  382 + if not self.fill_dict.get(key):
  383 + self.fill_dict[key] = 0
  384 + if self.fill_dict[key] == 0:
  385 +
  386 + vacuate_layer: Layer = self.vacuate_layers.get(level)
  387 + feat = ogr.Feature(vacuate_layer.GetLayerDefn())
  388 + # 如果图形比网格小,直接存储其中心点
  389 + if this_grid_len>long_extent and this_grid_len>lat_extent:
  390 + feat.SetGeometry(center)
  391 + else:
  392 + feat.SetGeometry(g)
  393 +
  394 + # 复制旧feature属性
  395 + field_dict = feature.items()
  396 + for field_name in field_dict:
  397 + feat.SetField(field_name, field_dict[field_name])
  398 + feat.SetField("_dcigrid_name_",".".join(key.split(".")[1:]))
  399 +
  400 + vacuate_layer.CreateFeature(feat)
  401 + self.fill_dict[key] += 1
  402 + #超大的还有机会
  403 + elif (long_extent > 10*this_grid_len or lat_extent >10*this_grid_len) and self.fill_dict[key]<5:
  404 + vacuate_layer: Layer = self.vacuate_layers.get(level)
  405 + feat = ogr.Feature(vacuate_layer.GetLayerDefn())
  406 + feat.SetGeometry(g)
  407 +
  408 + # 复制旧feature属性
  409 + field_dict = feature.items()
  410 + for field_name in field_dict:
  411 + feat.SetField(field_name, field_dict[field_name])
  412 + feat.SetField("_dcigrid_name_",".".join(key.split(".")[1:]))
  413 +
  414 + vacuate_layer.CreateFeature(feat)
  415 + self.fill_dict[key] += 1
  416 + else:
  417 + self.fill_dict[key] += 1
  418 +
  419 + def set_vacuate_count(self):
  420 + if self.is_spatial:
  421 + # 插入到所有抽稀图层中
  422 + for level in range(self.max_level):
  423 + vacuate_layer: Layer = self.vacuate_layers.get(level)
  424 + for feat in vacuate_layer:
  425 + key = "{}.{}".format(level,feat.GetField("_dcigrid_name_"))
  426 + feat.SetField("_dcigrid_count_",self.fill_dict.get(key))
  427 + vacuate_layer.SetFeature(feat)
  428 +
  429 + def end(self):
  430 + for pg in self.pg_ds_dict.values():
  431 + pg.Destroy()
  432 +
  433 + def rollback(self):
  434 + for pg in self.pg_ds_dict.values():
  435 + pg.RollbackTransaction()
... ...
... ... @@ -137,7 +137,9 @@ class Api(ApiTemplate):
137 137 geo = feature.GetGeometryRef()
138 138 #插入抽稀图层
139 139 if geo is not None:
140   - vacuate_process.vacuate(geo)
  140 + vacuate_process.vacuate(geo,feature)
  141 +
  142 + vacuate_process.set_vacuate_count()
141 143
142 144 #删除原有数据
143 145 for grid in grids:
... ... @@ -278,6 +280,12 @@ class VacuateProcess:
278 280 options = options[1:]
279 281 options.append("OVERWRITE=yes")
280 282 options.append("LAUNDER=no")
  283 +
  284 + schema = layer.schema
  285 + # 增加统计字段
  286 + schema.append(ogr.FieldDefn("_dcigrid_count_", ogr.OFTInteger))
  287 + schema.append(ogr.FieldDefn("_dcigrid_name_", ogr.OFTString))
  288 +
281 289 for l in range(self.max_level):
282 290 this_grid_len = self.this_gridsize[l]
283 291
... ... @@ -304,15 +312,16 @@ class VacuateProcess:
304 312
305 313 v_ln = "z{}_vacuate_{}_{}".format(table_guid,lev, grid_name)
306 314 vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options)
  315 +
307 316 # 抽稀表需要属性
308   - vl.CreateFields(layer.schema)
  317 + vl.CreateFields(schema)
309 318 self.vacuate_layers[l] = vl
310 319
311 320 else:
312 321 pass
313 322
314 323
315   - def vacuate(self,g):
  324 + def vacuate(self,g,feature):
316 325
317 326 if self.is_spatial:
318 327
... ... @@ -349,15 +358,42 @@ class VacuateProcess:
349 358 feat.SetGeometry(center)
350 359 else:
351 360 feat.SetGeometry(g)
  361 +
  362 + # 复制旧feature属性
  363 + field_dict = feature.items()
  364 + for field_name in field_dict:
  365 + feat.SetField(field_name, field_dict[field_name])
  366 + feat.SetField("_dcigrid_name_",".".join(key.split(".")[1:]))
  367 +
352 368 vacuate_layer.CreateFeature(feat)
353 369 self.fill_dict[key] += 1
  370 +
354 371 #超大的还有机会
355 372 elif (long_extent > 10*this_grid_len or lat_extent >10*this_grid_len) and self.fill_dict[key]<5:
356 373 vacuate_layer: Layer = self.vacuate_layers.get(level)
357 374 feat = ogr.Feature(vacuate_layer.GetLayerDefn())
358 375 feat.SetGeometry(g)
  376 +
  377 + # 复制旧feature属性
  378 + field_dict = feature.items()
  379 + for field_name in field_dict:
  380 + feat.SetField(field_name, field_dict[field_name])
  381 + feat.SetField("_dcigrid_name_",".".join(key.split(".")[1:]))
  382 +
359 383 vacuate_layer.CreateFeature(feat)
360 384 self.fill_dict[key] += 1
  385 + else:
  386 + self.fill_dict[key] += 1
  387 +
  388 + def set_vacuate_count(self):
  389 + if self.is_spatial:
  390 + # 插入到所有抽稀图层中
  391 + for level in range(self.max_level):
  392 + vacuate_layer: Layer = self.vacuate_layers.get(level)
  393 + for feat in vacuate_layer:
  394 + key = "{}.{}".format(level,feat.GetField("_dcigrid_name_"))
  395 + feat.SetField("_dcigrid_count_",self.fill_dict.get(key))
  396 + vacuate_layer.SetFeature(feat)
361 397
362 398 def end(self):
363 399 for pg in self.pg_ds_dict.values():
... ...
... ... @@ -9,7 +9,7 @@ from flask import Blueprint
9 9 from app.util import BlueprintApi
10 10
11 11 from . import monitor_info
12   -class DataManager():
  12 +class Monitor(BlueprintApi):
13 13
14 14 bp = Blueprint("Monitor", __name__, url_prefix="/API/Monitor")
15 15
... ...
... ... @@ -7,9 +7,3 @@
7 7 from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Time
8 8 from app.models import db
9 9
10   -class TestModel(db.Model):
11   - '''
12   - 数据表元数据
13   - '''
14   - __tablename__ = 'test_model'
15   - guid = Column(String(256), primary_key=True)
\ No newline at end of file
... ...
... ... @@ -2,3 +2,133 @@
2 2 #author: 4N
3 3 #createtime: 2021/9/14
4 4 #email: nheweijun@sina.com
  5 +
  6 +from flasgger import swag_from
  7 +from flask import Blueprint
  8 +from app.util import BlueprintApi
  9 +from . import service_register
  10 +from . import service_type
  11 +from . import service_list
  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 +import os
  20 +from flask import send_from_directory
  21 +
  22 +
  23 +class DataManager(BlueprintApi):
  24 +
  25 + bp = Blueprint("Service", __name__, url_prefix="/API/Service")
  26 +
  27 + @staticmethod
  28 + @bp.route('/Register', methods=['POST'])
  29 + @swag_from(service_register.Api.api_doc)
  30 + def api_service_register():
  31 + """
  32 + 服务注册
  33 + """
  34 + return service_register.Api().result
  35 +
  36 + @staticmethod
  37 + @bp.route('/Type', methods=['GET'])
  38 + @swag_from(service_type.Api.api_doc)
  39 + def api_service_type():
  40 + """
  41 + 可用服务类型
  42 + """
  43 + return service_type.Api().result
  44 +
  45 + @staticmethod
  46 + @bp.route('/List', methods=['POST'])
  47 + @swag_from(service_list.Api.api_doc)
  48 + def api_service_list():
  49 + """
  50 + 服务列表
  51 + """
  52 + return service_list.Api().result
  53 +
  54 +
  55 + @staticmethod
  56 + @bp.route('/Delete', methods=['POST'])
  57 + @swag_from(service_delete.Api.api_doc)
  58 + def api_service_delete():
  59 + """
  60 + 服务删除
  61 + """
  62 + return service_delete.Api().result
  63 +
  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 +
  128 + @staticmethod
  129 + @bp.route('/Overview/<file>', methods=['GET'])
  130 + def table_download_file(file):
  131 + parent = os.path.dirname(os.path.realpath(__file__))
  132 + dirpath = os.path.join(parent,"overview")
  133 +
  134 + return send_from_directory(dirpath, filename=file, as_attachment=True)
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/3/9
  4 +#email: nheweijun@sina.com
  5 +
  6 +import uuid
  7 +from app.models import ServiceCatalog,db
  8 +from app.util.component.ApiTemplate import ApiTemplate
  9 +class Api(ApiTemplate):
  10 + api_name = "创建服务目录"
  11 +
  12 +
  13 + def process(self):
  14 +
  15 + # 返回结果
  16 + res = {}
  17 + res["result"] = False
  18 + try:
  19 +
  20 +
  21 + if ServiceCatalog.query.filter_by(name=self.para.get("name"),
  22 + pguid=self.para.get("pguid"),
  23 + database_guid=self.para.get("database_guid")).one_or_none():
  24 + res["msg"]="目录已经存在!"
  25 + return res
  26 +
  27 +
  28 + guid = uuid.uuid1().__str__()
  29 + path = guid
  30 +
  31 + # 获得目录的全路径
  32 + pguid = self.para.get("pguid")
  33 + count = 0
  34 + while pguid !="0" and count<100:
  35 + count+=1
  36 + path = pguid+":"+path
  37 + p_catalog = ServiceCatalog.query.filter_by(guid=pguid).one_or_none()
  38 + pguid = p_catalog.pguid
  39 + if count==100:
  40 + raise Exception("目录结构出现问题!")
  41 + path = "0" + ":" + path
  42 +
  43 + sort = ServiceCatalog.query.filter_by(pguid=self.para.get("pguid")).count()
  44 +
  45 + catalog = ServiceCatalog(guid=guid,
  46 + pguid=self.para.get("pguid"),name=self.para.get("name"),
  47 + sort=sort,
  48 + description=self.para.get("description"),
  49 + path=path)
  50 + db.session.add(catalog)
  51 + db.session.commit()
  52 +
  53 +
  54 + res["msg"] = "目录创建成功!"
  55 + res["data"] = guid
  56 + res["result"] = True
  57 + except Exception as e:
  58 + db.session.rollback()
  59 + raise e
  60 + return res
  61 +
  62 + api_doc={
  63 +
  64 + "tags":["服务接口"],
  65 + "parameters":[
  66 + {"name": "name",
  67 + "in": "formData",
  68 + "type": "string",
  69 + "description":"目录名"},
  70 + {"name": "pguid",
  71 + "in": "formData",
  72 + "type": "string","description":"父目录guid,创建根目录时为0"}
  73 +
  74 + ],
  75 + "responses":{
  76 + 200:{
  77 + "schema":{
  78 + "properties":{
  79 + }
  80 + }
  81 + }
  82 + }
  83 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/3/9
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +
  8 +from app.models import ServiceCatalog,db,Service
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +class Api(ApiTemplate):
  11 + api_name = "删除目录"
  12 + def process(self):
  13 +
  14 +
  15 + # 返回结果
  16 + res = {}
  17 + try:
  18 + # 业务逻辑
  19 +
  20 +
  21 + catalog_guid = self.para.get("guid")
  22 +
  23 + catalog = ServiceCatalog.query.filter_by(guid=catalog_guid).one_or_none()
  24 + if not catalog:
  25 + res["msg"]="目录不存在!"
  26 + return res
  27 +
  28 + else:
  29 +
  30 + pguid = catalog.pguid
  31 + # 所有目录
  32 + catalogs = ServiceCatalog.query.filter(ServiceCatalog.path.like("%" + catalog_guid + "%")).all()
  33 + for cata in catalogs:
  34 + if pguid.__eq__("0"):
  35 + Service.query.filter_by(catalog_guid=cata.guid).update({"catalog_guid": None})
  36 + db.session.delete(cata)
  37 + else:
  38 + Service.query.filter_by(catalog_guid=cata.guid).update({"catalog_guid": pguid})
  39 + db.session.delete(cata)
  40 +
  41 + db.session.commit()
  42 + res["msg"] = "目录删除成功!"
  43 + res["result"] = True
  44 + except Exception as e:
  45 + db.session.rollback()
  46 + raise e
  47 + return res
  48 +
  49 +
  50 + api_doc = {
  51 + "tags": ["服务接口"],
  52 + "parameters": [
  53 + {"name": "guid",
  54 + "in": "formData",
  55 + "type": "string",
  56 + "description": "目录guid", "required": "true"},
  57 + ],
  58 + "responses": {
  59 + 200: {
  60 + "schema": {
  61 + "properties": {
  62 + }
  63 + }
  64 + }
  65 + }
  66 + }
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/3/9
  4 +#email: nheweijun@sina.com
  5 +
  6 +from app.models import ServiceCatalog,db
  7 +
  8 +from app.util.component.ApiTemplate import ApiTemplate
  9 +class Api(ApiTemplate):
  10 + api_name = "修改目录"
  11 + def process(self):
  12 +
  13 +
  14 + # 返回结果
  15 + res = {}
  16 + try:
  17 + # 业务逻辑
  18 + if not ServiceCatalog.query.filter_by(guid=self.para.get("guid")).one_or_none():
  19 + res["msg"]="目录不存在!"
  20 + res["result"]=False
  21 + return res
  22 + else:
  23 + if self.para.get("name"):
  24 + ServiceCatalog.query.filter_by(guid=self.para.get("guid")).update({"name":self.para.get("name")})
  25 + if self.para.__contains__("description"):
  26 + ServiceCatalog.query.filter_by(guid=self.para.get("guid")).update({"description":self.para.get("description")})
  27 + db.session.commit()
  28 + res["msg"] = "目录修改成功!"
  29 + res["result"] = True
  30 + except Exception as e:
  31 + db.session.rollback()
  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", "required": "true"},
  43 + {"name": "name",
  44 + "in": "formData",
  45 + "type": "string",
  46 + "description": "目录名", "required": "true"}
  47 + ],
  48 + "responses": {
  49 + 200: {
  50 + "schema": {
  51 + "properties": {
  52 + }
  53 + }
  54 + }
  55 + }
  56 + }
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/3/9
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.models import ServiceCatalog,db,Service
  8 +
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +from app.util.component.ModelVisitor import ModelVisitor
  11 +class Api(ApiTemplate):
  12 + api_name = "下一级目录"
  13 + def process(self):
  14 +
  15 + # 返回结果
  16 + res = {}
  17 + try:
  18 + # 业务逻辑
  19 +
  20 + res["data"] = []
  21 + catalogs = ServiceCatalog.query.filter_by(pguid=self.para.get("catalog_guid")).all()
  22 + for cata in catalogs:
  23 + catalog_guids = [c.guid for c in ServiceCatalog.query.filter(ServiceCatalog.path.like("%" + cata.guid + "%")).all()]
  24 + service_count = Service.query.filter(Service.catalog_guid.in_(catalog_guids)).count()
  25 + cata_json = ModelVisitor.object_to_json(cata)
  26 + cata_json["service_count"]=service_count
  27 + res["data"].append(cata_json)
  28 + res["result"] = True
  29 + except Exception as e:
  30 + raise e
  31 + return res
  32 +
  33 + api_doc={
  34 +
  35 + "tags":["服务接口"],
  36 + "parameters":[
  37 + {"name": "catalog_guid",
  38 + "in": "formData",
  39 + "type": "string",
  40 + "description":"目录guid","required": "true"},
  41 + {"name": "database_guid",
  42 + "in": "formData",
  43 + "type": "string",
  44 + "description": "数据库guid", "required": "true"},
  45 +
  46 + ],
  47 + "responses":{
  48 + 200:{
  49 + "schema":{
  50 + "properties":{
  51 + }
  52 + }
  53 + }
  54 + }
  55 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/3/9
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.models import ServiceCatalog,Service
  8 +
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +class Api(ApiTemplate):
  11 + api_name = "目录树"
  12 + def process(self):
  13 +
  14 + # 返回结果
  15 + res = {}
  16 + try:
  17 + # 业务逻辑
  18 +
  19 + catalogs = ServiceCatalog.query.all()
  20 +
  21 + tree_origin = []
  22 + for cata in catalogs:
  23 + catalog_guids = [c.guid for c in ServiceCatalog.query.filter(ServiceCatalog.path.like("%" + cata.guid + "%")).all()]
  24 + service_count = Service.query.filter(Service.catalog_guid.in_(catalog_guids)).count()
  25 +
  26 + cata_json ={}
  27 +
  28 + cata_json["description"] = cata.description
  29 + cata_json["guid"] = cata.guid
  30 + cata_json["name"] = cata.name
  31 + cata_json["path"] = cata.path
  32 + cata_json["pguid"] = cata.pguid
  33 + cata_json["sort"] = cata.sort
  34 + cata_json["service_count"]=service_count
  35 + cata_json["children"] = []
  36 + tree_origin.append(cata_json)
  37 +
  38 + for cata in tree_origin:
  39 + cata_pguid = cata["pguid"]
  40 + if not cata_pguid=="0":
  41 + for c in tree_origin:
  42 + if c["guid"].__eq__(cata_pguid):
  43 + c["children"].append(cata)
  44 +
  45 + res["data"] = [cata for cata in tree_origin if cata["pguid"].__eq__("0")]
  46 + res["result"] = True
  47 + except Exception as e:
  48 + raise e
  49 + return res
  50 +
  51 + api_doc={
  52 +
  53 + "tags":["服务接口"],
  54 + "parameters":[
  55 + {"name": "database_guid",
  56 + "in": "formData",
  57 + "type": "string",
  58 + "description": "数据库guid", "required": "true"},
  59 +
  60 + ],
  61 + "responses":{
  62 + 200:{
  63 + "schema":{
  64 + "properties":{
  65 + }
  66 + }
  67 + }
  68 + }
  69 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/3/9
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.models import Service,ServiceCatalog,db
  8 +
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +class Api(ApiTemplate):
  11 + api_name = "目录"
  12 + def process(self):
  13 +
  14 + # 返回结果
  15 + res = {}
  16 + try:
  17 + # 业务逻辑
  18 + catalogs = ServiceCatalog.query.all()
  19 + res["data"]=[]
  20 + for cata in catalogs:
  21 + catalog_guids = [c.guid for c in ServiceCatalog.query.filter(ServiceCatalog.path.like("%" + cata.guid + "%")).all()]
  22 + service_count = Service.query.filter(Service.catalog_guid.in_(catalog_guids)).count()
  23 + cata_json ={}
  24 + cata_json["database_guid"]=cata.database_guid
  25 + cata_json["description"] = cata.description
  26 + cata_json["guid"] = cata.guid
  27 + cata_json["name"] = cata.name
  28 + cata_json["path"] = cata.path
  29 + cata_json["pguid"] = cata.pguid
  30 + cata_json["sort"] = cata.sort
  31 + cata_json["service_count"]=service_count
  32 + res["data"].append(cata_json)
  33 +
  34 + res["result"] = True
  35 +
  36 + except Exception as e:
  37 + raise e
  38 + return res
  39 +
  40 + api_doc={
  41 +
  42 + "tags":["服务接口"],
  43 + "parameters":[
  44 + {"name": "database_guid",
  45 + "in": "formData",
  46 + "type": "string",
  47 + "description": "数据库guid", "required": "true"},
  48 +
  49 + ],
  50 + "responses":{
  51 + 200:{
  52 + "schema":{
  53 + "properties":{
  54 + }
  55 + }
  56 + }
  57 + }
  58 + }
\ No newline at end of file
... ...
... ... @@ -17,7 +17,7 @@ from . import feature_edit
17 17 class DataManager(BlueprintApi):
18 18
19 19 bp = Blueprint("FeatureService", __name__, url_prefix="/API/FeatureService")
20   -
  20 + service_type = ["要素服务"]
21 21 @staticmethod
22 22 @bp.route('/Query', methods=['POST'])
23 23 @swag_from(feature_query.Api.api_doc)
... ...
... ... @@ -17,9 +17,12 @@ from . import image_list
17 17 from . import image_tile
18 18 from . import image_wms
19 19
  20 +
  21 +
20 22 class DataManager(BlueprintApi):
21 23
22   - bp = Blueprint("Image", __name__, url_prefix="/API/Image")
  24 + bp = Blueprint("Image", __name__, url_prefix="/API/Service/Image")
  25 + service_type = ["影像WMS服务","影像WMTS服务"]
23 26
24 27 @staticmethod
25 28 @bp.route('/Register', methods=['POST'])
... ...
... ... @@ -17,8 +17,8 @@ class Api(ApiTemplate):
17 17 try:
18 18 guid = self.para.get("guid")
19 19 image = Image.query.filter_by(guid=guid).one_or_none()
  20 + db.session.delete(image)
20 21 db.session.commit()
21   - # res["data"] = guid
22 22 res["result"] = True
23 23
24 24 except Exception as e:
... ... @@ -31,8 +31,7 @@ class Api(ApiTemplate):
31 31 "parameters": [
32 32 {"name": "guid",
33 33 "in": "formData",
34   - "type": "string",
35   - "description": "data_server"}
  34 + "type": "string"}
36 35 ],
37 36 "responses": {
38 37 200: {
... ...
... ... @@ -47,6 +47,20 @@ class Api(ApiTemplate):
47 47 api_doc = {
48 48 "tags": ["影像接口"],
49 49 "parameters": [
  50 + {"name": "page_index",
  51 + "in": "formData",
  52 + "type": "int",
  53 + "description": "页"},
  54 + {"name": "page_size",
  55 + "in": "formData",
  56 + "type": "int",
  57 + "description": "页大小"},
  58 + {"name": "alias",
  59 + "in": "formData",
  60 + "type": "string"},
  61 + {"name": "name",
  62 + "in": "formData",
  63 + "type": "string"},
50 64 ],
51 65 "responses": {
52 66 200: {
... ...
... ... @@ -6,53 +6,26 @@
6 6
7 7 from app.util.component.ApiTemplate import ApiTemplate
8 8 from app.util.component.ModelVisitor import ModelVisitor
9   -from app.modules.service.image.models import ImageService
10   -from sqlalchemy import or_
11 9
  10 +from app.modules.service.image.models import Image
  11 +from sqlalchemy import or_,and_
12 12 class Api(ApiTemplate):
13 13
14   -
15   -
16   - api_name = "注册影像服务"
17   -
18   -
19   -
  14 + api_name = "影像数据预览功能"
20 15
21 16 def process(self):
22 17
23   -
24   -
25 18 # 返回结果
26 19 res = {}
27   -
28 20 try:
29   - page_index = int(self.para.get("page_index", "0"))
30   - page_size = int(self.para.get("page_size", "10"))
31 21
32   - alias = self.para.get("alias")
33   - name = self.para.get("name")
34   -
35   - image_services = ImageService.query
36   - # 并集
37   - if alias and name:
38   - image_services = image_services.filter(or_(ImageService.alias.like("%" + alias + "%") , ImageService.name.like("%" + name + "%")))
39   - else:
40   - if alias:
41   - image_services = image_services.filter(ImageService.alias.like("%" + alias + "%"))
42   - if name:
43   - image_services = image_services.filter(ImageService.name.like("%" + name + "%"))
44   -
45   - image_services = image_services.limit(page_size).offset(page_index).all()
46   -
47   - res["data"] = ModelVisitor.objects_to_jsonarray(image_services)
48 22 res["result"] = True
49   -
50   -
51 23 except Exception as e:
52 24 raise e
53 25
54 26 return res
55 27
  28 +
56 29 api_doc = {
57 30 "tags": ["影像接口"],
58 31 "parameters": [
... ... @@ -65,4 +38,6 @@ class Api(ApiTemplate):
65 38 }
66 39 }
67 40 }
68   - }
\ No newline at end of file
  41 + }
  42 +
  43 +
... ...
... ... @@ -53,21 +53,21 @@ class Api(ApiTemplate):
53 53 right_buttom = (geo[0] + geo[1] * image.RasterXSize, geo[3] + geo[5] * image.RasterYSize)
54 54 origin_extent = [left_top[0], right_buttom[0], right_buttom[1], left_top[1]]
55 55
56   - target = origin.CloneGeogCS()
57   - tran = osr.CoordinateTransformation(origin, target)
58   -
59   - geo_left_top = tran.TransformPoint(geo[0], geo[3])
60   - geo_right_buttom = tran.TransformPoint(geo[0] + geo[1] * image.RasterXSize,
61   - geo[3] + geo[5] * image.RasterYSize)
62   -
63   - geo_origin_extent = [geo_left_top[1], geo_right_buttom[0], geo_right_buttom[1], geo_left_top[0]]
  56 + # target = origin.CloneGeogCS()
  57 + # tran = osr.CoordinateTransformation(origin, target)
  58 + #
  59 + # geo_left_top = tran.TransformPoint(geo[0], geo[3])
  60 + # geo_right_buttom = tran.TransformPoint(geo[0] + geo[1] * image.RasterXSize,
  61 + # geo[3] + geo[5] * image.RasterYSize)
  62 + #
  63 + # geo_origin_extent = [geo_left_top[1], geo_right_buttom[0], geo_right_buttom[1], geo_left_top[0]]
64 64
65 65 info = {"band_count": band_count,
66 66 "overview_count": count,
67 67 "path":image_info["path"],
68 68 "xy_size": [image.RasterXSize, image.RasterYSize],
69 69 "origin_extent": origin_extent,
70   - "geo_origin_extent": geo_origin_extent,
  70 + # "geo_origin_extent": geo_origin_extent,
71 71 "null_value": nodatavalue,
72 72 "size":os.path.getsize(image_info["path"]),
73 73 "sr_wkt": image.GetProjection(),
... ... @@ -102,8 +102,6 @@ class Api(ApiTemplate):
102 102 # origin_extent = info["origin_extent"]
103 103
104 104
105   -
106   -
107 105 exist_image = Image.query.filter_by(path=os.path.normpath(info.get("path")),
108 106 size=info.get("size")).one_or_none()
109 107 if exist_image:
... ... @@ -120,7 +118,7 @@ class Api(ApiTemplate):
120 118 cell_y_size = abs(info.get("cell_y_size")),
121 119 name=os.path.basename(info.get("path")),
122 120 origin_extent=json.dumps(info["origin_extent"]),
123   - geo_origin_extent = json.dumps(info["geo_origin_extent"]),
  121 + # geo_origin_extent = json.dumps(info["geo_origin_extent"]),
124 122 null_value=info.get("null_value"),
125 123 server=data_server,
126 124 path = os.path.normpath(info.get("path")),
... ...
  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 +from app.models import db
  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
  14 +import datetime
  15 +class Api(ApiTemplate):
  16 +
  17 + api_name = "注册影像服务"
  18 +
  19 + def process(self):
  20 +
  21 +
  22 +
  23 + # 返回结果
  24 + res = {}
  25 +
  26 + try:
  27 +
  28 + res["result"] = True
  29 + except Exception as e:
  30 + raise e
  31 +
  32 + return res
  33 +
  34 + api_doc = {
  35 + "tags": ["影像接口"],
  36 + "parameters": [
  37 + {"name": "guids",
  38 + "in": "formData",
  39 + "type": "string",
  40 + "description": "影像guids,以英文逗号相隔"},
  41 + {"name": "file",
  42 + "in": "formData",
  43 + "type": "file",
  44 + "description": "切片方案"},
  45 + ],
  46 + "responses": {
  47 + 200: {
  48 + "schema": {
  49 + "properties": {
  50 + }
  51 + }
  52 + }
  53 + }
  54 + }
\ No newline at end of file
... ...
... ... @@ -4,7 +4,7 @@
4 4 #email: nheweijun@sina.com
5 5
6 6 from app.modules.service.image.models import ImageService,Image
7   -from app.models import db
  7 +from app.models import db,Service
8 8 from app.util.component.ApiTemplate import ApiTemplate
9 9 import uuid
10 10 from app.util.component.SliceScheme import SliceScheme
... ... @@ -26,6 +26,8 @@ class Api(ApiTemplate):
26 26 try:
27 27 guids = self.para.get("guids").split(",")
28 28 name = self.para.get("name")
  29 + catalog_guid = self.para.get("catalog_guid")
  30 +
29 31 service_guid = uuid.uuid1().__str__()
30 32
31 33
... ... @@ -33,7 +35,7 @@ class Api(ApiTemplate):
33 35 dir_path, store_file = FileProcess.save(parent)
34 36 scheme = SliceScheme(store_file).parameter
35 37
36   - service = ImageService(guid=service_guid, name=name, slice_scheme=json.dumps(scheme),
  38 + service = ImageService(guid=service_guid, name=name,
37 39 create_time=datetime.datetime.now())
38 40 service_exetent = []
39 41
... ...
... ... @@ -91,11 +91,8 @@ class Api(ApiTemplate):
91 91 height, width = 256,256
92 92
93 93 # 多线程获取分布式数据
94   - if abs(extent[0])>180:
95   - intersect_image = [im for im in images if self.determin_intersect(json.loads(im.origin_extent),extent)]
96   - else:
97   - intersect_image = [im for im in images if self.determin_intersect(json.loads(im.geo_origin_extent), extent)]
98 94
  95 + intersect_image = [im for im in images if self.determin_intersect(json.loads(im.origin_extent),extent)]
99 96
100 97 if len(intersect_image) > 1:
101 98
... ...
... ... @@ -67,12 +67,10 @@ class Api(ApiTemplate):
67 67
68 68 bands = [1, 2, 3]
69 69 extent = [float(x) for x in bbox.split(",")]
70   - extent = [extent[1],extent[0],extent[3],extent[2]]
  70 + # extent = [extent[1],extent[0],extent[3],extent[2]]
71 71
72   - if abs(extent[0])>180:
73   - intersect_image = [im for im in images if self.determin_intersect(json.loads(im.origin_extent),extent)]
74   - else:
75   - intersect_image = [im for im in images if self.determin_intersect(json.loads(im.geo_origin_extent), extent)]
  72 +
  73 + intersect_image = [im for im in images if self.determin_intersect(json.loads(im.origin_extent),extent)]
76 74
77 75 if len(intersect_image)>1:
78 76
... ... @@ -141,7 +139,6 @@ class Api(ApiTemplate):
141 139 result["message"] = e.__str__()
142 140 return result
143 141
144   -
145 142 def determine_level(self,xysize,origin_extent,extent,max_level):
146 143 '''
147 144 根据范围判断调用金字塔的哪一层
... ... @@ -201,7 +198,7 @@ class Api(ApiTemplate):
201 198 '''
202 199 thrift_connect = ThriftConnect(image.server)
203 200 t1 = time.time()
204   - image_extent = image.origin_extent if abs(extent[0])>180 else image.geo_origin_extent
  201 + image_extent = image.origin_extent
205 202
206 203 data = thrift_connect.client.getData(image.path, extent, json.loads(image_extent), bands,width,height)
207 204
... ... @@ -324,7 +321,7 @@ class Api(ApiTemplate):
324 321 def get_capabilities(self,image_service:ImageService):
325 322
326 323 xml = '''<?xml version="1.0" encoding="utf-8" ?>
327   - <WMS_Capabilities version="1.3.0">
  324 + <WMS_Capabilities version="1.2.0">
328 325 <Service>
329 326 <Name>WMS</Name>
330 327 <Title>{service_title}</Title>
... ...
... ... @@ -13,22 +13,21 @@ class Image(db.Model):
13 13 '''
14 14 影像元数据
15 15 '''
16   - __tablename__ = 'dmdms_image'
  16 + __tablename__ = 'dmap_image'
17 17 guid = Column(String(256), primary_key=True)
18 18 name = Column(String)
19 19 alias = Column(String)
20 20 raster_y_size = Column(Integer)
21 21 raster_x_size = Column(Integer)
22 22 overview_count = Column(Integer)
23   - origin_extent = Column(String)
24   - geo_origin_extent = Column(String)
  23 + extent = Column(String)
  24 + # geo_origin_extent = Column(String)
25 25 null_value = Column(Integer)
26 26 available = Column(Integer)#影像是否可用,不可用可能在创建金字塔中
27 27 band_count = Column(Integer)
28 28 path = Column(String)
29 29 server = Column(String)
30   - # host=Column(String)
31   - # port=Column(Integer)
  30 +
32 31 size = Column(Float)
33 32 #坐标wkt
34 33 sr_wkt = Column(Text)
... ... @@ -42,9 +41,9 @@ class Image(db.Model):
42 41 #年份
43 42 ym = Column(String(256))
44 43
45   -dmdms_image_rel = db.Table('dmdms_image_rel',
46   - Column('image_guid',String, ForeignKey('dmdms_image.guid')),
47   - Column('service_guid', String, ForeignKey('dmdms_image_service.guid'))
  44 +dmap_image_rel = db.Table('dmap_image_rel',
  45 + Column('image_guid',String, ForeignKey('dmap_image.guid')),
  46 + Column('service_guid', String, ForeignKey('dmap_image_service.guid'))
48 47 )
49 48
50 49
... ... @@ -53,44 +52,40 @@ class ImageService(db.Model):
53 52 '''
54 53 影像服务
55 54 '''
56   - __tablename__ = 'dmdms_image_service'
  55 + __tablename__ = 'dmap_image_service'
57 56 guid = Column(String(256), primary_key=True)
58   - name=Column(String(256))
59   - alias = Column(String(256))
60   - state= Column(Integer)
61   - create_time = Column(DateTime)
62   - update_time = Column(DateTime)
63   - description = Column(Text)
64   - slice_scheme = Column(Text)
  57 +
  58 + scheme_guid = Column(Text)
65 59 extent = Column(String(256))
66   - node = Column(Integer)
  60 + # node = Column(Integer)
67 61 #可视范围geojson
68   - visual_range = Column(Text)
69   - #影像服务缩略图
70   - overview = Column(Binary)
  62 + visual_region = Column(Text)
  63 + crs = Column(String(256))
  64 +
  65 + service_guid = Column(String, ForeignKey('dmap_service.guid'))
71 66
72 67 images = db.relationship('Image',
73   - secondary=dmdms_image_rel,
  68 + secondary=dmap_image_rel,
74 69 backref='image_services',
75 70 lazy='dynamic'
76 71 )
77 72
78 73
79   -dmdms_image_tag_rel = db.Table('dmdms_image_tag_rel',
80   - Column('image_guid',String, ForeignKey('dmdms_image.guid')),
81   - Column('tag_guid', String, ForeignKey('dmdms_image_tag.guid'))
  74 +dmap_image_tag_rel = db.Table('dmap_image_tag_rel',
  75 + Column('image_guid',String, ForeignKey('dmap_image.guid')),
  76 + Column('tag_guid', String, ForeignKey('dmap_image_tag.guid'))
82 77 )
83 78
84 79 class ImageTag(db.Model):
85 80 '''
86 81 影像标签
87 82 '''
88   - __tablename__ = 'dmdms_image_tag'
  83 + __tablename__ = 'dmap_image_tag'
89 84 guid = Column(String(256), primary_key=True)
90 85 name=Column(String(256))
91 86 alias = Column(String(256))
92 87 images = db.relationship('Image',
93   - secondary=dmdms_image_tag_rel,
  88 + secondary=dmap_image_tag_rel,
94 89 backref='image_tags',
95 90 lazy='dynamic'
96 91 )
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/16
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from flasgger import swag_from
  8 +from flask import Blueprint
  9 +from app.util import BlueprintApi
  10 +
  11 +from . import scheme_create
  12 +from . import scheme_delete
  13 +from . import scheme_edit
  14 +from . import scheme_list
  15 +from . import scheme_resolve
  16 +
  17 +class SchemeManager(BlueprintApi):
  18 +
  19 + bp = Blueprint("Scheme", __name__, url_prefix="/API/Service/Scheme")
  20 +
  21 + @staticmethod
  22 + @bp.route('/Create', methods=['POST'])
  23 + @swag_from(scheme_create.Api.api_doc)
  24 + def api_scheme_create():
  25 + """
  26 + 创建切片方案
  27 + """
  28 + return scheme_create.Api().result
  29 +
  30 +
  31 + @staticmethod
  32 + @bp.route('/Delete', methods=['POST'])
  33 + @swag_from(scheme_delete.Api.api_doc)
  34 + def api_scheme_delete():
  35 + """
  36 + 删除切片方案
  37 + """
  38 + return scheme_delete.Api().result
  39 +
  40 + @staticmethod
  41 + @bp.route('/Edit', methods=['POST'])
  42 + @swag_from(scheme_edit.Api.api_doc)
  43 + def api_scheme_edit():
  44 + """
  45 + 修改切片方案
  46 + """
  47 + return scheme_edit.Api().result
  48 +
  49 +
  50 + @staticmethod
  51 + @bp.route('/List', methods=['POST'])
  52 + @swag_from(scheme_list.Api.api_doc)
  53 + def api_scheme_list():
  54 + """
  55 + 切片方案List
  56 + """
  57 + return scheme_list.Api().result
  58 +
  59 +
  60 + @staticmethod
  61 + @bp.route('/Resolve', methods=['POST'])
  62 + @swag_from(scheme_resolve.Api.api_doc)
  63 + def api_scheme_resolve():
  64 + """
  65 + 解析切片方案
  66 + """
  67 + return scheme_resolve.Api().result
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/16
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +import uuid
  8 +from app.models import TileScheme,db
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +import datetime
  11 +import json
  12 +class Api(ApiTemplate):
  13 + api_name = "创建方案"
  14 +
  15 + def process(self):
  16 +
  17 + # 返回结果
  18 + res = {}
  19 + res["result"] = False
  20 + try:
  21 + # 业务逻辑
  22 +
  23 + data = self.para
  24 + # extent = [float(x) for x in data.get("extent").split(",")] if data.get("extent") else [0,0,0,0]
  25 + # top_left = [float(x) for x in data.get("top_left").split(",")] if data.get("top_left") else [0, 0]
  26 +
  27 + guid = uuid.uuid1().__str__()
  28 + tile_scheme = TileScheme(
  29 + guid = guid,
  30 + name = data.get("name"),
  31 + alias = data.get("alias"),
  32 + description = data.get("description"),
  33 + crs = data.get("crs"),
  34 + crs_wkt = data.get("crs_wkt"),
  35 + extent = data.get("extent"),
  36 + top_left = data.get("top_left"),
  37 + # ymin = extent[1],
  38 + # xmax = extent[2],
  39 + # ymax = extent[3],
  40 + # origin_x = top_left[0],
  41 + # origin_y = top_left[1],
  42 + levels = json.dumps(data.get("levels")),
  43 + dpi = int(data.get("dpi")),
  44 + rows = int(data.get("rows")),
  45 + cols = int(data.get("clos")),
  46 + update_time = datetime.datetime.now()
  47 + )
  48 +
  49 + db.session.add(tile_scheme)
  50 + db.session.commit()
  51 + res["data"] = guid
  52 + res["result"] = True
  53 + except Exception as e:
  54 + db.session.rollback()
  55 + raise Exception("参数填写错误!")
  56 + return res
  57 +
  58 + api_doc = {
  59 +
  60 + "tags": ["方案接口"],
  61 + "parameters": [
  62 + {"name": "name",
  63 + "in": "formData",
  64 + "type": "string"},
  65 + {"name": "alias",
  66 + "in": "formData",
  67 + "type": "string"},
  68 + {"name": "crs",
  69 + "in": "formData",
  70 + "type": "string"},
  71 + {"name": "crs_wkt",
  72 + "in": "formData",
  73 + "type": "string"},
  74 + {"name": "extent",
  75 + "in": "formData",
  76 + "type": "string"},
  77 + {"name": "top_left",
  78 + "in": "formData",
  79 + "type": "string"},
  80 + {"name": "rows",
  81 + "in": "formData",
  82 + "type": "string"},
  83 + {"name": "cols",
  84 + "in": "formData",
  85 + "type": "string"},
  86 + {"name": "dpi",
  87 + "in": "formData",
  88 + "type": "string"},
  89 + {"name": "levels",
  90 + "in": "formData",
  91 + "type": "string"},
  92 +
  93 + ],
  94 + "responses": {
  95 + 200: {
  96 + "schema": {
  97 + "properties": {
  98 + }
  99 + }
  100 + }
  101 + }
  102 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/16
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +import uuid
  8 +from app.models import TileScheme,db
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +import datetime
  11 +
  12 +class Api(ApiTemplate):
  13 + api_name = "修改方案"
  14 +
  15 + def process(self):
  16 +
  17 + # 返回结果
  18 + res = {}
  19 + res["result"] = False
  20 + try:
  21 + # 业务逻辑
  22 +
  23 +
  24 + guid = self.para.get("guid")
  25 +
  26 + tile_scheme:TileScheme = TileScheme.query.filter_by(guid=guid).one_or_none()
  27 + if tile_scheme is None:
  28 + raise Exception("不存在该切片方案!")
  29 + db.session.delete(tile_scheme)
  30 + db.session.commit()
  31 +
  32 + res["data"] = guid
  33 + res["result"] = True
  34 + except Exception as e:
  35 + db.session.rollback()
  36 +
  37 + return res
  38 +
  39 + api_doc = {
  40 +
  41 + "tags": ["方案接口"],
  42 + "parameters": [
  43 + {"name": "guid",
  44 + "in": "formData",
  45 + "type": "string"}
  46 +
  47 + ],
  48 + "responses": {
  49 + 200: {
  50 + "schema": {
  51 + "properties": {
  52 + }
  53 + }
  54 + }
  55 + }
  56 + }
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/16
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +import uuid
  8 +from app.models import TileScheme,db
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +import datetime
  11 +
  12 +class Api(ApiTemplate):
  13 + api_name = "修改方案"
  14 +
  15 + def process(self):
  16 +
  17 + # 返回结果
  18 + res = {}
  19 + res["result"] = False
  20 + try:
  21 + # 业务逻辑
  22 + data = self.para
  23 +
  24 + guid = data.get("guid")
  25 +
  26 + tile_scheme:TileScheme = TileScheme.query.filter_by(guid=guid).one_or_none()
  27 + if tile_scheme is None:
  28 + raise Exception("不存在该切片方案!")
  29 +
  30 + update_dict = data
  31 + update_dict["update_time"] = datetime.datetime.now()
  32 + del update_dict["guid"]
  33 +
  34 + tile_scheme.update(update_dict)
  35 + db.session.commit()
  36 +
  37 + res["data"] = guid
  38 + res["result"] = True
  39 + except Exception as e:
  40 + db.session.rollback()
  41 + raise Exception("参数填写错误!")
  42 + return res
  43 +
  44 + api_doc = {
  45 +
  46 + "tags": ["方案接口"],
  47 + "parameters": [
  48 + {"name": "guid",
  49 + "in": "formData",
  50 + "type": "string"},
  51 + {"name": "name",
  52 + "in": "formData",
  53 + "type": "string"},
  54 + {"name": "alias",
  55 + "in": "formData",
  56 + "type": "string"},
  57 + {"name": "crs",
  58 + "in": "formData",
  59 + "type": "string"},
  60 + {"name": "crs_wkt",
  61 + "in": "formData",
  62 + "type": "string"},
  63 + {"name": "extent",
  64 + "in": "formData",
  65 + "type": "string"},
  66 + {"name": "top_left",
  67 + "in": "formData",
  68 + "type": "string"},
  69 + {"name": "rows",
  70 + "in": "formData",
  71 + "type": "string"},
  72 + {"name": "cols",
  73 + "in": "formData",
  74 + "type": "string"},
  75 + {"name": "dpi",
  76 + "in": "formData",
  77 + "type": "string"},
  78 + {"name": "levels",
  79 + "in": "formData",
  80 + "type": "string"},
  81 +
  82 + ],
  83 + "responses": {
  84 + 200: {
  85 + "schema": {
  86 + "properties": {
  87 + }
  88 + }
  89 + }
  90 + }
  91 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/16
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +import uuid
  8 +from app.models import TileScheme,db
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +from app.util.component.ModelVisitor import ModelVisitor
  11 +from sqlalchemy import or_
  12 +import datetime
  13 +
  14 +class Api(ApiTemplate):
  15 + api_name = "查询切片方案"
  16 +
  17 + def process(self):
  18 +
  19 + # 返回结果
  20 + res = {}
  21 + res["result"] = False
  22 + try:
  23 + # 业务逻辑
  24 +
  25 + page_index = int(self.para.get("page_index", "0"))
  26 + page_size = int(self.para.get("page_size", "10"))
  27 +
  28 + alias = self.para.get("alias")
  29 + name = self.para.get("name")
  30 + schemes = TileScheme.query
  31 +
  32 + # 并集
  33 + if alias and name:
  34 + schemes = schemes.filter(or_(TileScheme.alias.like("%" + alias + "%") , TileScheme.name.like("%" + name + "%")))
  35 + else:
  36 + if alias:
  37 + schemes = schemes.filter(TileScheme.alias.like("%" + alias + "%"))
  38 + if name:
  39 + schemes = schemes.filter(TileScheme.name.like("%" + name + "%"))
  40 +
  41 + schemes = schemes.limit(page_size).offset(page_index).all()
  42 +
  43 + res["data"] = ModelVisitor.objects_to_jsonarray(schemes)
  44 + res["result"] = True
  45 +
  46 + except Exception as e:
  47 + raise e
  48 +
  49 + return res
  50 +
  51 + api_doc = {
  52 +
  53 + "tags": ["方案接口"],
  54 + "parameters": [
  55 + {"name": "page_index",
  56 + "in": "formData",
  57 + "type": "int",
  58 + "description": "页"},
  59 + {"name": "page_size",
  60 + "in": "formData",
  61 + "type": "int",
  62 + "description": "页大小"},
  63 + {"name": "alias",
  64 + "in": "formData",
  65 + "type": "string"},
  66 + {"name": "name",
  67 + "in": "formData",
  68 + "type": "string"},
  69 +
  70 + ],
  71 + "responses": {
  72 + 200: {
  73 + "schema": {
  74 + "properties": {
  75 + }
  76 + }
  77 + }
  78 + }
  79 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/16
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.util.component.ApiTemplate import ApiTemplate
  8 +import os
  9 +from app.util.component.FileProcess import FileProcess
  10 +from app.util.component.SliceScheme import SliceScheme
  11 +import shutil
  12 +from app.util.component.StructuredPrint import StructurePrint
  13 +class Api(ApiTemplate):
  14 + api_name = "解析方案"
  15 +
  16 + def process(self):
  17 +
  18 + # 返回结果
  19 + res = {}
  20 + store_file = ""
  21 + try:
  22 + # 业务逻辑
  23 + parent = os.path.dirname(os.path.realpath(__file__))
  24 + dir_path, store_file = FileProcess.save(parent)
  25 + scheme = SliceScheme(store_file)
  26 +
  27 + data = {
  28 + "crs_wkt": scheme.parameter.get("wkt"),
  29 + "top_left": "{},{}".format(scheme.parameter.get("x"),scheme.parameter.get("y")),
  30 + "dpi": scheme.parameter.get("dpi"),
  31 + "rows": scheme.parameter.get("rows"),
  32 + "cols": scheme.parameter.get("cols"),
  33 + "levels": scheme.levels
  34 + }
  35 +
  36 + res["data"] = data
  37 + res["result"] = True
  38 + except Exception as e:
  39 + raise e
  40 + finally:
  41 + try:
  42 + file_tmp_path = os.path.join(store_file.split("file_tmp")[0],"file_tmp")
  43 + dir_path = os.path.dirname(store_file)
  44 + i=0
  45 + while not os.path.dirname(dir_path).__eq__(file_tmp_path) and i<30:
  46 + dir_path = os.path.dirname(dir_path)
  47 + i+=1
  48 + if i<30:
  49 + shutil.rmtree(dir_path,True)
  50 + StructurePrint.print("删除文件成功!")
  51 + else:
  52 + raise Exception("找不到文件!")
  53 + except Exception as e:
  54 + StructurePrint.print("删除文件失败!","ERROR")
  55 + return res
  56 +
  57 + api_doc = {
  58 +
  59 + "tags": ["方案接口"],
  60 + "parameters": [
  61 + {"name": "file",
  62 + "in": "formData",
  63 + "type": "file",
  64 + "description": "切片方案"},
  65 + ],
  66 + "responses": {
  67 + 200: {
  68 + "schema": {
  69 + "properties": {
  70 + }
  71 + }
  72 + }
  73 + }
  74 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/14
  4 +#email: nheweijun@sina.com
  5 +from app.util.component.ApiTemplate import ApiTemplate
  6 +
  7 +from app.util import find_class,BlueprintApi
  8 +from app.models import Service,db
  9 +
  10 +
  11 +class Api(ApiTemplate):
  12 + api_name = "服务类型"
  13 +
  14 + def process(self):
  15 +
  16 + # 返回结果
  17 + res = {}
  18 +
  19 + try:
  20 + guid = self.para.get("guid")
  21 + service = Service.query.filter_by(guid=guid).one_or_none()
  22 + db.session.remove(service)
  23 + db.session.commit()
  24 + res["result"] = True
  25 + except Exception as e:
  26 + raise e
  27 +
  28 + return res
  29 +
  30 + api_doc = {
  31 + "tags": ["服务接口"],
  32 + "parameters": [
  33 + {"name": "guid",
  34 + "in": "formData",
  35 + "type": "string",
  36 + "description": "guid"},
  37 + ],
  38 + "responses": {
  39 + 200: {
  40 + "schema": {
  41 + "properties": {
  42 + }
  43 + }
  44 + }
  45 + }
  46 + }
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/14
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +
  8 +
  9 +from app.util.component.ApiTemplate import ApiTemplate
  10 +
  11 +class Api(ApiTemplate):
  12 + api_name = "修改服务"
  13 + def process(self):
  14 + res = {}
  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
  24 + else:
  25 + return res
  26 + api = Api()
  27 + api.para = self.para
  28 + res = api.process()
  29 +
  30 + except Exception as e:
  31 + raise e
  32 + return res
  33 +
  34 +
  35 + api_doc = {
  36 + "tags": ["服务接口"],
  37 + "parameters": [
  38 + ],
  39 + "responses": {
  40 + 200: {
  41 + "schema": {
  42 + "properties": {
  43 + }
  44 + }
  45 + }
  46 + }
  47 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/14
  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 +from sqlalchemy import or_
  11 +
  12 +
  13 +class Api(ApiTemplate):
  14 + api_name = "服务列表"
  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 = Service.query
  30 + if type:
  31 + services = services.filter_by(type=type)
  32 + # 并集
  33 + if alias and name:
  34 + services = services.filter(
  35 + or_(Service.alias.like("%" + alias + "%"), Service.name.like("%" + name + "%")))
  36 + else:
  37 + if alias:
  38 + services = services.filter(Service.alias.like("%" + alias + "%"))
  39 + if name:
  40 + services = services.filter(Service.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 +
  47 +
  48 + except Exception as e:
  49 + raise e
  50 +
  51 + return res
  52 +
  53 + api_doc = {
  54 + "tags": ["服务接口"],
  55 + "parameters": [
  56 + {"name": "page_index",
  57 + "in": "formData",
  58 + "type": "int",
  59 + "description": "页"},
  60 + {"name": "page_size",
  61 + "in": "formData",
  62 + "type": "int",
  63 + "description": "页大小"},
  64 + {"name": "alias",
  65 + "in": "formData",
  66 + "type": "string",
  67 + "description": "服务别名"},
  68 + {"name": "name",
  69 + "in": "formData",
  70 + "type": "string",
  71 + "description": "服务名"},
  72 + {"name": "type",
  73 + "in": "formData",
  74 + "type": "string",
  75 + "description": "服务类型"},
  76 + ],
  77 + "responses": {
  78 + 200: {
  79 + "schema": {
  80 + "properties": {
  81 + }
  82 + }
  83 + }
  84 + }
  85 + }
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/14
  4 +#email: nheweijun@sina.com
  5 +
  6 +from app.util.component.ApiTemplate import ApiTemplate
  7 +
  8 +class Api(ApiTemplate):
  9 + api_name = "注册服务"
  10 + def process(self):
  11 + res = {}
  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
  17 + 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
  21 + else:
  22 + return res
  23 + api = Api()
  24 + api.para = self.para
  25 + res = api.process()
  26 + except Exception as e:
  27 + raise e
  28 + return res
  29 +
  30 +
  31 + api_doc = {
  32 + "tags": ["服务接口"],
  33 + "parameters": [
  34 + ],
  35 + "responses": {
  36 + 200: {
  37 + "schema": {
  38 + "properties": {
  39 + }
  40 + }
  41 + }
  42 + }
  43 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/14
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +
  8 +from app.util.component.ApiTemplate import ApiTemplate
  9 +import configure
  10 +from app.util import find_class,BlueprintApi
  11 +
  12 +
  13 +class Api(ApiTemplate):
  14 + api_name = "服务类型"
  15 +
  16 + def process(self):
  17 +
  18 + # 返回结果
  19 + res = {}
  20 + service_types = []
  21 + try:
  22 + for scan in ["app.modules.service"]:
  23 + for api in find_class(scan, BlueprintApi):
  24 + service_types.extend(api.service_type)
  25 + res["data"] = service_types
  26 + res["result"] = True
  27 +
  28 + except Exception as e:
  29 + raise e
  30 +
  31 + return res
  32 +
  33 + api_doc = {
  34 + "tags": ["服务接口"],
  35 + "parameters": [
  36 + ],
  37 + "responses": {
  38 + 200: {
  39 + "schema": {
  40 + "properties": {
  41 + }
  42 + }
  43 + }
  44 + }
  45 + }
... ...
... ... @@ -2,3 +2,12 @@
2 2 #author: 4N
3 3 #createtime: 2021/9/14
4 4 #email: nheweijun@sina.com
  5 +
  6 +from flasgger import swag_from
  7 +from flask import Blueprint
  8 +from app.util import BlueprintApi
  9 +
  10 +class DataManager(BlueprintApi):
  11 +
  12 + bp = Blueprint("WMS", __name__, url_prefix="/API/Service/WMS")
  13 + service_type = ["WMS"]
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/6/11
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Time,Binary,Float
  8 +from app.models import db
  9 +
  10 +
  11 +
  12 +class WMS(db.Model):
  13 + '''
  14 + WMTS元数据
  15 + '''
  16 + __tablename__ = 'dmdms_wms'
  17 +
  18 + guid = Column(String(256), primary_key=True)
  19 + service = Column(String)
  20 + #基本信息
  21 + status = Column(String)
  22 + description = Column(String)
  23 + #厂家
  24 + username = Column(String(256))
  25 +
  26 + readonly = Column(String)
  27 + updatetime = Column(DateTime)
  28 + sid = Column(Integer)
  29 + stype = Column(String)
  30 + ssupply = Column(String)
  31 + sctime = Column(String)
  32 + company = Column(String)
  33 + abstract = Column(String)
  34 + title = Column(String)
  35 + thumbnail = Column(String)
  36 +
  37 + layer_style = Column(Text)
  38 +
  39 + service_guid = Column(String,ForeignKey('dmdms_service.guid'))
\ No newline at end of file
... ...
1 1 # coding=utf-8
2 2 #author: 4N
3   -#createtime: 2021/6/15
  3 +#createtime: 2021/9/17
4 4 #email: nheweijun@sina.com
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/17
  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 +import datetime
  12 +import configure
  13 +class Api(ApiTemplate):
  14 +
  15 + api_name = "注册WMTS服务"
  16 +
  17 + def process(self):
  18 + # 返回结果
  19 + res = {}
  20 +
  21 + try:
  22 +
  23 + this_time = datetime.datetime.now()
  24 + service_guid = uuid.uuid1().__str__()
  25 + wms_service_guid = uuid.uuid1().__str__()
  26 +
  27 +
  28 + #调用wms服务发布接口
  29 +
  30 + service = Service(
  31 + guid = service_guid,
  32 + name = self.para.get("name"),
  33 + alias = self.para.get("alias"),
  34 + state = int(self.para.get("state")) if self.para.get("state") else None,
  35 + create_time = this_time,
  36 + update_time = this_time,
  37 + description = self.para.get("description"),
  38 + #node = Column(Integer),
  39 + overview = "xxxx",
  40 + type = self.para.get("service_type"),
  41 + service_guid = wms_service_guid,
  42 + catalog_guid = self.para.get("catalog_guid")
  43 + )
  44 +
  45 + wms = WMS(
  46 + guid = wms_service_guid,
  47 + name = self.para.get("name"),
  48 + status = self.para.get("status"),
  49 + description=self.para.get("description"),
  50 + username = self.para.get("username"),
  51 + readonly = self.para.get("readonly"),
  52 + updatetime = this_time,
  53 + sid = int(self.para.get("sid")),
  54 + stype = self.para.get("stype"),
  55 + ssupply = self.para.get("ssupply"),
  56 + sctime = self.para.get("sctime"),
  57 + company = self.para.get("company"),
  58 + abstract = self.para.get("abstract"),
  59 + thumbnail = self.para.get("thumbnail"),
  60 + layer_style = self.para.get("layer_style"),
  61 + service_guid = service_guid
  62 + )
  63 +
  64 +
  65 + db.session.add(service)
  66 + db.session.add(wms)
  67 + db.session.commit()
  68 + res["data"] = service_guid
  69 + res["result"] = True
  70 + except Exception as e:
  71 + db.session.rollback()
  72 + raise e
  73 + return res
  74 +
  75 + api_doc = {
  76 + "tags": ["WMTS接口"],
  77 + "parameters": [
  78 +
  79 + ],
  80 + "responses": {
  81 + 200: {
  82 + "schema": {
  83 + "properties": {
  84 + }
  85 + }
  86 + }
  87 + }
  88 + }
\ No newline at end of file
... ...
... ... @@ -2,3 +2,35 @@
2 2 #author: 4N
3 3 #createtime: 2021/9/14
4 4 #email: nheweijun@sina.com
  5 +
  6 +
  7 +from flasgger import swag_from
  8 +from flask import Blueprint
  9 +from app.util import BlueprintApi
  10 +from . import upload_oview
  11 +
  12 +import os
  13 +from flask import send_from_directory
  14 +
  15 +
  16 +class DataManager(BlueprintApi):
  17 +
  18 + bp = Blueprint("WMTS", __name__, url_prefix="/API/Service/WMTS")
  19 +
  20 + @staticmethod
  21 + @bp.route('/UploadOverview', methods=['POST'])
  22 + @swag_from(upload_oview.Api.api_doc)
  23 + def api_upload_oview():
  24 + """
  25 + 上传缩略图
  26 + """
  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
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/6/11
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Time,Binary,Float
  8 +from app.models import db
  9 +
  10 +
  11 +
  12 +class WMTS(db.Model):
  13 + '''
  14 + WMTS元数据
  15 + '''
  16 + __tablename__ = 'dmap_wmts'
  17 +
  18 + guid = Column(String(256), primary_key=True)
  19 +
  20 + #基本信息
  21 + name = Column(String)
  22 + wmts_type = Column(String(256))
  23 + #厂家
  24 + vendor = Column(String(256))
  25 + create_time = Column(DateTime)
  26 + #坐标系
  27 + crs = Column(String(256))
  28 + #切片路径
  29 + datasource = Column(String)
  30 + #调用地址
  31 + metadata_url = Column(String)
  32 + #描述
  33 + description = Column(String)
  34 +
  35 + #图层信息
  36 + #图层名
  37 + layer_name = Column(String(256))
  38 + #图层别名
  39 + layer_alias = Column(String(256))
  40 + #图层title
  41 + layer_tile = Column(String(256))
  42 + #图层样式
  43 + layer_style = Column(String(256))
  44 + #图片格式
  45 + layer_format = Column(String(256))
  46 + #图层范围
  47 + layer_extent = Column(String)
  48 + #图层描述
  49 + layer_description = Column(String)
  50 +
  51 + scheme_guid = Column(String,ForeignKey('dmap_tile_scheme.guid'))
  52 +
  53 + service_guid = Column(String,ForeignKey('dmap_service.guid'))
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/9/17
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.util.component.ApiTemplate import ApiTemplate
  8 +import os
  9 +from app.util.component.FileProcess import FileProcess
  10 +from app.util.component.SliceScheme import SliceScheme
  11 +import shutil
  12 +from app.util.component.StructuredPrint import StructurePrint
  13 +from flask import request
  14 +import uuid
  15 +import configure
  16 +class Api(ApiTemplate):
  17 + api_name = "上传缩略图"
  18 +
  19 + def process(self):
  20 +
  21 + # 返回结果
  22 + res = {}
  23 + try:
  24 + # 业务逻辑
  25 + dir_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))),"overview")
  26 +
  27 + file = request.files['file']
  28 + gid = uuid.uuid1().__str__()
  29 +
  30 + filename = file.filename.split('"')[0]
  31 + store_file = os.path.join(dir_path, "{}{}".format(gid,filename))
  32 + file.save(store_file)
  33 +
  34 + res["data"] ="http://{}/API/Service/Overview/{}".format(
  35 + configure.deploy_ip_host, "{}{}".format(gid,filename))
  36 + res["result"] = True
  37 + except Exception as e:
  38 + raise e
  39 + return res
  40 +
  41 + api_doc = {
  42 +
  43 + "tags": ["WMTS接口"],
  44 + "parameters": [
  45 + {"name": "file",
  46 + "in": "formData",
  47 + "type": "file",
  48 + "description": "缩略图"},
  49 + ],
  50 + "responses": {
  51 + 200: {
  52 + "schema": {
  53 + "properties": {
  54 + }
  55 + }
  56 + }
  57 + }
  58 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/7/19
  4 +#email: nheweijun@sina.com
  5 +
  6 +from app.util.component.ApiTemplate import ApiTemplate
  7 +import uuid
  8 +from .models import WMTS
  9 +from app.models import Service,db
  10 +
  11 +import datetime
  12 +class Api(ApiTemplate):
  13 +
  14 + api_name = "修改WMTS服务"
  15 +
  16 + def process(self):
  17 +
  18 +
  19 +
  20 + # 返回结果
  21 + res = {}
  22 +
  23 + try:
  24 + guid = self.para.get("guid")
  25 + service = Service.query.filter_by(guid=guid).one_or_none()
  26 + this_time = datetime.datetime.now()
  27 +
  28 +
  29 + service_update = {"upate_time":this_time}
  30 + wmts_update = {"upate_time":this_time}
  31 + for key in self.para.keys():
  32 + if key in ["name","alias","state","description","overview","catalog_guid"]:
  33 + service_update[key] = self.para.get(key)
  34 + if key in ["name","wmts_type","vendor","crs","datasource","description",
  35 + "layer_name","layer_alias","layer_tile","layer_style","layer_format",
  36 + "layer_extent","layer_description","scheme_guid"]:
  37 + wmts_update[key] = self.para.get(key)
  38 +
  39 +
  40 + wmts = WMTS.query.filter_by(guid=service.service_guid).one_or_none()
  41 +
  42 + service.update(service_update)
  43 + wmts.update(wmts_update)
  44 +
  45 + db.session.commit()
  46 +
  47 + res["result"] = True
  48 + except Exception as e:
  49 + raise e
  50 +
  51 + return res
  52 +
  53 + api_doc = {
  54 + "tags": ["影像接口"],
  55 + "parameters": [
  56 +
  57 + ],
  58 + "responses": {
  59 + 200: {
  60 + "schema": {
  61 + "properties": {
  62 + }
  63 + }
  64 + }
  65 + }
  66 + }
\ No newline at end of file
... ...
  1 +# coding=utf-8
  2 +#author: 4N
  3 +#createtime: 2021/7/19
  4 +#email: nheweijun@sina.com
  5 +
  6 +
  7 +from app.util.component.ApiTemplate import ApiTemplate
  8 +import uuid
  9 +from .models import WMTS
  10 +from app.models import Service,db
  11 +import datetime
  12 +import configure
  13 +class Api(ApiTemplate):
  14 +
  15 + api_name = "注册WMTS服务"
  16 +
  17 + def process(self):
  18 + # 返回结果
  19 + res = {}
  20 +
  21 + try:
  22 +
  23 + this_time = datetime.datetime.now()
  24 + service_guid = uuid.uuid1().__str__()
  25 + wmts_service_guid = uuid.uuid1().__str__()
  26 +
  27 +
  28 +
  29 + service = Service(
  30 + guid = service_guid,
  31 + name = self.para.get("name"),
  32 + alias = self.para.get("alias"),
  33 + state = int(self.para.get("state")) if self.para.get("state") else None,
  34 + create_time = this_time,
  35 + update_time = this_time,
  36 + description = self.para.get("description"),
  37 + #node = Column(Integer),
  38 + overview = "http://{}/API/Service/Overview/{}".format(
  39 + configure.deploy_ip_host,
  40 + self.para.get("overview") if self.para.get("overview") else "wmts_tb.png"),
  41 + type = self.para.get("service_type"),
  42 + service_guid = wmts_service_guid,
  43 + catalog_guid = self.para.get("catalog_guid")
  44 + )
  45 +
  46 + wmts = WMTS(
  47 + guid = wmts_service_guid,
  48 + name = self.para.get("name"),
  49 + wmts_type = self.para.get("wmts_type"),
  50 + vendor = self.para.get("vendor"),
  51 + create_time = this_time,
  52 + crs = self.para.get("crs"),
  53 + datasource = self.para.get("datasource"),
  54 + description = self.para.get("description"),
  55 + layer_name = self.para.get("layer_name"),
  56 + layer_alias = self.para.get("layer_alias"),
  57 + layer_tile = self.para.get("layer_title"),
  58 + layer_style = self.para.get("layer_style"),
  59 + layer_format = self.para.get("layer_format"),
  60 + layer_extent = self.para.get("layer_extent"),
  61 + layer_description = self.para.get("layer_description"),
  62 + scheme_guid = self.para.get("scheme_guid"),
  63 + service_guid = service_guid
  64 + )
  65 +
  66 +
  67 + #调用WMTS的注册服务接口
  68 +
  69 +
  70 + db.session.add(service)
  71 + db.session.add(wmts)
  72 + db.session.commit()
  73 + res["data"] = service_guid
  74 + res["result"] = True
  75 + except Exception as e:
  76 + db.session.rollback()
  77 + raise e
  78 + return res
  79 +
  80 + api_doc = {
  81 + "tags": ["WMTS接口"],
  82 + "parameters": [
  83 +
  84 + ],
  85 + "responses": {
  86 + 200: {
  87 + "schema": {
  88 + "properties": {
  89 + }
  90 + }
  91 + }
  92 + }
  93 + }
\ No newline at end of file
... ...
... ... @@ -34,241 +34,3 @@ def find_class(modname, class_name):
34 34 yield obj
35 35 for i in find_class(modname, class_name):
36 36 yield i
37   -
38   -#
39   -#
40   -# # 从sqlachemy_uri解析出相关信息
41   -# def get_info_from_sqlachemy_uri(uri):
42   -# parts = uri.split(":")
43   -# user = parts[1][2:]
44   -#
45   -# password_list = parts[2].split("@")
46   -# if password_list.__len__()>2:
47   -# password = "@".join(password_list[:-1])
48   -# else:
49   -# password = parts[2].split("@")[0]
50   -# host = parts[2].split("@")[-1]
51   -# port = parts[3].split("/")[0]
52   -# database = parts[3].split("/")[1]
53   -# return user, password, host, port, database
54   -#
55   -#
56   -# # 获取请求参数
57   -# def get_parameter():
58   -# parameter = {}
59   -# parameter.update(request.args.items())
60   -# parameter.update(request.form.items())
61   -# try:
62   -# request_json = request.get_json()
63   -# if json:
64   -# parameter.update(request_json)
65   -# except:
66   -# pass
67   -# for key in parameter.keys():
68   -# if parameter.get(key) == "":
69   -# parameter[key] = None
70   -# return parameter
71   -#
72   -#
73   -# def togeojson(dict):
74   -# geojson = {}
75   -# geojson["type"] = "Feature"
76   -# geojson["geometry"] = json.loads(dict.pop("geojson"))
77   -# del dict["geojson"]
78   -# if dict.get("wkb_geometry"):
79   -# del dict["wkb_geometry"]
80   -# geojson["properties"] = dict
81   -# return geojson
82   -#
83   -#
84   -# def to_feature_collection(result):
85   -# geojsonresult = [togeojson(x) for x in result]
86   -# data = {}
87   -# data["type"] = "FeatureCollection"
88   -# data["features"] = geojsonresult
89   -# return data
90   -#
91   -#
92   -# def getType(layer):
93   -# origin = layer.GetGeomType() # type:str
94   -# if origin == 1 or origin == 4:
95   -# return "point"
96   -# elif origin == 2 or origin == 5:
97   -# return "linestring"
98   -# elif origin == 3 or origin == 6:
99   -# return "polygon"
100   -# return str(origin)
101   -#
102   -#
103   -# def objects_to_jsonarray(object):
104   -# result = []
105   -# for o in object:
106   -# result.append(object_to_json(o))
107   -# return result
108   -#
109   -#
110   -# def object_to_json(object):
111   -# info = {}
112   -# if object:
113   -# info = object.__dict__
114   -# try:
115   -# del info['_sa_instance_state']
116   -# except:
117   -# pass
118   -# for key in info:
119   -# if isinstance(info[key], datetime.datetime):
120   -# info[key] = info[key].strftime('%Y-%m-%d %H:%M:%S')
121   -# if isinstance(info[key], datetime.time):
122   -# info[key] = info[key].strftime('%H:%M:%S')
123   -# return info
124   -#
125   -#
126   -# def create_zip(path, filepaths: list):
127   -# """
128   -# 创建ZIP文件 并写入文件 (支持大文件夹)
129   -# :param path: 创建的ZIP文件路径
130   -# :param filepaths:
131   -# :return:
132   -# """
133   -# try:
134   -# with zipfile.ZipFile(path, 'w', zipfile.ZIP_DEFLATED) as zip:
135   -# for filepath in filepaths:
136   -# if os.path.isdir(filepath):
137   -# pre_len = len(os.path.dirname(filepath))
138   -# for parent, dirnames, filenames in os.walk(filepath):
139   -# for filename in filenames:
140   -# pathfile = os.path.join(parent, filename)
141   -# if pathfile != path: # 避免将新创建的zip写入该zip文件
142   -# arcname = pathfile[pre_len:].strip(os.path.sep) # 相对路径 不进行则会生成目录树
143   -# zip.write(pathfile, arcname)
144   -# elif os.path.isfile(filepath):
145   -# zip.write(filepath, os.path.basename(filepath))
146   -# else:
147   -# print("创建zip文件对象失败!原因:未识别到路径")
148   -# return "创建zip文件对象失败!原因:未识别到路径"
149   -# return True
150   -#
151   -# except Exception as e:
152   -# print("创建zip文件对象失败!原因:%s" % str(e))
153   -# return "创建zip文件对象失败!原因:%s" % str(e)
154   -#
155   -# def unzip(store_file):
156   -# #处理zip
157   -# store_path = os.path.dirname(store_file)
158   -# zip_file = zipfile.ZipFile(store_file, 'r')
159   -#
160   -# #是否要重命名文件夹
161   -# rename_path = False
162   -# rename_path_origin=None
163   -# rename_path_after =None
164   -# for names in zip_file.namelist():
165   -# #zipfile解压中文文件会有编码问题,需要解压后重命名
166   -# try:
167   -# name_t = names.encode('cp437').decode('gbk')
168   -# except:
169   -# name_t = names.encode('utf-8').decode('utf-8')
170   -#
171   -# zip_file.extract(names,store_path,)
172   -#
173   -# os.chdir(store_path) # 切换到目标目录
174   -#
175   -# if names.__contains__("/"):
176   -# pat = names.split("/")
177   -# pat2 = name_t.split("/")[-1]
178   -# pat[-1] = pat2
179   -# name_tt = "/".join(pat)
180   -# os.rename(names, name_tt)
181   -# if not names[-1].__eq__("/"):
182   -# rename_path = True
183   -# rename_path_origin = names.split("/")[:-1]
184   -# rename_path_after = name_t.split("/")[:-1]
185   -# else:
186   -#
187   -# os.rename(names, name_t) # 重命名文件
188   -# # 重命名文件夹
189   -# if rename_path:
190   -# for i in range(len(rename_path_origin),0,-1):
191   -# origin = "/".join(rename_path_origin[:i])
192   -# rename_path_origin[i-1] = rename_path_after[i-1]
193   -# after = "/".join(rename_path_origin[:i])
194   -# os.rename(origin, after)
195   -#
196   -# os.chdir(os.path.dirname(store_path))
197   -# zip_file.close()
198   -#
199   -#
200   -#
201   -# file_for_open = None
202   -# encoding = None
203   -# for root, dirs, files in os.walk(store_path):
204   -# for fn in files:
205   -# if fn.endswith("shp"):
206   -# file_for_open = os.path.join(root, fn)
207   -# if fn.endswith("cpg"):
208   -# with open(os.path.join(root, fn)) as fd:
209   -# encoding = fd.readline().strip()
210   -# if fn.endswith("gdb"):
211   -# print(fn)
212   -# file_for_open =root
213   -#
214   -# return file_for_open,encoding
215   -#
216   -# def open_pg_data_source(iswrite,uri=configure.SQLALCHEMY_DATABASE_URI):
217   -# """
218   -# # 获取PostGIS数据源
219   -# :return:
220   -# """
221   -# db_conn_tuple = get_info_from_sqlachemy_uri(uri)
222   -# fn = "PG: user=%s password=%s host=%s port=%s dbname=%s " % db_conn_tuple
223   -# driver = ogr.GetDriverByName("PostgreSQL")
224   -# if driver is None:
225   -# raise Exception("打开PostgreSQL驱动失败,可能是当前GDAL未支持PostgreSQL驱动!")
226   -# ds = driver.Open(fn, iswrite)
227   -# if ds is None:
228   -# raise Exception("打开数据源失败!")
229   -# return ds
230   -#
231   -#
232   -# def is_chinese(string):
233   -# """
234   -# 检查整个字符串是否包含中文
235   -# :param string: 需要检查的字符串
236   -# :return: bool
237   -# """
238   -# for ch in string:
239   -# if u'\u4e00' <= ch <= u'\u9fff':
240   -# return True
241   -#
242   -# return False
243   -#
244   -#
245   -# def get_db_session(db_url=configure.SQLALCHEMY_DATABASE_URI,autocommit=False) -> session:
246   -# engine = create_engine(db_url)
247   -# system_session = sessionmaker(bind=engine,autocommit=autocommit)()
248   -# return system_session
249   -#
250   -#
251   -# class Queue:
252   -# def __init__(self):
253   -# self.items = []
254   -# def init(self,items):
255   -# self.items = items
256   -# def empty(self):
257   -# return self.items == []
258   -# def append(self, item):
259   -# self.items.insert(0,item)
260   -# def pop(self):
261   -# return self.items.pop()
262   -# def size(self):
263   -# return len(self.items)
264   -# def __str__(self):
265   -# return self.items.__str__()
266   -#
267   -# def structured_print(mes,type="info"):
268   -# message = "[{}] {} {}".format(type.upper(),datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), mes)
269   -# print(message)
270   -#
271   -#
272   -#
273   -# if __name__ == '__main__':
274   -# print(get_info_from_sqlachemy_uri("postgresql://postgres:CDchinadci@2020@10.48.0.50:5432/dcidms"))
... ...
... ... @@ -499,6 +499,12 @@ class VacuateProcess:
499 499 options = options[1:]
500 500 options.append("OVERWRITE=yes")
501 501 options.append("LAUNDER=no")
  502 +
  503 + schema = layer.schema
  504 + # 增加统计字段
  505 + schema.append(ogr.FieldDefn("_dcigrid_count_", ogr.OFTInteger))
  506 + schema.append(ogr.FieldDefn("_dcigrid_name_", ogr.OFTString))
  507 +
502 508 for l in range(self.max_level):
503 509 this_grid_len = self.this_gridsize[l]
504 510
... ... @@ -523,14 +529,14 @@ class VacuateProcess:
523 529 v_ln = "z{}_vacuate_{}_{}".format(table_guid, self.t_grid_size.index(this_grid_len), grid_name)
524 530 vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options)
525 531 # 抽稀表需要属性
526   - vl.CreateFields(layer.schema)
  532 + vl.CreateFields(schema)
527 533 self.vacuate_layers[l] = vl
528 534
529 535 else:
530 536 pass
531 537
532 538
533   - def vacuate(self,g):
  539 + def vacuate(self,g,feature):
534 540
535 541 if self.is_spatial:
536 542
... ... @@ -567,6 +573,13 @@ class VacuateProcess:
567 573 feat.SetGeometry(center)
568 574 else:
569 575 feat.SetGeometry(g)
  576 +
  577 + # 复制旧feature属性
  578 + field_dict = feature.items()
  579 + for field_name in field_dict:
  580 + feat.SetField(field_name, field_dict[field_name])
  581 + feat.SetField("_dcigrid_name_",".".join(key.split(".")[1:]))
  582 +
570 583 vacuate_layer.CreateFeature(feat)
571 584 self.fill_dict[key] += 1
572 585 #超大的还有机会
... ... @@ -574,8 +587,27 @@ class VacuateProcess:
574 587 vacuate_layer: Layer = self.vacuate_layers.get(level)
575 588 feat = ogr.Feature(vacuate_layer.GetLayerDefn())
576 589 feat.SetGeometry(g)
  590 +
  591 + # 复制旧feature属性
  592 + field_dict = feature.items()
  593 + for field_name in field_dict:
  594 + feat.SetField(field_name, field_dict[field_name])
  595 + feat.SetField("_dcigrid_name_",".".join(key.split(".")[1:]))
  596 +
577 597 vacuate_layer.CreateFeature(feat)
578 598 self.fill_dict[key] += 1
  599 + else:
  600 + self.fill_dict[key] += 1
  601 +
  602 + def set_vacuate_count(self):
  603 + if self.is_spatial:
  604 + # 插入到所有抽稀图层中
  605 + for level in range(self.max_level):
  606 + vacuate_layer: Layer = self.vacuate_layers.get(level)
  607 + for feat in vacuate_layer:
  608 + key = "{}.{}".format(level,feat.GetField("_dcigrid_name_"))
  609 + feat.SetField("_dcigrid_count_",self.fill_dict.get(key))
  610 + vacuate_layer.SetFeature(feat)
579 611
580 612 def end(self):
581 613 for pg in self.pg_ds_dict.values():
... ...
... ... @@ -12,6 +12,7 @@ import math
12 12 class SliceScheme:
13 13
14 14 parameter={}
  15 + levels = []
15 16 def __init__(self,slice_scheme_path):
16 17 tree = ET.parse(slice_scheme_path)
17 18 root:Element = tree.getroot()
... ... @@ -27,6 +28,8 @@ class SliceScheme:
27 28 self.parameter["y"] = float(TileCacheInfo.find("TileOrigin").find("Y").text)
28 29 self.parameter["dpi"] = float(TileCacheInfo.find("DPI").text)
29 30
  31 + self.parameter["wkt"] = TileCacheInfo.find("SpatialReference").find("WKT").text
  32 +
30 33
31 34 LODInfos:Element = TileCacheInfo.find("LODInfos")
32 35
... ... @@ -37,6 +40,10 @@ class SliceScheme:
37 40 info_dict["resolution"] = float(info.find("Resolution").text)
38 41 self.parameter[info.find("LevelID").text] =info_dict
39 42
  43 + self.levels.append({"level":int(info.find("LevelID").text),
  44 + "scale":float(info.find("Scale").text),
  45 + "resolution":float(info.find("Resolution").text)})
  46 +
40 47 @staticmethod
41 48 def get_polygon(parameter,level,row,col):
42 49 level=int(level)
... ... @@ -54,7 +61,7 @@ class SliceScheme:
54 61
55 62
56 63
57   - def get_polygon2(self,level,row,col):
  64 + def get_poly(self,level,row,col):
58 65 level=int(level)
59 66 row = int(row)
60 67 col = int(col)
... ...
... ... @@ -3,20 +3,41 @@
3 3 #createtime: 2021/7/15
4 4 #email: nheweijun@sina.com
5 5
6   -from pyDes import des,ECB,PAD_PKCS5
7   -import base64
8   -import numpy
9   -import gzip
10   -import sys
11   -import json
12   -# pixel_array = numpy.empty((256,256,3),dtype=int)+3
13   -#
14   -#
15   -#
16   -# # 使用gzip 压缩传输
17   -# content = gzip.compress(pixel_array, 2)
18   -#
19   -# print(sys.getsizeof(json.dumps(pixel_array.tolist())))
20   -# print(sys.getsizeof((content)))
21   -import random
22   -print(int(random.random()*2))
\ No newline at end of file
  6 +from osgeo import gdal
  7 +
  8 +
  9 +from osgeo import gdal, gdalconst
  10 +from osgeo import ogr
  11 +
  12 +rasterFile = 'F:/**0416.dat' # 原影像
  13 +shpFile = 'F:/**小麦.shp' # 裁剪矩形
  14 +
  15 +dataset = gdal.Open(rasterFile, gdalconst.GA_ReadOnly)
  16 +
  17 +geo_transform = dataset.GetGeoTransform()
  18 +cols = dataset.RasterXSize # 列数
  19 +rows = dataset.RasterYSize # 行数
  20 +
  21 +x_min = geo_transform[0]
  22 +y_min = geo_transform[3]
  23 +pixel_width = geo_transform[1]
  24 +
  25 +shp = ogr.Open(shpFile, 0)
  26 +m_layer = shp.GetLayerByIndex(0)
  27 +
  28 +target_ds = gdal.GetDriverByName('MEM').Create("", xsize=cols, ysize=rows, bands=1,
  29 + eType=gdal.GDT_Byte)
  30 +target_ds.SetGeoTransform(geo_transform)
  31 +target_ds.SetProjection(dataset.GetProjection())
  32 +
  33 +band = target_ds.GetRasterBand(1)
  34 +band.SetNoDataValue(0)
  35 +band.FlushCache()
  36 +gdal.RasterizeLayer(target_ds, [1], m_layer) # 跟shp字段给栅格像元赋值
  37 +
  38 +
  39 +
  40 +# gdal.RasterizeLayer(target_ds, [1], m_layer) # 多边形内像元值的全是255
  41 +del dataset
  42 +del target_ds
  43 +shp.Release()
... ...
注册登录 后发表评论