提交 9d1053c1c083046fce17aaf4b22f97d1bd185962

作者 nheweijun
1 个父辈 6ca42a95

中秋节前备份

正在显示 60 个修改的文件 包含 2258 行增加394 行删除
@@ -53,10 +53,10 @@ class Table(db.Model): @@ -53,10 +53,10 @@ class Table(db.Model):
53 ''' 53 '''
54 数据表元数据 54 数据表元数据
55 ''' 55 '''
56 - __tablename__ = 'dmdms_table' 56 + __tablename__ = 'dmap_table'
57 guid = Column(String(256), primary_key=True) 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 # 点线面123 61 # 点线面123
62 table_type = Column(Integer) 62 table_type = Column(Integer)
@@ -77,7 +77,7 @@ class Table(db.Model): @@ -77,7 +77,7 @@ class Table(db.Model):
77 is_vacuate=Column(Integer,default=0) 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 relate_columns = relationship('Columns', backref='relate_table', lazy='dynamic') 82 relate_columns = relationship('Columns', backref='relate_table', lazy='dynamic')
83 relate_table_vacuates = relationship('TableVacuate', backref='relate_table', lazy='dynamic') 83 relate_table_vacuates = relationship('TableVacuate', backref='relate_table', lazy='dynamic')
@@ -87,12 +87,12 @@ class TableVacuate(db.Model): @@ -87,12 +87,12 @@ class TableVacuate(db.Model):
87 ''' 87 '''
88 sub数据表元数据 88 sub数据表元数据
89 ''' 89 '''
90 - __tablename__ = 'dmdms_table_vacuate' 90 + __tablename__ = 'dmap_table_vacuate'
91 guid = Column(String(256), primary_key=True) 91 guid = Column(String(256), primary_key=True)
92 name = Column(String(256)) 92 name = Column(String(256))
93 level = Column(Integer) 93 level = Column(Integer)
94 pixel_distance = Column(Float) 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 connectstr= Column(Text) 98 connectstr= Column(Text)
@@ -101,10 +101,10 @@ class Columns(db.Model): @@ -101,10 +101,10 @@ class Columns(db.Model):
101 ''' 101 '''
102 数据表的列 102 数据表的列
103 ''' 103 '''
104 - __tablename__ = 'dmdms_column' 104 + __tablename__ = 'dmap_column'
105 guid = Column(String(256), primary_key=True) 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 name=Column(String(256)) 108 name=Column(String(256))
109 alias = Column(String(256)) 109 alias = Column(String(256))
110 create_time = Column(DateTime) 110 create_time = Column(DateTime)
@@ -114,7 +114,7 @@ class Task(db.Model): @@ -114,7 +114,7 @@ class Task(db.Model):
114 ''' 114 '''
115 任务表 115 任务表
116 ''' 116 '''
117 - __tablename__ = 'dmdms_task' 117 + __tablename__ = 'dmap_task'
118 guid = Column(String(256), primary_key=True) 118 guid = Column(String(256), primary_key=True)
119 name = Column(Text) 119 name = Column(Text)
120 process = Column(Text) 120 process = Column(Text)
@@ -122,9 +122,9 @@ class Task(db.Model): @@ -122,9 +122,9 @@ class Task(db.Model):
122 update_time = Column(DateTime) 122 update_time = Column(DateTime)
123 state = Column(Integer) 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 #抽稀任务指定表的guid 128 #抽稀任务指定表的guid
129 table_guid = Column(String(256)) 129 table_guid = Column(String(256))
130 #任务类型 130 #任务类型
@@ -146,10 +146,10 @@ class Process(db.Model): @@ -146,10 +146,10 @@ class Process(db.Model):
146 ''' 146 '''
147 过程信息表 147 过程信息表
148 ''' 148 '''
149 - __tablename__ = 'dmdms_process' 149 + __tablename__ = 'dmap_process'
150 guid = Column(String(256), primary_key=True) 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 time = Column(DateTime) 153 time = Column(DateTime)
154 message = Column(Text) 154 message = Column(Text)
155 155
@@ -158,9 +158,9 @@ class Catalog(db.Model): @@ -158,9 +158,9 @@ class Catalog(db.Model):
158 ''' 158 '''
159 目录表 159 目录表
160 ''' 160 '''
161 - __tablename__ = 'dmdms_catalog' 161 + __tablename__ = 'dmap_catalog'
162 guid = Column(String(256), primary_key=True) 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 pguid = Column(String(256)) 164 pguid = Column(String(256))
165 path = Column(Text) 165 path = Column(Text)
166 name = Column(String(256)) 166 name = Column(String(256))
@@ -169,11 +169,12 @@ class Catalog(db.Model): @@ -169,11 +169,12 @@ class Catalog(db.Model):
169 relate_tables = relationship('Table', backref='relate_catalog', lazy='dynamic') 169 relate_tables = relationship('Table', backref='relate_catalog', lazy='dynamic')
170 relate_tasks = relationship('Task', backref='relate_catalog', lazy='dynamic') 170 relate_tasks = relationship('Task', backref='relate_catalog', lazy='dynamic')
171 171
  172 +
