提交 6f523f46463309e42a149216d39034e7d9418384

作者 nheweijun
1 个父辈 adc1dc44

优化抽稀功能,超大的图形可以额外加入到抽稀图层中

... ... @@ -107,44 +107,48 @@ class Api(ApiTemplate):
107 107 for i in range(pg_ds.GetLayerCount()):
108 108 layer: Layer = pg_ds.GetLayer(i)
109 109 l_name = layer.GetName()
  110 + try:
110 111
111   - # 只注册public的空间表,其他表空间的表名会有.
112   - if layer.GetName().__contains__("."):
113   - continue
114   -
115   - # 不注册抽稀表
116   - if layer.GetName().__contains__("_vacuate_"):
117   - spatial_table_name.append(layer.GetName())
118   - continue
  112 + # 只注册public的空间表,其他表空间的表名会有.
  113 + if layer.GetName().__contains__("."):
  114 + continue
119 115
120   - # 没有权限的表跳过
121   - if not PGUtil.check_table_privilege(l_name,"SELECT",db_tuple[0],pg_ds):
122   - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0],l_name),"warn")
123   - continue
  116 + # 不注册抽稀表
  117 + if layer.GetName().__contains__("_vacuate_"):
  118 + spatial_table_name.append(layer.GetName())
  119 + continue
124 120
125   - # 范围统计和数量统计以100w为界限
126   - query_count_layer: Layer = pg_ds.ExecuteSQL(
127   - '''SELECT reltuples::bigint AS ec FROM pg_class WHERE oid = 'public."{}"'::regclass'''.format(l_name))
  121 + # 没有权限的表跳过
  122 + if not PGUtil.check_table_privilege(l_name,"SELECT",db_tuple[0],pg_ds):
  123 + StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0],l_name),"warn")
  124 + continue
128 125
129   - feature_count = query_count_layer.GetFeature(0).GetField("ec")
130   - # 要素少于100w可以精确统计
131   - if feature_count < 1000000:
132   - feature_count = layer.GetFeatureCount()
133   - ext = layer.GetExtent()
134   - else:
135   - query_ext_layer: Layer = pg_ds.ExecuteSQL(
136   - "select geometry(ST_EstimatedExtent('public', '{}','{}'))".format(l_name,
137   - layer.GetGeometryColumn()))
138   - ext = query_ext_layer.GetExtent()
139   - if ext[0] < 360:
140   - ext = [round(e, 6) for e in ext]
141   - else:
142   - ext = [round(e, 2) for e in ext]
143   - extent = "{},{},{},{}".format(ext[0], ext[1], ext[2], ext[3])
  126 + # 范围统计和数量统计以100w为界限
  127 + query_count_layer: Layer = pg_ds.ExecuteSQL(
  128 + '''SELECT reltuples::bigint AS ec FROM pg_class WHERE oid = 'public."{}"'::regclass'''.format(l_name))
  129 +
  130 + feature_count = query_count_layer.GetFeature(0).GetField("ec")
  131 + # 要素少于100w可以精确统计
  132 + if feature_count < 1000000:
  133 + feature_count = layer.GetFeatureCount()
  134 + ext = layer.GetExtent()
  135 + else:
  136 + query_ext_layer: Layer = pg_ds.ExecuteSQL(
  137 + "select geometry(ST_EstimatedExtent('public', '{}','{}'))".format(l_name,
  138 + layer.GetGeometryColumn()))
  139 + ext = query_ext_layer.GetExtent()
  140 + if ext[0] < 360:
  141 + ext = [round(e, 6) for e in ext]
  142 + else:
  143 + ext = [round(e, 2) for e in ext]
  144 + extent = "{},{},{},{}".format(ext[0], ext[1], ext[2], ext[3])
144 145
145   - table_guid = uuid.uuid1().__str__()
  146 + table_guid = uuid.uuid1().__str__()
146 147
147   - geom_type = GeometryAdapter.get_geometry_type(layer)
  148 + geom_type = GeometryAdapter.get_geometry_type(layer)
  149 + except:
  150 + StructurePrint.print("表{}注册失败!".format(l_name), "warn")
  151 + continue