172 class Database(db.Model): 173 class Database(db.Model):
173 ''' 174 '''
174 数据源表 175 数据源表
175 ''' 176 '''
176 - __tablename__ = 'dmdms_database' 177 + __tablename__ = 'dmap_database'
177 guid = Column(String(256), primary_key=True) 178 guid = Column(String(256), primary_key=True)
178 name = Column(String(256)) 179 name = Column(String(256))
179 alias = Column(String(256)) 180 alias = Column(String(256))
@@ -194,7 +195,7 @@ class InsertingLayerName(db.Model): @@ -194,7 +195,7 @@ class InsertingLayerName(db.Model):
194 ''' 195 '''
195 正在入库的数据 196 正在入库的数据
196 ''' 197 '''
197 - __tablename__ = 'dmdms_iln' 198 + __tablename__ = 'dmap_iln'
198 guid = Column(String(256), primary_key=True) 199 guid = Column(String(256), primary_key=True)
199 task_guid = Column(String(256)) 200 task_guid = Column(String(256))
200 name = Column(String(256)) 201 name = Column(String(256))
@@ -203,9 +204,9 @@ class InsertingLayerName(db.Model): @@ -203,9 +204,9 @@ class InsertingLayerName(db.Model):
203 class Service(db.Model): 204 class Service(db.Model):
204 ''' 205 '''
205 ''' 206 '''
206 - __tablename__ = 'dmdms_service' 207 + __tablename__ = 'dmap_service'
207 guid = Column(String(256), primary_key=True) 208 guid = Column(String(256), primary_key=True)
208 - name=Column(String(256)) 209 + name = Column(String(256))
209 alias = Column(String(256)) 210 alias = Column(String(256))
210 #服务状态 211 #服务状态
211 state= Column(Integer) 212 state= Column(Integer)
@@ -216,5 +217,55 @@ class Service(db.Model): @@ -216,5 +217,55 @@ class Service(db.Model):
216 #服务节点 217 #服务节点
217 node = Column(Integer) 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)
@@ -13,7 +13,7 @@ class User (db.Model): @@ -13,7 +13,7 @@ class User (db.Model):
13 ''' 13 '''
14 用户信息表 14 用户信息表
15 ''' 15 '''
16 - __tablename__ = "dmdms_user" 16 + __tablename__ = "dmap_user"
17 id = Column(Integer, primary_key=True) 17 id = Column(Integer, primary_key=True)
18 username = Column(Text) 18 username = Column(Text)
19 password = Column(Text) 19 password = Column(Text)
@@ -33,28 +33,28 @@ class User (db.Model): @@ -33,28 +33,28 @@ class User (db.Model):
33 33
34 34
35 class OAuth2Client(db.Model, OAuth2ClientMixin): 35 class OAuth2Client(db.Model, OAuth2ClientMixin):
36 - __tablename__ = 'dmdms_oauth2_client' 36 + __tablename__ = 'dmap_oauth2_client'
37 37
38 id = Column(Integer, primary_key=True) 38 id = Column(Integer, primary_key=True)
39 user_id = Column( 39 user_id = Column(
40 - Integer, ForeignKey('dmdms_user.id', ondelete='CASCADE')) 40 + Integer, ForeignKey('dmap_user.id', ondelete='CASCADE'))
41 user = relationship('User') 41 user = relationship('User')
42 42
43 43
44 class OAuth2AuthorizationCode(db.Model, OAuth2AuthorizationCodeMixin): 44 class OAuth2AuthorizationCode(db.Model, OAuth2AuthorizationCodeMixin):
45 - __tablename__ = 'dmdms_oauth2_code' 45 + __tablename__ = 'dmap_oauth2_code'
46 46
47 id = Column(Integer, primary_key=True) 47 id = Column(Integer, primary_key=True)
48 user_id = Column( 48 user_id = Column(
49 - Integer, ForeignKey('dmdms_user.id', ondelete='CASCADE')) 49 + Integer, ForeignKey('dmap_user.id', ondelete='CASCADE'))
50 user = relationship('User') 50 user = relationship('User')
51 51
52 52
53 class OAuth2Token(db.Model, OAuth2TokenMixin): 53 class OAuth2Token(db.Model, OAuth2TokenMixin):
54 - __tablename__ = 'dmdms_oauth2_token' 54 + __tablename__ = 'dmap_oauth2_token'
55 55
56 id = Column(Integer, primary_key=True) 56 id = Column(Integer, primary_key=True)
57 user_id = Column( 57 user_id = Column(
58 - Integer, ForeignKey('dmdms_user.id', ondelete='CASCADE')) 58 + Integer, ForeignKey('dmap_user.id', ondelete='CASCADE'))
59 # name = Column(Text) 59 # name = Column(Text)
60 user = relationship('User') 60 user = relationship('User')
  1 +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
  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,7 +51,7 @@ class Api(ApiTemplate):
51 51
52 else: 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 dir_path, store_file = FileProcess.save(parent) 55 dir_path, store_file = FileProcess.save(parent)
56 store_path = ZipUtil.unzip(store_file) 56 store_path = ZipUtil.unzip(store_file)
57 57
@@ -2,11 +2,13 @@ @@ -2,11 +2,13 @@
2 #createtime: 2021/1/27 2 #createtime: 2021/1/27
3 #email: nheweijun@sina.com 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 from app.util.component.ApiTemplate import ApiTemplate 7 from app.util.component.ApiTemplate import ApiTemplate
8 from app.util.component.ModelVisitor import ModelVisitor 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 class Api(ApiTemplate): 12 class Api(ApiTemplate):
11 api_name = "表信息" 13 api_name = "表信息"
12 def process(self): 14 def process(self):
@@ -16,10 +18,21 @@ class Api(ApiTemplate): @@ -16,10 +18,21 @@ class Api(ApiTemplate):
16 table = Table.query.filter_by(guid=table_guid).one_or_none() 18 table = Table.query.filter_by(guid=table_guid).one_or_none()
17 if not table: 19 if not table:
18 raise Exception("数据不存在!") 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 columns = table.relate_columns.order_by(Columns.name).all() 32 columns = table.relate_columns.order_by(Columns.name).all()
21 res["data"]=ModelVisitor.table_to_json(table) 33 res["data"]=ModelVisitor.table_to_json(table)
22 res["data"]["columns"] = ModelVisitor.objects_to_jsonarray(columns) 34 res["data"]["columns"] = ModelVisitor.objects_to_jsonarray(columns)
  35 + res["data"].update(append_dict)
23 res["result"] = True 36 res["result"] = True
24 37
25 except Exception as e: 38 except Exception as e:
@@ -5,18 +5,20 @@ @@ -5,18 +5,20 @@
5 5
6 import datetime 6 import datetime
7 import traceback 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 from sqlalchemy.engine import ResultProxy 10 from sqlalchemy.engine import ResultProxy
11 from app.util.component.ApiTemplate import ApiTemplate 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 from app.util.component.StructuredPrint import StructurePrint 13 from app.util.component.StructuredPrint import StructurePrint
15 from app.util.component.PGUtil import PGUtil 14 from app.util.component.PGUtil import PGUtil
16 import multiprocessing 15 import multiprocessing
17 import uuid 16 import uuid
18 import configure 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 from .table_vacuate_ref import Api as RefApi 23 from .table_vacuate_ref import Api as RefApi
22 24
@@ -139,8 +141,9 @@ class Api(ApiTemplate): @@ -139,8 +141,9 @@ class Api(ApiTemplate):
139 geo = feature.GetGeometryRef() 141 geo = feature.GetGeometryRef()
140 #插入抽稀图层 142 #插入抽稀图层
141 if geo is not None: 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 if configure.VACUATE_DB_URI: 149 if configure.VACUATE_DB_URI:
@@ -212,4 +215,221 @@ class Api(ApiTemplate): @@ -212,4 +215,221 @@ class Api(ApiTemplate):
212 } 215 }
213 } 216 }
214 } 217 }
215 - }  
  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,7 +137,9 @@ class Api(ApiTemplate):