148 152
149 153 table = Table(guid=table_guid,
150 154 database_guid=database.guid,
... ...
... ... @@ -14,12 +14,15 @@ from app.models import db
14 14 from app.util.component.ApiTemplate import ApiTemplate
15 15
16 16 from app.util.component.PGUtil import PGUtil
  17 +import configure
  18 +from flask import current_app
17 19 class Api(ApiTemplate):
18 20 api_name = "删除表"
19 21 def process(self):
20 22
21 23 res = {}
22 24 pg_ds = None
  25 + sys_ds = None
23 26 try:
24 27
25 28 table_guid = self.para.get("guid")
... ... @@ -45,14 +48,22 @@ class Api(ApiTemplate):
45 48
46 49
47 50 pg_ds: DataSource = PGUtil.open_pg_data_source(1, DES.decode(database.sqlalchemy_uri))
48   -
  51 + sys_ds: DataSource = PGUtil.open_pg_data_source(1, configure.SQLALCHEMY_DATABASE_URI)
49 52
50 53 #删除抽稀表
51 54 vacuate_tables=table.relate_table_vacuates.all()
52 55 for vt in vacuate_tables:
53   - pg_ds.DeleteLayer(vt.name)
  56 + db.session.delete(vt)
  57 + try:
  58 + sys_ds.DeleteLayer(vt.name)
  59 + except:
  60 + current_app.logger.warning("{}不存在!".format(vt.name))
  61 +
  62 + try:
  63 + pg_ds.DeleteLayer(table.name)
  64 + except:
  65 + current_app.logger.warning("{}不存在!".format(table.name))
54 66
55   - pg_ds.DeleteLayer(table.name)
56 67
57 68 # 删除元数据
58 69
... ... @@ -65,6 +76,8 @@ class Api(ApiTemplate):
65 76 finally:
66 77 if pg_ds:
67 78 pg_ds.Destroy()
  79 + if sys_ds:
  80 + sys_ds.Destroy()
68 81 return res
69 82
70 83 api_doc={
... ...
... ... @@ -13,10 +13,10 @@ class Api(ApiTemplate):
13 13 res = {}
14 14 try:
15 15 table_guid = self.para.get("guid")
16   - table = Table.query.filter_by(guid=table_guid)
17   - if not table.one_or_none():
  16 + table = Table.query.filter_by(guid=table_guid).one_or_none()
  17 + if not table:
18 18 raise Exception("数据不存在!")
19   - table = table.one_or_none()
  19 +
20 20 columns = table.relate_columns.order_by(Columns.name).all()
21 21 res["data"]=ModelVisitor.table_to_json(table)
22 22 res["data"]["columns"] = ModelVisitor.objects_to_jsonarray(columns)
... ...
... ... @@ -189,43 +189,47 @@ class Api(ApiTemplate):
189 189 if layer.GetName() not in spatial_tables_names:
190 190 l_name = layer.GetName()
191 191
192   - # 只注册public的空间表,其他表空间的表名会有.
193   - if layer.GetName().__contains__("."):
194   - continue
195   - # 略过抽稀表
196   - if layer.GetName().__contains__("_vacuate_"):
197   - continue
198   -
199   - # 没有权限的表跳过
200   - if not PGUtil.check_table_privilege(l_name, "SELECT", db_tuple[0], pg_ds):
201   - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn")
202   - continue
203   -
204   -
205   - # 范围统计和数量统计以100w为界限
206   - query_count_layer: Layer = pg_ds.ExecuteSQL(
207   - '''SELECT reltuples::bigint AS ec FROM pg_class WHERE oid = 'public."{}"'::regclass'''.format(
208   - l_name))
  192 + try:
  193 + # 只注册public的空间表,其他表空间的表名会有.
  194 + if layer.GetName().__contains__("."):
  195 + continue
  196 + # 略过抽稀表
  197 + if layer.GetName().__contains__("_vacuate_"):
  198 + continue
209 199
210   - feature_count = query_count_layer.GetFeature(0).GetField("ec")
211   - # 要素少于100w可以精确统计
212   - if feature_count < 1000000:
213   - feature_count = layer.GetFeatureCount()
214   - ext = layer.GetExtent()
215   - else:
216   - query_ext_layer: Layer = pg_ds.ExecuteSQL(
217   - "select geometry(ST_EstimatedExtent('public', '{}','{}'))".format(l_name,
218   - layer.GetGeometryColumn()))
219   - ext = query_ext_layer.GetExtent()
220   - if ext[0] < 360:
221   - ext = [round(e, 6) for e in ext]
222   - else:
223   - ext = [round(e, 2) for e in ext]
224   - extent = "{},{},{},{}".format(ext[0], ext[1], ext[2], ext[3])
  200 + # 没有权限的表跳过
  201 + if not PGUtil.check_table_privilege(l_name, "SELECT", db_tuple[0], pg_ds):
  202 + StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn")
  203 + continue
225 204
226   - StructurePrint.print("空间表增加!")
227 205
228   - geom_type = GeometryAdapter.get_geometry_type(layer)
  206 + # 范围统计和数量统计以100w为界限
  207 + query_count_layer: Layer = pg_ds.ExecuteSQL(
  208 + '''SELECT reltuples::bigint AS ec FROM pg_class WHERE oid = 'public."{}"'::regclass'''.format(
  209 + l_name))
  210 +
  211 + feature_count = query_count_layer.GetFeature(0).GetField("ec")
  212 + # 要素少于100w可以精确统计
  213 + if feature_count < 1000000:
  214 + feature_count = layer.GetFeatureCount()
  215 + ext = layer.GetExtent()
  216 + else:
  217 + query_ext_layer: Layer = pg_ds.ExecuteSQL(
  218 + "select geometry(ST_EstimatedExtent('public', '{}','{}'))".format(l_name,
  219 + layer.GetGeometryColumn()))
  220 + ext = query_ext_layer.GetExtent()
  221 + if ext[0] < 360:
  222 + ext = [round(e, 6) for e in ext]
  223 + else:
  224 + ext = [round(e, 2) for e in ext]
  225 + extent = "{},{},{},{}".format(ext[0], ext[1], ext[2], ext[3])
  226 +
  227 + StructurePrint.print("空间表增加!")
  228 +
  229 + geom_type = GeometryAdapter.get_geometry_type(layer)
  230 + except:
  231 + StructurePrint.print("表{}注册失败!".format(l_name), "warn")
  232 + continue
229 233
230 234 table_guid = uuid.uuid1().__str__()
231 235 table = Table(guid=table_guid,
... ...
... ... @@ -293,8 +293,8 @@ class VacuateProcess:
293 293
294 294 v_ln = "z{}_vacuate_{}_{}".format(table_guid,lev, grid_name)
295 295 vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options)
296   - # 抽稀表不需要属性
297   - # vl.CreateFields(schema)
  296 + # 抽稀表需要属性
  297 + vl.CreateFields(layer.schema)
298 298 self.vacuate_layers[l] = vl
299 299
300 300 else:
... ...
... ... @@ -165,19 +165,20 @@ def clip():
165 165 raise Exception("打开数据失败!")
166 166
167 167 output_ds: DataSource = shp_driver.CreateDataSource(output)
168   -
169   - out_layer: Layer = output_ds.CreateLayer(layer.GetName(), layer.GetSpatialRef(), layer.GetGeomType())
170   - out_layer.CreateFields(layer.schema)
  168 + #
  169 + # out_layer: Layer = output_ds.CreateLayer(layer.GetName(), layer.GetSpatialRef(), layer.GetGeomType())
  170 + # out_layer.CreateFields(layer.schema)
171 171 for f in layer:
172   - new_f = copy.copy(f)
  172 + new_f:Feature = copy.copy(f)
173 173 out_g = f.GetGeometryRef()
174 174 if out_g.Intersect(bound_geo):
175 175 out_g = out_g.Intersection(bound_geo)
176 176 new_f.SetGeometry(out_g)
  177 + new_f.SetField("ttt",1)
177 178 # new_f.UnsetField("OBJECTID")
178   - out_layer.CreateFeature(new_f)
  179 + # out_layer.CreateFeature(new_f)
179 180
180   - output_ds.Destroy()
  181 + # output_ds.Destroy()
181 182
182 183
183 184
... ... @@ -186,7 +187,7 @@ if __name__ == '__main__':
186 187 # input = r"E:\Data\copy\origin.shp"
187 188 # output = r"E:\Data\copy\re.shp"
188 189 # copydata(bound_shp,input,output)
189   -
  190 + #
190 191 # bound_shp = "/root/CopyData/gdsample.shp"
191 192 # input = r"/root/CopyData/origin.shp"
192 193 # output = r"/root/CopyData/re.gdb"
... ...
... ... @@ -157,7 +157,7 @@ class EntryDataVacuate:
157 157
158 158 # this_task.pg_ds.StartTransaction()
159 159 new_layer_name = None
160   - vacuate_process= None
  160 + # vacuate_process= None
161 161 success = True
162 162 table_guid = uuid.uuid1().__str__()
163 163 try:
... ... @@ -200,7 +200,7 @@ class EntryDataVacuate:
200 200 pg_layer.CreateFields(schema)
201 201
202 202 #创建抽稀过程
203   - vacuate_process = VacuateProcess(layer,table_guid,options)
  203 + # vacuate_process = VacuateProcess(layer,table_guid,options)
204 204
205 205
206 206
... ... @@ -229,17 +229,18 @@ class EntryDataVacuate:
229 229 pg_layer.CreateFeature(out_feature)
230 230
231 231 #插入抽稀图层
232   - if out_geom is not None:
233   - vacuate_process.vacuate(out_geom)
  232 + # if out_geom is not None:
  233 + # vacuate_process.vacuate(out_geom)
234 234
235 235 # 注册图层信息
236 236 # 是否抽吸过
237   - is_vacuate = 1 if vacuate_process.max_level>0 else 0
  237 + # is_vacuate = 1 if vacuate_process.max_level>0 else 0
  238 + is_vacuate = 0
238 239
239 240 this_task.register_table(pg_layer,new_layer_name,overwrite,parameter.get("creator"),is_vacuate,table_guid)
240 241
241 242 # 注册抽稀表
242   - this_task.register_table_vacuate(table_guid,vacuate_process.vacuate_layers)
  243 + # this_task.register_table_vacuate(table_guid,vacuate_process.vacuate_layers)
243 244
244 245 this_task.write_process("{}图层入库成功。".format(new_layer_name))
245 246
... ... @@ -249,11 +250,12 @@ class EntryDataVacuate:
249 250 StructurePrint.print("{}入库失败,数据回滚!原因:{}".format(new_layer_name,e.__str__()), "error")
250 251 print(traceback.format_exc())
251 252 # 抽稀回滚
252   - vacuate_process.rollback()
  253 + # vacuate_process.rollback()
253 254 success =False
254 255
255 256 finally:
256   - vacuate_process.end()
  257 + # vacuate_process.end()
  258 + pass
257 259 return success,new_layer_name
258 260
259 261
... ... @@ -516,8 +518,8 @@ class VacuateProcess:
516 518
517 519 v_ln = "z{}_vacuate_{}_{}".format(table_guid, self.t_grid_size.index(this_grid_len), grid_name)
518 520 vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options)
519   - # 抽稀表不需要属性
520   - # vl.CreateFields(schema)
  521 + # 抽稀表需要属性
  522 + vl.CreateFields(layer.schema)
521 523 self.vacuate_layers[l] = vl
522 524
523 525 else:
... ...
... ... @@ -3,11 +3,17 @@
3 3 #createtime: 2021/5/17
4 4 #email: nheweijun@sina.com
5 5 import datetime
6   -
  6 +import os
7 7
8 8 class StructurePrint:
9 9
  10 + log_file = os.path.join(os.path.dirname(
  11 + os.path.dirname(
  12 + os.path.dirname(
  13 + os.path.dirname(
  14 + os.path.realpath(__file__))))), "logs", "log.txt")
10 15 @classmethod
11 16 def print(cls,mes, type="info"):
12   - message = "[{}] {} {}".format(type.upper(), datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), mes)
13   - print(message)
  17 + with open(cls.log_file,"a",encoding="utf-8") as f:
  18 + message = "[{}] {} {}\n".format(type.upper(), datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), mes)
  19 + f.write(message)
... ...
... ... @@ -4,9 +4,11 @@
4 4 deploy_ip_host = "172.26.99.160:8840"
5 5 # 系统数据库
6 6
7   -# SQLALCHEMY_DATABASE_URI = "postgresql://postgres:postgres@172.26.40.254:5433/dmap_dms_test"
8 7 SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.99.160:5432/dmap_dms_test"
9 8
  9 +# 指定精华表所在位置(必须为空间库),设置为None则存放在各自的实体库中
  10 +VACUATE_DB_URI = None
  11 +# VACUATE_DB_URI = SQLALCHEMY_DATABASE_URI
10 12
11 13 # 部署模式cluster,standalone
12 14 deployment_mode = "cluster"
... ...
1   -4N
2   -4N
\ No newline at end of file
注册登录 后发表评论