137 geo = feature.GetGeometryRef() 137 geo = feature.GetGeometryRef()
138 #插入抽稀图层 138 #插入抽稀图层
139 if geo is not None: 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 for grid in grids: 145 for grid in grids:
@@ -278,6 +280,12 @@ class VacuateProcess: @@ -278,6 +280,12 @@ class VacuateProcess:
278 options = options[1:] 280 options = options[1:]
279 options.append("OVERWRITE=yes") 281 options.append("OVERWRITE=yes")
280 options.append("LAUNDER=no") 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 for l in range(self.max_level): 289 for l in range(self.max_level):
282 this_grid_len = self.this_gridsize[l] 290 this_grid_len = self.this_gridsize[l]
283 291
@@ -304,15 +312,16 @@ class VacuateProcess: @@ -304,15 +312,16 @@ class VacuateProcess:
304 312
305 v_ln = "z{}_vacuate_{}_{}".format(table_guid,lev, grid_name) 313 v_ln = "z{}_vacuate_{}_{}".format(table_guid,lev, grid_name)
306 vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options) 314 vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options)
  315 +
307 # 抽稀表需要属性 316 # 抽稀表需要属性
308 - vl.CreateFields(layer.schema) 317 + vl.CreateFields(schema)
309 self.vacuate_layers[l] = vl 318 self.vacuate_layers[l] = vl
310 319
311 else: 320 else:
312 pass 321 pass
313 322
314 323
315 - def vacuate(self,g): 324 + def vacuate(self,g,feature):
316 325
317 if self.is_spatial: 326 if self.is_spatial:
318 327
@@ -349,15 +358,42 @@ class VacuateProcess: @@ -349,15 +358,42 @@ class VacuateProcess:
349 feat.SetGeometry(center) 358 feat.SetGeometry(center)
350 else: 359 else:
351 feat.SetGeometry(g) 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 vacuate_layer.CreateFeature(feat) 368 vacuate_layer.CreateFeature(feat)
353 self.fill_dict[key] += 1 369 self.fill_dict[key] += 1
  370 +
354 #超大的还有机会 371 #超大的还有机会
355 elif (long_extent > 10*this_grid_len or lat_extent >10*this_grid_len) and self.fill_dict[key]<5: 372 elif (long_extent > 10*this_grid_len or lat_extent >10*this_grid_len) and self.fill_dict[key]<5:
356 vacuate_layer: Layer = self.vacuate_layers.get(level) 373 vacuate_layer: Layer = self.vacuate_layers.get(level)
357 feat = ogr.Feature(vacuate_layer.GetLayerDefn()) 374 feat = ogr.Feature(vacuate_layer.GetLayerDefn())
358 feat.SetGeometry(g) 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 vacuate_layer.CreateFeature(feat) 383 vacuate_layer.CreateFeature(feat)
360 self.fill_dict[key] += 1 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 def end(self): 398 def end(self):
363 for pg in self.pg_ds_dict.values(): 399 for pg in self.pg_ds_dict.values():
@@ -9,7 +9,7 @@ from flask import Blueprint @@ -9,7 +9,7 @@ from flask import Blueprint
9 from app.util import BlueprintApi 9 from app.util import BlueprintApi
10 10
11 from . import monitor_info 11 from . import monitor_info
12 -class DataManager(): 12 +class Monitor(BlueprintApi):
13 13
14 bp = Blueprint("Monitor", __name__, url_prefix="/API/Monitor") 14 bp = Blueprint("Monitor", __name__, url_prefix="/API/Monitor")
15 15
@@ -7,9 +7,3 @@ @@ -7,9 +7,3 @@
7 from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Time 7 from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Time
8 from app.models import db 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)  
@@ -2,3 +2,133 @@ @@ -2,3 +2,133 @@
2 #author: 4N 2 #author: 4N
3 #createtime: 2021/9/14 3 #createtime: 2021/9/14
4 #email: nheweijun@sina.com 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)
  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 + }
  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 + }
  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 + }
  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 + }
@@ -17,7 +17,7 @@ from . import feature_edit @@ -17,7 +17,7 @@ from . import feature_edit
17 class DataManager(BlueprintApi): 17 class DataManager(BlueprintApi):
18 18
19 bp = Blueprint("FeatureService", __name__, url_prefix="/API/FeatureService") 19 bp = Blueprint("FeatureService", __name__, url_prefix="/API/FeatureService")
20 - 20 + service_type = ["要素服务"]
21 @staticmethod 21 @staticmethod
22 @bp.route('/Query', methods=['POST']) 22 @bp.route('/Query', methods=['POST'])
23 @swag_from(feature_query.Api.api_doc) 23 @swag_from(feature_query.Api.api_doc)
@@ -17,9 +17,12 @@ from . import image_list @@ -17,9 +17,12 @@ from . import image_list
17 from . import image_tile 17 from . import image_tile
18 from . import image_wms 18 from . import image_wms
19 19
  20 +
  21 +
20 class DataManager(BlueprintApi): 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 @staticmethod 27 @staticmethod
25 @bp.route('/Register', methods=['POST']) 28 @bp.route('/Register', methods=['POST'])
@@ -17,8 +17,8 @@ class Api(ApiTemplate): @@ -17,8 +17,8 @@ class Api(ApiTemplate):
17 try: 17 try:
18 guid = self.para.get("guid") 18 guid = self.para.get("guid")
19 image = Image.query.filter_by(guid=guid).one_or_none() 19 image = Image.query.filter_by(guid=guid).one_or_none()
  20 + db.session.delete(image)
20 db.session.commit() 21 db.session.commit()
21 - # res["data"] = guid  
22 res["result"] = True 22 res["result"] = True
23 23
24 except Exception as e: 24 except Exception as e:
@@ -31,8 +31,7 @@ class Api(ApiTemplate): @@ -31,8 +31,7 @@ class Api(ApiTemplate):
31 "parameters": [ 31 "parameters": [
32 {"name": "guid", 32 {"name": "guid",
33 "in": "formData", 33 "in": "formData",
34 - "type": "string",  
35 - "description": "data_server"} 34 + "type": "string"}
36 ], 35 ],
37 "responses": { 36 "responses": {
38 200: { 37 200: {
@@ -47,6 +47,20 @@ class Api(ApiTemplate): @@ -47,6 +47,20 @@ class Api(ApiTemplate):
47 api_doc = { 47 api_doc = {
48 "tags": ["影像接口"], 48 "tags": ["影像接口"],
49 "parameters": [ 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 "responses": { 65 "responses": {
52 200: { 66 200: {
@@ -6,53 +6,26 @@ @@ -6,53 +6,26 @@
6 6
7 from app.util.component.ApiTemplate import ApiTemplate 7 from app.util.component.ApiTemplate import ApiTemplate
8 from app.util.component.ModelVisitor import ModelVisitor 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 class Api(ApiTemplate): 12 class Api(ApiTemplate):
13 13
14 -  
15 -  
16 - api_name = "注册影像服务"  
17 -  
18 -  
19 - 14 + api_name = "影像数据预览功能"
20 15
21 def process(self): 16 def process(self):
22 17
23 -  
24 -  
25 # 返回结果 18 # 返回结果
26 res = {} 19 res = {}
27 -  
28 try: 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 res["result"] = True 22 res["result"] = True
49 -  
50 -  
51 except Exception as e: 23 except Exception as e:
52 raise e 24 raise e
53 25
54 return res 26 return res
55 27
  28 +
56 api_doc = { 29 api_doc = {
57 "tags": ["影像接口"], 30 "tags": ["影像接口"],
58 "parameters": [ 31 "parameters": [
@@ -65,4 +38,6 @@ class Api(ApiTemplate): @@ -65,4 +38,6 @@ class Api(ApiTemplate):
65 } 38 }
66 } 39 }
67 } 40 }
68 - }  
  41 + }
  42 +
  43 +
@@ -53,21 +53,21 @@ class Api(ApiTemplate): @@ -53,21 +53,21 @@ class Api(ApiTemplate):
53 right_buttom = (geo[0] + geo[1] * image.RasterXSize, geo[3] + geo[5] * image.RasterYSize) 53 right_buttom = (geo[0] + geo[1] * image.RasterXSize, geo[3] + geo[5] * image.RasterYSize)
54 origin_extent = [left_top[0], right_buttom[0], right_buttom[1], left_top[1]] 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 info = {"band_count": band_count, 65 info = {"band_count": band_count,
66 "overview_count": count, 66 "overview_count": count,
67 "path":image_info["path"], 67 "path":image_info["path"],
68 "xy_size": [image.RasterXSize, image.RasterYSize], 68 "xy_size": [image.RasterXSize, image.RasterYSize],
69 "origin_extent": origin_extent, 69 "origin_extent": origin_extent,
70 - "geo_origin_extent": geo_origin_extent, 70 + # "geo_origin_extent": geo_origin_extent,
71 "null_value": nodatavalue, 71 "null_value": nodatavalue,
72 "size":os.path.getsize(image_info["path"]), 72 "size":os.path.getsize(image_info["path"]),
73 "sr_wkt": image.GetProjection(), 73 "sr_wkt": image.GetProjection(),
@@ -102,8 +102,6 @@ class Api(ApiTemplate): @@ -102,8 +102,6 @@ class Api(ApiTemplate):
102 # origin_extent = info["origin_extent"] 102 # origin_extent = info["origin_extent"]
103 103
104 104
105 -  
106 -  
107 exist_image = Image.query.filter_by(path=os.path.normpath(info.get("path")), 105 exist_image = Image.query.filter_by(path=os.path.normpath(info.get("path")),
108 size=info.get("size")).one_or_none() 106 size=info.get("size")).one_or_none()
109 if exist_image: 107 if exist_image:
@@ -120,7 +118,7 @@ class Api(ApiTemplate): @@ -120,7 +118,7 @@ class Api(ApiTemplate):
120 cell_y_size = abs(info.get("cell_y_size")), 118 cell_y_size = abs(info.get("cell_y_size")),
121 name=os.path.basename(info.get("path")), 119 name=os.path.basename(info.get("path")),
122 origin_extent=json.dumps(info["origin_extent"]), 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 null_value=info.get("null_value"), 122 null_value=info.get("null_value"),
125 server=data_server, 123 server=data_server,
126 path = os.path.normpath(info.get("path")), 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 + }
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 #email: nheweijun@sina.com 4 #email: nheweijun@sina.com
5 5
6 from app.modules.service.image.models import ImageService,Image 6 from app.modules.service.image.models import ImageService,Image
7 -from app.models import db 7 +from app.models import db,Service
8 from app.util.component.ApiTemplate import ApiTemplate 8 from app.util.component.ApiTemplate import ApiTemplate
9 import uuid 9 import uuid
10 from app.util.component.SliceScheme import SliceScheme 10 from app.util.component.SliceScheme import SliceScheme
@@ -26,6 +26,8 @@ class Api(ApiTemplate): @@ -26,6 +26,8 @@ class Api(ApiTemplate):
26 try: 26 try:
27 guids = self.para.get("guids").split(",") 27 guids = self.para.get("guids").split(",")
28 name = self.para.get("name") 28 name = self.para.get("name")
  29 + catalog_guid = self.para.get("catalog_guid")
  30 +
29 service_guid = uuid.uuid1().__str__() 31 service_guid = uuid.uuid1().__str__()
30 32
31 33
@@ -33,7 +35,7 @@ class Api(ApiTemplate): @@ -33,7 +35,7 @@ class Api(ApiTemplate):
33 dir_path, store_file = FileProcess.save(parent) 35 dir_path, store_file = FileProcess.save(parent)
34 scheme = SliceScheme(store_file).parameter 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 create_time=datetime.datetime.now()) 39 create_time=datetime.datetime.now())
38 service_exetent = [] 40 service_exetent = []
39 41
@@ -91,11 +91,8 @@ class Api(ApiTemplate): @@ -91,11 +91,8 @@ class Api(ApiTemplate):
91 height, width = 256,256 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 if len(intersect_image) > 1: 97 if len(intersect_image) > 1:
101 98
@@ -67,12 +67,10 @@ class Api(ApiTemplate): @@ -67,12 +67,10 @@ class Api(ApiTemplate):
67 67
68 bands = [1, 2, 3] 68 bands = [1, 2, 3]
69 extent = [float(x) for x in bbox.split(",")] 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 if len(intersect_image)>1: 75 if len(intersect_image)>1:
78 76
@@ -141,7 +139,6 @@ class Api(ApiTemplate): @@ -141,7 +139,6 @@ class Api(ApiTemplate):
141 result["message"] = e.__str__() 139 result["message"] = e.__str__()
142 return result 140 return result
143 141
144 -  
145 def determine_level(self,xysize,origin_extent,extent,max_level): 142 def determine_level(self,xysize,origin_extent,extent,max_level):
146 ''' 143 '''
147 根据范围判断调用金字塔的哪一层 144 根据范围判断调用金字塔的哪一层
@@ -201,7 +198,7 @@ class Api(ApiTemplate): @@ -201,7 +198,7 @@ class Api(ApiTemplate):
201 ''' 198 '''
202 thrift_connect = ThriftConnect(image.server) 199 thrift_connect = ThriftConnect(image.server)
203 t1 = time.time() 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 data = thrift_connect.client.getData(image.path, extent, json.loads(image_extent), bands,width,height) 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,7 +321,7 @@ class Api(ApiTemplate):
324 def get_capabilities(self,image_service:ImageService): 321 def get_capabilities(self,image_service:ImageService):
325 322
326 xml = '''<?xml version="1.0" encoding="utf-8" ?> 323 xml = '''<?xml version="1.0" encoding="utf-8" ?>
327 - <WMS_Capabilities version="1.3.0"> 324 + <WMS_Capabilities version="1.2.0">
328 <Service> 325 <Service>
329 <Name>WMS</Name> 326 <Name>WMS</Name>
330 <Title>{service_title}</Title> 327 <Title>{service_title}</Title>
@@ -13,22 +13,21 @@ class Image(db.Model): @@ -13,22 +13,21 @@ class Image(db.Model):
13 ''' 13 '''
14 影像元数据 14 影像元数据
15 ''' 15 '''
16 - __tablename__ = 'dmdms_image' 16 + __tablename__ = 'dmap_image'
17 guid = Column(String(256), primary_key=True) 17 guid = Column(String(256), primary_key=True)
18 name = Column(String) 18 name = Column(String)
19 alias = Column(String) 19 alias = Column(String)
20 raster_y_size = Column(Integer) 20 raster_y_size = Column(Integer)
21 raster_x_size = Column(Integer) 21 raster_x_size = Column(Integer)
22 overview_count = Column(Integer) 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 null_value = Column(Integer) 25 null_value = Column(Integer)
26 available = Column(Integer)#影像是否可用,不可用可能在创建金字塔中 26 available = Column(Integer)#影像是否可用,不可用可能在创建金字塔中
27 band_count = Column(Integer) 27 band_count = Column(Integer)
28 path = Column(String) 28 path = Column(String)
29 server = Column(String) 29 server = Column(String)
30 - # host=Column(String)  
31 - # port=Column(Integer) 30 +
32 size = Column(Float) 31 size = Column(Float)
33 #坐标wkt 32 #坐标wkt
34 sr_wkt = Column(Text) 33 sr_wkt = Column(Text)
@@ -42,9 +41,9 @@ class Image(db.Model): @@ -42,9 +41,9 @@ class Image(db.Model):
42 #年份 41 #年份
43 ym = Column(String(256)) 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,44 +52,40 @@ class ImageService(db.Model):
53 ''' 52 '''
54 影像服务 53 影像服务
55 ''' 54 '''
56 - __tablename__ = 'dmdms_image_service' 55 + __tablename__ = 'dmap_image_service'
57 guid = Column(String(256), primary_key=True) 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 extent = Column(String(256)) 59 extent = Column(String(256))
66 - node = Column(Integer) 60 + # node = Column(Integer)
67 #可视范围geojson 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 images = db.relationship('Image', 67 images = db.relationship('Image',
73 - secondary=dmdms_image_rel, 68 + secondary=dmap_image_rel,
74 backref='image_services', 69 backref='image_services',
75 lazy='dynamic' 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 class ImageTag(db.Model): 79 class ImageTag(db.Model):
85 ''' 80 '''
86 影像标签 81 影像标签
87 ''' 82 '''
88 - __tablename__ = 'dmdms_image_tag' 83 + __tablename__ = 'dmap_image_tag'
89 guid = Column(String(256), primary_key=True) 84 guid = Column(String(256), primary_key=True)
90 name=Column(String(256)) 85 name=Column(String(256))
91 alias = Column(String(256)) 86 alias = Column(String(256))
92 images = db.relationship('Image', 87 images = db.relationship('Image',
93 - secondary=dmdms_image_tag_rel, 88 + secondary=dmap_image_tag_rel,
94 backref='image_tags', 89 backref='image_tags',
95 lazy='dynamic' 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
  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 + }
  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 + }
  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 + }
  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 + }
  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 + }
  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 + }
  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,3 +2,12 @@
2 #author: 4N 2 #author: 4N
3 #createtime: 2021/9/14 3 #createtime: 2021/9/14
4 #email: nheweijun@sina.com 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"]
  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'))
1 # coding=utf-8 1 # coding=utf-8
2 #author: 4N 2 #author: 4N
3 -#createtime: 2021/6/15 3 +#createtime: 2021/9/17
4 #email: nheweijun@sina.com 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 + }
@@ -2,3 +2,35 @@ @@ -2,3 +2,35 @@
2 #author: 4N 2 #author: 4N
3 #createtime: 2021/9/14 3 #createtime: 2021/9/14
4 #email: nheweijun@sina.com 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'))
  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 + }
  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 + }
  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 + }
@@ -34,241 +34,3 @@ def find_class(modname, class_name): @@ -34,241 +34,3 @@ def find_class(modname, class_name):
34 yield obj 34 yield obj
35 for i in find_class(modname, class_name): 35 for i in find_class(modname, class_name):
36 yield i 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,6 +499,12 @@ class VacuateProcess:
499 options = options[1:] 499 options = options[1:]
500 options.append("OVERWRITE=yes") 500 options.append("OVERWRITE=yes")
501 options.append("LAUNDER=no") 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 for l in range(self.max_level): 508 for l in range(self.max_level):
503 this_grid_len = self.this_gridsize[l] 509 this_grid_len = self.this_gridsize[l]
504 510
@@ -523,14 +529,14 @@ class VacuateProcess: @@ -523,14 +529,14 @@ class VacuateProcess:
523 v_ln = "z{}_vacuate_{}_{}".format(table_guid, self.t_grid_size.index(this_grid_len), grid_name) 529 v_ln = "z{}_vacuate_{}_{}".format(table_guid, self.t_grid_size.index(this_grid_len), grid_name)
524 vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options) 530 vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options)
525 # 抽稀表需要属性 531 # 抽稀表需要属性
526 - vl.CreateFields(layer.schema) 532 + vl.CreateFields(schema)
527 self.vacuate_layers[l] = vl 533 self.vacuate_layers[l] = vl
528 534
529 else: 535 else:
530 pass 536 pass
531 537
532 538
533 - def vacuate(self,g): 539 + def vacuate(self,g,feature):
534 540
535 if self.is_spatial: 541 if self.is_spatial:
536 542
@@ -567,6 +573,13 @@ class VacuateProcess: @@ -567,6 +573,13 @@ class VacuateProcess:
567 feat.SetGeometry(center) 573 feat.SetGeometry(center)
568 else: 574 else:
569 feat.SetGeometry(g) 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 vacuate_layer.CreateFeature(feat) 583 vacuate_layer.CreateFeature(feat)
571 self.fill_dict[key] += 1 584 self.fill_dict[key] += 1
572 #超大的还有机会 585 #超大的还有机会
@@ -574,8 +587,27 @@ class VacuateProcess: @@ -574,8 +587,27 @@ class VacuateProcess:
574 vacuate_layer: Layer = self.vacuate_layers.get(level) 587 vacuate_layer: Layer = self.vacuate_layers.get(level)
575 feat = ogr.Feature(vacuate_layer.GetLayerDefn()) 588 feat = ogr.Feature(vacuate_layer.GetLayerDefn())
576 feat.SetGeometry(g) 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 vacuate_layer.CreateFeature(feat) 597 vacuate_layer.CreateFeature(feat)
578 self.fill_dict[key] += 1 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 def end(self): 612 def end(self):
581 for pg in self.pg_ds_dict.values(): 613 for pg in self.pg_ds_dict.values():
@@ -12,6 +12,7 @@ import math @@ -12,6 +12,7 @@ import math
12 class SliceScheme: 12 class SliceScheme:
13 13
14 parameter={} 14 parameter={}
  15 + levels = []
15 def __init__(self,slice_scheme_path): 16 def __init__(self,slice_scheme_path):
16 tree = ET.parse(slice_scheme_path) 17 tree = ET.parse(slice_scheme_path)
17 root:Element = tree.getroot() 18 root:Element = tree.getroot()
@@ -27,6 +28,8 @@ class SliceScheme: @@ -27,6 +28,8 @@ class SliceScheme:
27 self.parameter["y"] = float(TileCacheInfo.find("TileOrigin").find("Y").text) 28 self.parameter["y"] = float(TileCacheInfo.find("TileOrigin").find("Y").text)
28 self.parameter["dpi"] = float(TileCacheInfo.find("DPI").text) 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 LODInfos:Element = TileCacheInfo.find("LODInfos") 34 LODInfos:Element = TileCacheInfo.find("LODInfos")
32 35
@@ -37,6 +40,10 @@ class SliceScheme: @@ -37,6 +40,10 @@ class SliceScheme:
37 info_dict["resolution"] = float(info.find("Resolution").text) 40 info_dict["resolution"] = float(info.find("Resolution").text)
38 self.parameter[info.find("LevelID").text] =info_dict 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 @staticmethod 47 @staticmethod
41 def get_polygon(parameter,level,row,col): 48 def get_polygon(parameter,level,row,col):
42 level=int(level) 49 level=int(level)
@@ -54,7 +61,7 @@ class SliceScheme: @@ -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 level=int(level) 65 level=int(level)
59 row = int(row) 66 row = int(row)
60 col = int(col) 67 col = int(col)
@@ -3,20 +3,41 @@ @@ -3,20 +3,41 @@
3 #createtime: 2021/7/15 3 #createtime: 2021/7/15
4 #email: nheweijun@sina.com 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))  
  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()
注册登录 后发表评论