正在显示
14 个修改的文件
包含
341 行增加
和
80 行删除
@@ -4,29 +4,51 @@ | @@ -4,29 +4,51 @@ | ||
4 | #email: nheweijun@sina.com | 4 | #email: nheweijun@sina.com |
5 | 5 | ||
6 | 6 | ||
7 | -from app.models import Database,db | 7 | +from app.models import Database,db,Table,TableVacuate |
8 | 8 | ||
9 | 9 | ||
10 | from app.util.component.ApiTemplate import ApiTemplate | 10 | from app.util.component.ApiTemplate import ApiTemplate |
11 | +from app.util.component.PGUtil import PGUtil | ||
12 | +import configure | ||
13 | +from osgeo.ogr import DataSource | ||
14 | +from flask import current_app | ||
11 | class Api(ApiTemplate): | 15 | class Api(ApiTemplate): |
12 | api_name = "删除数据库" | 16 | api_name = "删除数据库" |
13 | def process(self): | 17 | def process(self): |
14 | - res ={} | 18 | + re ={} |
19 | + sys_ds = None | ||
15 | try: | 20 | try: |
16 | 21 | ||
17 | database = db.session.query(Database).filter_by(guid=self.para.get("guid")).one_or_none() | 22 | database = db.session.query(Database).filter_by(guid=self.para.get("guid")).one_or_none() |
23 | + sys_ds :DataSource= PGUtil.open_pg_data_source(1,configure.SQLALCHEMY_DATABASE_URI) | ||
18 | if database: | 24 | if database: |
25 | + # 删除table | ||
26 | + re_tables = Table.query.filter_by(database_guid=database.guid).all() | ||
27 | + for table in re_tables: | ||
28 | + re_tvs = TableVacuate.query.filter_by(table_guid=table.guid).all() | ||
29 | + for tv in re_tvs: | ||
30 | + db.session.delete(tv) | ||
31 | + try: | ||
32 | + sys_ds.DeleteLayer(tv.name) | ||
33 | + except: | ||
34 | + current_app.logger.warning("{}不存在".format(tv.name)) | ||
35 | + db.session.delete(table) | ||
19 | db.session.delete(database) | 36 | db.session.delete(database) |
37 | + | ||
20 | db.session.commit() | 38 | db.session.commit() |
21 | - res["msg"] = "数据库删除成功!" | ||
22 | - res["result"] = True | 39 | + re["result"] = True |
40 | + re["msg"] = "数据库删除成功!" | ||
23 | else: | 41 | else: |
24 | - res["msg"] = "数据库不存在!" | ||
25 | - res["result"] = False | 42 | + re["result"] = False |
43 | + re["msg"] = "数据库不存在!" | ||
26 | except Exception as e: | 44 | except Exception as e: |
27 | db.session.rollback() | 45 | db.session.rollback() |
46 | + sys_ds.RollbackTransaction() | ||
28 | raise e | 47 | raise e |
29 | - return res | 48 | + finally: |
49 | + if sys_ds: | ||
50 | + sys_ds.Destroy() | ||
51 | + return re | ||
30 | 52 | ||
31 | 53 | ||
32 | 54 |
@@ -17,6 +17,7 @@ from app.util.component.PGUtil import PGUtil | @@ -17,6 +17,7 @@ from app.util.component.PGUtil import PGUtil | ||
17 | from app.util.component.SQLUtil import SQLUtil | 17 | from app.util.component.SQLUtil import SQLUtil |
18 | from app.util.component.GeometryAdapter import GeometryAdapter | 18 | from app.util.component.GeometryAdapter import GeometryAdapter |
19 | from app.util.component.StructuredPrint import StructurePrint | 19 | from app.util.component.StructuredPrint import StructurePrint |
20 | +import configure | ||
20 | class Api(ApiTemplate): | 21 | class Api(ApiTemplate): |
21 | api_name = "注册数据库" | 22 | api_name = "注册数据库" |
22 | def process(self): | 23 | def process(self): |
@@ -57,7 +58,6 @@ class Api(ApiTemplate): | @@ -57,7 +58,6 @@ class Api(ApiTemplate): | ||
57 | elif not self.check_space(sqlalchemy_uri): | 58 | elif not self.check_space(sqlalchemy_uri): |
58 | res["msg"] = "数据不是空间数据库!" | 59 | res["msg"] = "数据不是空间数据库!" |
59 | return res | 60 | return res |
60 | - | ||
61 | else: | 61 | else: |
62 | this_time = datetime.datetime.now() | 62 | this_time = datetime.datetime.now() |
63 | database_guid = uuid.uuid1().__str__() | 63 | database_guid = uuid.uuid1().__str__() |
@@ -96,12 +96,8 @@ class Api(ApiTemplate): | @@ -96,12 +96,8 @@ class Api(ApiTemplate): | ||
96 | # 注册空间表 | 96 | # 注册空间表 |
97 | spatial_table_name,tables = self.register_spatial_table(pg_ds, database, this_time,db_tuple) | 97 | spatial_table_name,tables = self.register_spatial_table(pg_ds, database, this_time,db_tuple) |
98 | 98 | ||
99 | - #注册抽稀表 | ||
100 | - self.regiser_vacuate_table(pg_ds,tables,db_tuple) | ||
101 | - | ||
102 | #注册普通表 | 99 | #注册普通表 |
103 | self.register_common_table(this_time,database,spatial_table_name,db_tuple) | 100 | self.register_common_table(this_time,database,spatial_table_name,db_tuple) |
104 | - | ||
105 | pg_ds.Destroy() | 101 | pg_ds.Destroy() |
106 | 102 | ||
107 | 103 | ||
@@ -245,11 +241,11 @@ class Api(ApiTemplate): | @@ -245,11 +241,11 @@ class Api(ApiTemplate): | ||
245 | if l_name.__contains__("_vacuate_"): | 241 | if l_name.__contains__("_vacuate_"): |
246 | 242 | ||
247 | # 没有权限的表跳过 | 243 | # 没有权限的表跳过 |
248 | - if not PGUtil.check_table_privilege(l_name, "SELECT", db_tuple[0], pg_ds): | ||
249 | - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | ||
250 | - continue | 244 | + # if not PGUtil.check_table_privilege(l_name, "SELECT", db_tuple[0], pg_ds): |
245 | + # StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | ||
246 | + # continue | ||
251 | 247 | ||
252 | - base_layer_name=l_name.split("_vacuate_")[0] | 248 | + base_layer_name=l_name.split("_vacuate_")[1] |
253 | level = l_name.split("_")[-2] | 249 | level = l_name.split("_")[-2] |
254 | pixel_distance_str: str ="0" | 250 | pixel_distance_str: str ="0" |
255 | try: | 251 | try: |
@@ -15,7 +15,6 @@ import uuid | @@ -15,7 +15,6 @@ import uuid | ||
15 | from sqlalchemy.orm import Session | 15 | from sqlalchemy.orm import Session |
16 | from app.util.component.SQLUtil import SQLUtil | 16 | from app.util.component.SQLUtil import SQLUtil |
17 | from app.util.component.PGUtil import PGUtil | 17 | from app.util.component.PGUtil import PGUtil |
18 | -from app.util.component.ModelVisitor import ModelVisitor | ||
19 | from app.util.component.StructuredPrint import StructurePrint | 18 | from app.util.component.StructuredPrint import StructurePrint |
20 | from app.util.component.ApiTemplate import ApiTemplate | 19 | from app.util.component.ApiTemplate import ApiTemplate |
21 | from app.util.component.GeometryAdapter import GeometryAdapter | 20 | from app.util.component.GeometryAdapter import GeometryAdapter |
@@ -37,8 +36,6 @@ class Api(ApiTemplate): | @@ -37,8 +36,6 @@ class Api(ApiTemplate): | ||
37 | # 初始化task | 36 | # 初始化task |
38 | task_guid = uuid.uuid1().__str__() | 37 | task_guid = uuid.uuid1().__str__() |
39 | 38 | ||
40 | - # result = self.table_refresh(database) | ||
41 | - | ||
42 | refresh_process = multiprocessing.Process(target=self.table_refresh,args=(database,task_guid)) | 39 | refresh_process = multiprocessing.Process(target=self.table_refresh,args=(database,task_guid)) |
43 | refresh_process.start() | 40 | refresh_process.start() |
44 | 41 | ||
@@ -67,6 +64,7 @@ class Api(ApiTemplate): | @@ -67,6 +64,7 @@ class Api(ApiTemplate): | ||
67 | def table_refresh(self,database,task_guid): | 64 | def table_refresh(self,database,task_guid): |
68 | 65 | ||
69 | pg_ds =None | 66 | pg_ds =None |
67 | + sys_ds =None | ||
70 | data_session=None | 68 | data_session=None |
71 | result = {} | 69 | result = {} |
72 | sys_session = None | 70 | sys_session = None |
@@ -74,7 +72,7 @@ class Api(ApiTemplate): | @@ -74,7 +72,7 @@ class Api(ApiTemplate): | ||
74 | 72 | ||
75 | try: | 73 | try: |
76 | sys_session = PGUtil.get_db_session(configure.SQLALCHEMY_DATABASE_URI) | 74 | sys_session = PGUtil.get_db_session(configure.SQLALCHEMY_DATABASE_URI) |
77 | - | 75 | + sys_ds = PGUtil.open_pg_data_source(0,configure.SQLALCHEMY_DATABASE_URI) |
78 | 76 | ||
79 | this_time = datetime.datetime.now() | 77 | this_time = datetime.datetime.now() |
80 | database_guid = database.guid | 78 | database_guid = database.guid |
@@ -99,8 +97,6 @@ class Api(ApiTemplate): | @@ -99,8 +97,6 @@ class Api(ApiTemplate): | ||
99 | # 空间表处理完毕 | 97 | # 空间表处理完毕 |
100 | sys_session.commit() | 98 | sys_session.commit() |
101 | 99 | ||
102 | - # 处理抽稀表 | ||
103 | - self.deal_vacuate_table(pg_ds,sys_session, database.guid,db_tuple) | ||
104 | 100 | ||
105 | # 空间表处理完毕 | 101 | # 空间表处理完毕 |
106 | sys_session.commit() | 102 | sys_session.commit() |
@@ -168,6 +164,8 @@ class Api(ApiTemplate): | @@ -168,6 +164,8 @@ class Api(ApiTemplate): | ||
168 | data_session.close() | 164 | data_session.close() |
169 | if sys_session: | 165 | if sys_session: |
170 | sys_session.close() | 166 | sys_session.close() |
167 | + if sys_ds: | ||
168 | + sys_ds.Destroy() | ||
171 | return result | 169 | return result |
172 | 170 | ||
173 | def add_spatail_table(self,database,pg_ds,sys_session,spatial_tables_names,this_time,db_tuple): | 171 | def add_spatail_table(self,database,pg_ds,sys_session,spatial_tables_names,this_time,db_tuple): |
@@ -251,11 +249,11 @@ class Api(ApiTemplate): | @@ -251,11 +249,11 @@ class Api(ApiTemplate): | ||
251 | sys_session.add(column) | 249 | sys_session.add(column) |
252 | return db_tables_names | 250 | return db_tables_names |
253 | 251 | ||
254 | - def deal_vacuate_table(self,pg_ds,sys_session,database_guid,db_tuple): | 252 | + def deal_vacuate_table(self,sys_ds,sys_session,database_guid): |
255 | 253 | ||
256 | 254 | ||
257 | - for i in range(pg_ds.GetLayerCount()): | ||
258 | - layer: Layer = pg_ds.GetLayer(i) | 255 | + for i in range(sys_ds.GetLayerCount()): |
256 | + layer: Layer = sys_ds.GetLayer(i) | ||
259 | geom_column = layer.GetGeometryColumn() | 257 | geom_column = layer.GetGeometryColumn() |
260 | 258 | ||
261 | if not geom_column: | 259 | if not geom_column: |
@@ -266,12 +264,8 @@ class Api(ApiTemplate): | @@ -266,12 +264,8 @@ class Api(ApiTemplate): | ||
266 | if layer.GetName().__contains__("_vacuate_"): | 264 | if layer.GetName().__contains__("_vacuate_"): |
267 | l_name = layer.GetName() | 265 | l_name = layer.GetName() |
268 | 266 | ||
269 | - # 没有权限的表跳过 | ||
270 | - if not PGUtil.check_table_privilege(l_name, "SELECT", db_tuple[0], pg_ds): | ||
271 | - StructurePrint.print("用户{}对表{}没有select权限!".format(db_tuple[0], l_name), "warn") | ||
272 | - continue | 267 | + base_layer_name = l_name.split("_vacuate_")[0].split("_")[1] |
273 | 268 | ||
274 | - base_layer_name = l_name.split("_vacuate_")[0] | ||
275 | level = l_name.split("_")[-2] | 269 | level = l_name.split("_")[-2] |
276 | 270 | ||
277 | pixel_distance_str: str ="0" | 271 | pixel_distance_str: str ="0" |
@@ -132,7 +132,7 @@ class Api(ApiTemplate): | @@ -132,7 +132,7 @@ class Api(ApiTemplate): | ||
132 | 132 | ||
133 | layer = pg_ds.GetLayerByName(table.name) | 133 | layer = pg_ds.GetLayerByName(table.name) |
134 | 134 | ||
135 | - vacuate_process:VacuateProcess = VacuateProcess(layer, table.name, options,database.sqlalchemy_uri) | 135 | + vacuate_process:VacuateProcess = VacuateProcess(layer, table.guid, options) |
136 | 136 | ||
137 | 137 | ||
138 | for feature in layer: | 138 | for feature in layer: |
@@ -18,6 +18,7 @@ import uuid | @@ -18,6 +18,7 @@ import uuid | ||
18 | import configure | 18 | import configure |
19 | from osgeo.ogr import DataSource,Layer,Geometry | 19 | from osgeo.ogr import DataSource,Layer,Geometry |
20 | from osgeo import ogr | 20 | from osgeo import ogr |
21 | +from flask import current_app | ||
21 | 22 | ||
22 | class Api(ApiTemplate): | 23 | class Api(ApiTemplate): |
23 | api_name = "删除抽稀表" | 24 | api_name = "删除抽稀表" |
@@ -26,6 +27,7 @@ class Api(ApiTemplate): | @@ -26,6 +27,7 @@ class Api(ApiTemplate): | ||
26 | res = {} | 27 | res = {} |
27 | res["data"] = {} | 28 | res["data"] = {} |
28 | pg_ds = None | 29 | pg_ds = None |
30 | + sys_ds = None | ||
29 | try: | 31 | try: |
30 | table_guid = self.para.get("guid") | 32 | table_guid = self.para.get("guid") |
31 | table: Table = Table.query.filter_by(guid=table_guid).one_or_none() | 33 | table: Table = Table.query.filter_by(guid=table_guid).one_or_none() |
@@ -40,13 +42,9 @@ class Api(ApiTemplate): | @@ -40,13 +42,9 @@ class Api(ApiTemplate): | ||
40 | 42 | ||
41 | # 判断图层是否存在 | 43 | # 判断图层是否存在 |
42 | pg_ds :DataSource= PGUtil.open_pg_data_source(0,DES.decode(table.relate_database.sqlalchemy_uri)) | 44 | pg_ds :DataSource= PGUtil.open_pg_data_source(0,DES.decode(table.relate_database.sqlalchemy_uri)) |
43 | - layer = pg_ds.GetLayerByName(table.name) | 45 | + sys_ds :DataSource= PGUtil.open_pg_data_source(0,configure.SQLALCHEMY_DATABASE_URI) |
44 | 46 | ||
45 | - # 判断用户权限 | ||
46 | - # user, pw, host, port, database = PGUtil.get_info_from_sqlachemy_uri(DES.decode(table.relate_database.sqlalchemy_uri)) | ||
47 | - # query_role:Layer = pg_ds.ExecuteSQL("SELECT rolcreatedb FROM pg_roles WHERE rolname='{}'".format(user)) | ||
48 | - # if not query_role.GetFeature(0).GetField("rolcreatedb"): | ||
49 | - # raise Exception("用户不具备建表权限!") | 47 | + layer = pg_ds.GetLayerByName(table.name) |
50 | 48 | ||
51 | if not layer: | 49 | if not layer: |
52 | raise Exception("图层不存在!") | 50 | raise Exception("图层不存在!") |
@@ -58,9 +56,9 @@ class Api(ApiTemplate): | @@ -58,9 +56,9 @@ class Api(ApiTemplate): | ||
58 | for tv in tvs : | 56 | for tv in tvs : |
59 | db.session.delete(tv) | 57 | db.session.delete(tv) |
60 | try: | 58 | try: |
61 | - pg_ds.DeleteLayer(tv.name) | 59 | + sys_ds.DeleteLayer(tv.name) |
62 | except Exception as e : | 60 | except Exception as e : |
63 | - StructurePrint.print("抽稀图层不存在!","warn") | 61 | + current_app.logger.warning("抽稀图层不存在!") |
64 | db.session.commit() | 62 | db.session.commit() |
65 | res["result"] = True | 63 | res["result"] = True |
66 | 64 | ||
@@ -69,6 +67,8 @@ class Api(ApiTemplate): | @@ -69,6 +67,8 @@ class Api(ApiTemplate): | ||
69 | finally: | 67 | finally: |
70 | if pg_ds: | 68 | if pg_ds: |
71 | pg_ds.Destroy() | 69 | pg_ds.Destroy() |
70 | + if sys_ds: | ||
71 | + sys_ds.Destroy() | ||
72 | return res | 72 | return res |
73 | 73 | ||
74 | 74 |
@@ -25,8 +25,10 @@ class Api(ApiTemplate): | @@ -25,8 +25,10 @@ class Api(ApiTemplate): | ||
25 | if not table: | 25 | if not table: |
26 | raise Exception("数据不存在!") | 26 | raise Exception("数据不存在!") |
27 | tvs = TableVacuate.query.filter_by(table_guid=table_guid).all() | 27 | tvs = TableVacuate.query.filter_by(table_guid=table_guid).all() |
28 | - dat = collections.OrderedDict() | ||
29 | - if float(table.extent.split(",")[0])<180: | 28 | + dat = {} |
29 | + info = {} | ||
30 | + | ||
31 | + if float(table.extent.split(",")[0]) < 180: | ||
30 | grid_size = copy.copy(lonlat_gridsize) | 32 | grid_size = copy.copy(lonlat_gridsize) |
31 | else: | 33 | else: |
32 | grid_size = copy.copy(project_gridsize) | 34 | grid_size = copy.copy(project_gridsize) |
@@ -36,12 +38,13 @@ class Api(ApiTemplate): | @@ -36,12 +38,13 @@ class Api(ApiTemplate): | ||
36 | grid_size.reverse() | 38 | grid_size.reverse() |
37 | 39 | ||
38 | # 正在精华的任务 | 40 | # 正在精华的任务 |
39 | - task_running = Task.query.filter_by(task_type=2,table_guid=table_guid,state=0).all() | 41 | + task_running = Task.query.filter_by(task_type=2, table_guid=table_guid, state=0).all() |
40 | grid_running = [] | 42 | grid_running = [] |
41 | - | 43 | + |
42 | for t in task_running: | 44 | for t in task_running: |
43 | grid_running.extend(t.parameter.split(",")) | 45 | grid_running.extend(t.parameter.split(",")) |
44 | 46 | ||
47 | + info["type"] = "m" | ||
45 | for grid in grid_size: | 48 | for grid in grid_size: |
46 | if grid in now_grid: | 49 | if grid in now_grid: |
47 | dat[str(grid)] = 1 | 50 | dat[str(grid)] = 1 |
@@ -49,8 +52,14 @@ class Api(ApiTemplate): | @@ -49,8 +52,14 @@ class Api(ApiTemplate): | ||
49 | dat[str(grid)] = 0 | 52 | dat[str(grid)] = 0 |
50 | if str(grid) in grid_running: | 53 | if str(grid) in grid_running: |
51 | dat[str(grid)] = 2 | 54 | dat[str(grid)] = 2 |
55 | + # 特殊处理一下 | ||
56 | + if grid == 0.00008: | ||
57 | + dat["0.00008"] = dat[str(grid)] | ||
58 | + del dat[str(grid)] | ||
59 | + info["type"] = "d" | ||
60 | + info["info"] = dat | ||
52 | 61 | ||
53 | - res["data"] = json.dumps(dat) | 62 | + res["data"] = info |
54 | res["result"] = True | 63 | res["result"] = True |
55 | 64 | ||
56 | except Exception as e: | 65 | except Exception as e: |
@@ -121,13 +121,16 @@ class Api(ApiTemplate): | @@ -121,13 +121,16 @@ class Api(ApiTemplate): | ||
121 | 121 | ||
122 | pg_ds :DataSource= PGUtil.open_pg_data_source(1,DES.decode(database.sqlalchemy_uri)) | 122 | pg_ds :DataSource= PGUtil.open_pg_data_source(1,DES.decode(database.sqlalchemy_uri)) |
123 | 123 | ||
124 | + | ||
125 | + | ||
126 | + | ||
124 | # 创建抽稀过程 | 127 | # 创建抽稀过程 |
125 | options = ["OVERWRITE=yes", "GEOMETRY_NAME={}".format(PGUtil.get_geo_column(table.name,pg_session)), | 128 | options = ["OVERWRITE=yes", "GEOMETRY_NAME={}".format(PGUtil.get_geo_column(table.name,pg_session)), |
126 | "PRECISION=NO"] | 129 | "PRECISION=NO"] |
127 | 130 | ||
128 | layer = pg_ds.GetLayerByName(table.name) | 131 | layer = pg_ds.GetLayerByName(table.name) |
129 | 132 | ||
130 | - vacuate_process:VacuateProcess = VacuateProcess(layer, table.name, options,database.sqlalchemy_uri,grids) | 133 | + vacuate_process:VacuateProcess = VacuateProcess(layer, table.guid, options,database.sqlalchemy_uri,grids) |
131 | 134 | ||
132 | 135 | ||
133 | for feature in layer: | 136 | for feature in layer: |
@@ -233,7 +236,7 @@ class VacuateProcess: | @@ -233,7 +236,7 @@ class VacuateProcess: | ||
233 | this_gridsize=[] | 236 | this_gridsize=[] |
234 | 237 | ||
235 | 238 | ||
236 | - def __init__(self,layer:Layer,new_layer_name, options,sqlalchemy_uri,grids): | 239 | + def __init__(self,layer:Layer,table_guid, options,sqlalchemy_uri,grids): |
237 | 240 | ||
238 | #是空间图层才初始化 | 241 | #是空间图层才初始化 |
239 | if layer.GetExtent()[0] > 0 or layer.GetExtent()[0] < 0: | 242 | if layer.GetExtent()[0] > 0 or layer.GetExtent()[0] < 0: |
@@ -254,7 +257,9 @@ class VacuateProcess: | @@ -254,7 +257,9 @@ class VacuateProcess: | ||
254 | 257 | ||
255 | # 创建抽稀ds | 258 | # 创建抽稀ds |
256 | for l in range(self.max_level): | 259 | for l in range(self.max_level): |
257 | - pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, DES.decode(sqlalchemy_uri)) | 260 | + |
261 | + pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, configure.SQLALCHEMY_DATABASE_URI) | ||
262 | + # pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, DES.decode(sqlalchemy_uri)) | ||
258 | pg_ds_l.StartTransaction() | 263 | pg_ds_l.StartTransaction() |
259 | self.pg_ds_dict[l] = pg_ds_l | 264 | self.pg_ds_dict[l] = pg_ds_l |
260 | 265 | ||
@@ -271,8 +276,8 @@ class VacuateProcess: | @@ -271,8 +276,8 @@ class VacuateProcess: | ||
271 | 276 | ||
272 | if this_grid_len<1: | 277 | if this_grid_len<1: |
273 | grid_name = str(this_grid_len).split(".")[-1] | 278 | grid_name = str(this_grid_len).split(".")[-1] |
274 | - if this_grid_len.__eq__(0.000075): | ||
275 | - grid_name = "000075" | 279 | + if this_grid_len.__eq__(0.00008): |
280 | + grid_name = "00008" | ||
276 | else: | 281 | else: |
277 | grid_name = str(int(this_grid_len)) | 282 | grid_name = str(int(this_grid_len)) |
278 | 283 | ||
@@ -284,8 +289,10 @@ class VacuateProcess: | @@ -284,8 +289,10 @@ class VacuateProcess: | ||
284 | 289 | ||
285 | lev = this_grid_szie.index(this_grid_len) | 290 | lev = this_grid_szie.index(this_grid_len) |
286 | print("{}:{}".format(grid_name, lev)) | 291 | print("{}:{}".format(grid_name, lev)) |
287 | - vl = pg.CreateLayer("{}_vacuate_{}_{}".format(new_layer_name, lev, grid_name), layer.GetSpatialRef(), | ||
288 | - ogr.wkbUnknown, options) | 292 | + |
293 | + | ||
294 | + v_ln = "z{}_vacuate_{}_{}".format(table_guid,lev, grid_name) | ||
295 | + vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options) | ||
289 | # 抽稀表不需要属性 | 296 | # 抽稀表不需要属性 |
290 | # vl.CreateFields(schema) | 297 | # vl.CreateFields(schema) |
291 | self.vacuate_layers[l] = vl | 298 | self.vacuate_layers[l] = vl |
@@ -308,6 +315,13 @@ class VacuateProcess: | @@ -308,6 +315,13 @@ class VacuateProcess: | ||
308 | lat_extent = extent[3]-extent[2] | 315 | lat_extent = extent[3]-extent[2] |
309 | 316 | ||
310 | this_grid_len =self.vacuate_layers_gridsize[level] | 317 | this_grid_len =self.vacuate_layers_gridsize[level] |
318 | + #超大的直接加入 | ||
319 | + # if long_extent > 10*this_grid_len or lat_extent >10*this_grid_len: | ||
320 | + # vacuate_layer: Layer = self.vacuate_layers.get(level) | ||
321 | + # feat = ogr.Feature(vacuate_layer.GetLayerDefn()) | ||
322 | + # feat.SetGeometry(g) | ||
323 | + # vacuate_layer.CreateFeature(feat) | ||
324 | + # else: | ||
311 | 325 | ||
312 | row = int((center.GetY() - self.extent[2]) / this_grid_len) | 326 | row = int((center.GetY() - self.extent[2]) / this_grid_len) |
313 | col = int((center.GetX() - self.extent[0]) / this_grid_len) | 327 | col = int((center.GetX() - self.extent[0]) / this_grid_len) |
@@ -325,7 +339,14 @@ class VacuateProcess: | @@ -325,7 +339,14 @@ class VacuateProcess: | ||
325 | else: | 339 | else: |
326 | feat.SetGeometry(g) | 340 | feat.SetGeometry(g) |
327 | vacuate_layer.CreateFeature(feat) | 341 | vacuate_layer.CreateFeature(feat) |
328 | - self.fill_dict[key] += 1 | 342 | + self.fill_dict[key] += 1 |
343 | + #超大的还有机会 | ||
344 | + elif (long_extent > 10*this_grid_len or lat_extent >10*this_grid_len) and self.fill_dict[key]<5: | ||
345 | + vacuate_layer: Layer = self.vacuate_layers.get(level) | ||
346 | + feat = ogr.Feature(vacuate_layer.GetLayerDefn()) | ||
347 | + feat.SetGeometry(g) | ||
348 | + vacuate_layer.CreateFeature(feat) | ||
349 | + self.fill_dict[key] += 1 | ||
329 | 350 | ||
330 | def end(self): | 351 | def end(self): |
331 | for pg in self.pg_ds_dict.values(): | 352 | for pg in self.pg_ds_dict.values(): |
@@ -43,10 +43,6 @@ class Api(ApiTemplate): | @@ -43,10 +43,6 @@ class Api(ApiTemplate): | ||
43 | layer = pg_ds.GetLayerByName(table.name) | 43 | layer = pg_ds.GetLayerByName(table.name) |
44 | 44 | ||
45 | # 判断用户权限 | 45 | # 判断用户权限 |
46 | - user, pw, host, port, database = PGUtil.get_info_from_sqlachemy_uri(DES.decode(table.relate_database.sqlalchemy_uri)) | ||
47 | - query_role:Layer = pg_ds.ExecuteSQL("SELECT rolcreatedb FROM pg_roles WHERE rolname='{}'".format(user)) | ||
48 | - if not query_role.GetFeature(0).GetField("rolcreatedb"): | ||
49 | - raise Exception("用户不具备建表权限!") | ||
50 | 46 | ||
51 | if not layer: | 47 | if not layer: |
52 | raise Exception("图层不存在!") | 48 | raise Exception("图层不存在!") |
app/util/component/CopyData2.py
0 → 100644
1 | +# coding=utf-8 | ||
2 | +#author: 4N | ||
3 | +#createtime: 2021/6/11 | ||
4 | +#email: nheweijun@sina.com | ||
5 | +import copy | ||
6 | +from osgeo.ogr import * | ||
7 | +from osgeo import gdal,ogr | ||
8 | +import uuid | ||
9 | +import time | ||
10 | +import os | ||
11 | +import json | ||
12 | + | ||
13 | + | ||
14 | +def get_info_from_sqlachemy_uri(uri): | ||
15 | + parts = uri.split(":") | ||
16 | + user = parts[1][2:] | ||
17 | + | ||
18 | + password_list = parts[2].split("@") | ||
19 | + if password_list.__len__() > 2: | ||
20 | + password = "@".join(password_list[:-1]) | ||
21 | + else: | ||
22 | + password = parts[2].split("@")[0] | ||
23 | + host = parts[2].split("@")[-1] | ||
24 | + port = parts[3].split("/")[0] | ||
25 | + database = parts[3].split("/")[1] | ||
26 | + | ||
27 | + return user, password, host, port, database | ||
28 | + | ||
29 | +def open_pg_data_source(iswrite, uri): | ||
30 | + """ | ||
31 | + # 获取PostGIS数据源 | ||
32 | + :return: | ||
33 | + """ | ||
34 | + db_conn_tuple = get_info_from_sqlachemy_uri(uri) | ||
35 | + fn = "PG: user=%s password=%s host=%s port=%s dbname=%s " % db_conn_tuple | ||
36 | + driver = ogr.GetDriverByName("PostgreSQL") | ||
37 | + if driver is None: | ||
38 | + raise Exception("打开PostgreSQL驱动失败,可能是当前GDAL未支持PostgreSQL驱动!") | ||
39 | + ds = driver.Open(fn, iswrite) | ||
40 | + if ds is None: | ||
41 | + raise Exception("打开数据源失败!") | ||
42 | + return ds | ||
43 | + | ||
44 | + | ||
45 | +def move_digui(coords,offx,offy): | ||
46 | + if isinstance(coords[0],list): | ||
47 | + for coord in coords: | ||
48 | + move_digui(coord, offx, offy) | ||
49 | + else : | ||
50 | + coords[0] += offx | ||
51 | + coords[1] += offy | ||
52 | + | ||
53 | +def move(geo,offx,offy): | ||
54 | + | ||
55 | + | ||
56 | + geojson_str = geo.ExportToJson() | ||
57 | + geojson = json.loads(geojson_str) | ||
58 | + | ||
59 | + coords = geojson["coordinates"] | ||
60 | + move_digui(coords, offx, offy) | ||
61 | + og = ogr.CreateGeometryFromJson(json.dumps(geojson)) | ||
62 | + | ||
63 | + return og | ||
64 | + | ||
65 | + | ||
66 | +def copydata(bound,input,output): | ||
67 | + work_dir = os.path.dirname(os.path.abspath(__file__)) | ||
68 | + | ||
69 | + shp_driver: Driver = ogr.GetDriverByName("ESRI Shapefile") | ||
70 | + bound_ds : DataSource = shp_driver.Open(bound, 0) | ||
71 | + bound_layer :Layer = bound_ds.GetLayer(0) | ||
72 | + | ||
73 | + bf = bound_layer.GetNextFeature() | ||
74 | + bound_geom = bf.GetGeometryRef() | ||
75 | + | ||
76 | + | ||
77 | + | ||
78 | + gdb_driver: Driver = ogr.GetDriverByName("FileGDB") | ||
79 | + # gdb_ds: DataSource = gdb_driver.Open(gdb, 0) | ||
80 | + # layer: Layer = gdb_ds.GetLayerByName(layer_name) | ||
81 | + | ||
82 | + input_ds: DataSource = shp_driver.Open(input, 0) | ||
83 | + layer: Layer = input_ds.GetLayer(0) | ||
84 | + | ||
85 | + if not layer: | ||
86 | + raise Exception("打开数据失败!") | ||
87 | + | ||
88 | + | ||
89 | + output_ds: DataSource = gdb_driver.CreateDataSource(output) | ||
90 | + | ||
91 | + | ||
92 | + gdb_layer:Layer = output_ds.CreateLayer(layer.GetName(),layer.GetSpatialRef(),layer.GetGeomType()) | ||
93 | + | ||
94 | + gdb_layer.CreateFields(layer.schema) | ||
95 | + | ||
96 | + | ||
97 | + | ||
98 | + | ||
99 | + # | ||
100 | + bound_exent = bound_layer.GetExtent() | ||
101 | + | ||
102 | + layer_extent = layer.GetExtent() | ||
103 | + | ||
104 | + xxrange=layer_extent[1]-layer_extent[0] | ||
105 | + yrange = layer_extent[3]-layer_extent[2] | ||
106 | + | ||
107 | + | ||
108 | + left = (int((layer_extent[0] - bound_exent[0]) / xxrange) + 1) * (-1) | ||
109 | + right = int((bound_exent[1] - layer_extent[1]) / xxrange) + 1 | ||
110 | + up = int((bound_exent[3] - layer_extent[3]) / yrange) + 1 | ||
111 | + down = (int((layer_extent[2] - bound_exent[2]) / yrange) + 1) * (-1) | ||
112 | + | ||
113 | + | ||
114 | + begin = time.time() | ||
115 | + count=1 | ||
116 | + | ||
117 | + | ||
118 | + for f in layer: | ||
119 | + | ||
120 | + new_f = copy.copy(f) | ||
121 | + for xt in range(left,right+1,1): | ||
122 | + for yt in range(down,up+1,1): | ||
123 | + out_g = move(f.GetGeometryRef(),xxrange*xt,yrange*yt) | ||
124 | + | ||
125 | + if out_g.Intersect(bound_geom): | ||
126 | + out_g = out_g.Intersection(bound_geom) | ||
127 | + new_f.SetGeometry(out_g) | ||
128 | + new_f.SetFID(count) | ||
129 | + gdb_layer.CreateFeature(new_f) | ||
130 | + count += 1 | ||
131 | + if count % 10000 == 0: | ||
132 | + # print(count) | ||
133 | + with open(os.path.join(work_dir, "copy.txt"), "w") as fi: | ||
134 | + fi.write("已完成{}".format(count)) | ||
135 | + | ||
136 | + print(time.time()-begin) | ||
137 | + | ||
138 | + input_ds.Destroy() | ||
139 | + | ||
140 | +def envelop_2_polygon(env): | ||
141 | + ring = ogr.Geometry(ogr.wkbLinearRing) | ||
142 | + ring.AddPoint(env[0], env[2]) | ||
143 | + ring.AddPoint(env[0], env[3]) | ||
144 | + ring.AddPoint(env[1], env[3]) | ||
145 | + ring.AddPoint(env[1], env[2]) | ||
146 | + ring.AddPoint(env[0], env[2]) | ||
147 | + # Create polygon | ||
148 | + poly = ogr.Geometry(ogr.wkbPolygon) | ||
149 | + poly.AddGeometry(ring) | ||
150 | + return poly | ||
151 | + | ||
152 | +def clip(): | ||
153 | + | ||
154 | + input = r"E:\Data\copy\x.shp" | ||
155 | + output = r"E:\Data\copy\xianorigin.shp" | ||
156 | + gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8") | ||
157 | + shp_driver: Driver = ogr.GetDriverByName("ESRI Shapefile") | ||
158 | + | ||
159 | + input_ds: DataSource = shp_driver.Open(input, 0) | ||
160 | + layer: Layer = input_ds.GetLayer(0) | ||
161 | + | ||
162 | + bound_geo = envelop_2_polygon([112.84,112.952,22.914,22.985]) | ||
163 | + | ||
164 | + if not layer: | ||
165 | + raise Exception("打开数据失败!") | ||
166 | + | ||
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) | ||
171 | + for f in layer: | ||
172 | + new_f = copy.copy(f) | ||
173 | + out_g = f.GetGeometryRef() | ||
174 | + if out_g.Intersect(bound_geo): | ||
175 | + out_g = out_g.Intersection(bound_geo) | ||
176 | + new_f.SetGeometry(out_g) | ||
177 | + # new_f.UnsetField("OBJECTID") | ||
178 | + out_layer.CreateFeature(new_f) | ||
179 | + | ||
180 | + output_ds.Destroy() | ||
181 | + | ||
182 | + | ||
183 | + | ||
184 | +if __name__ == '__main__': | ||
185 | + # bound_shp = "E:\Data\广东边界\gdsample.shp" | ||
186 | + # input = r"E:\Data\copy\origin.shp" | ||
187 | + # output = r"E:\Data\copy\re.shp" | ||
188 | + # copydata(bound_shp,input,output) | ||
189 | + | ||
190 | + # bound_shp = "/root/CopyData/gdsample.shp" | ||
191 | + # input = r"/root/CopyData/origin.shp" | ||
192 | + # output = r"/root/CopyData/re.gdb" | ||
193 | + # copydata(bound_shp,input,output) | ||
194 | + clip() | ||
195 | + | ||
196 | + | ||
197 | + | ||
198 | + | ||
199 | + | ||
200 | + | ||
201 | + | ||
202 | + | ||
203 | + | ||
204 | + | ||
205 | + |
@@ -159,7 +159,7 @@ class EntryDataVacuate: | @@ -159,7 +159,7 @@ class EntryDataVacuate: | ||
159 | new_layer_name = None | 159 | new_layer_name = None |
160 | vacuate_process= None | 160 | vacuate_process= None |
161 | success = True | 161 | success = True |
162 | - | 162 | + table_guid = uuid.uuid1().__str__() |
163 | try: | 163 | try: |
164 | # 图层设置 | 164 | # 图层设置 |
165 | parameter = this_task.parameter | 165 | parameter = this_task.parameter |
@@ -200,7 +200,7 @@ class EntryDataVacuate: | @@ -200,7 +200,7 @@ class EntryDataVacuate: | ||
200 | pg_layer.CreateFields(schema) | 200 | pg_layer.CreateFields(schema) |
201 | 201 | ||
202 | #创建抽稀过程 | 202 | #创建抽稀过程 |
203 | - vacuate_process = VacuateProcess(layer,new_layer_name,options,this_task.database.sqlalchemy_uri) | 203 | + vacuate_process = VacuateProcess(layer,table_guid,options) |
204 | 204 | ||
205 | 205 | ||
206 | 206 | ||
@@ -235,7 +235,8 @@ class EntryDataVacuate: | @@ -235,7 +235,8 @@ class EntryDataVacuate: | ||
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 | - table_guid = this_task.register_table(pg_layer,new_layer_name,overwrite,parameter.get("creator"),is_vacuate) | 238 | + |
239 | + this_task.register_table(pg_layer,new_layer_name,overwrite,parameter.get("creator"),is_vacuate,table_guid) | ||
239 | 240 | ||
240 | # 注册抽稀表 | 241 | # 注册抽稀表 |
241 | this_task.register_table_vacuate(table_guid,vacuate_process.vacuate_layers) | 242 | this_task.register_table_vacuate(table_guid,vacuate_process.vacuate_layers) |
@@ -295,7 +296,7 @@ class ThisTask: | @@ -295,7 +296,7 @@ class ThisTask: | ||
295 | self.process_session.add(task_process) | 296 | self.process_session.add(task_process) |
296 | self.process_session.commit() | 297 | self.process_session.commit() |
297 | 298 | ||
298 | - def register_table(self, layer: Layer, new_layer_name, overwrite, creator,is_vacuate): | 299 | + def register_table(self, layer: Layer, new_layer_name, overwrite, creator,is_vacuate,table_guid): |
299 | ''' | 300 | ''' |
300 | 注册表 | 301 | 注册表 |
301 | :param layer: 图层 | 302 | :param layer: 图层 |
@@ -321,7 +322,7 @@ class ThisTask: | @@ -321,7 +322,7 @@ class ThisTask: | ||
321 | geom_type = GeometryAdapter.get_geometry_type(layer) | 322 | geom_type = GeometryAdapter.get_geometry_type(layer) |
322 | 323 | ||
323 | extent = "{},{},{},{}".format(ext[0], ext[1], ext[2], ext[3]) | 324 | extent = "{},{},{},{}".format(ext[0], ext[1], ext[2], ext[3]) |
324 | - table_guid = uuid.uuid1().__str__() | 325 | + |
325 | table = Table(guid=table_guid, | 326 | table = Table(guid=table_guid, |
326 | database_guid=self.database.guid, | 327 | database_guid=self.database.guid, |
327 | creator=creator, | 328 | creator=creator, |
@@ -419,7 +420,7 @@ class VacuateProcess: | @@ -419,7 +420,7 @@ class VacuateProcess: | ||
419 | this_gridsize=[] | 420 | this_gridsize=[] |
420 | 421 | ||
421 | 422 | ||
422 | - def __init__(self,layer:Layer,new_layer_name, options,sqlalchemy_uri): | 423 | + def __init__(self,layer:Layer,table_guid, options): |
423 | 424 | ||
424 | #是空间图层才初始化 | 425 | #是空间图层才初始化 |
425 | if layer.GetExtent()[0] > 0 or layer.GetExtent()[0] < 0: | 426 | if layer.GetExtent()[0] > 0 or layer.GetExtent()[0] < 0: |
@@ -466,6 +467,7 @@ class VacuateProcess: | @@ -466,6 +467,7 @@ class VacuateProcess: | ||
466 | self.t_grid_size=self.project_gridsize | 467 | self.t_grid_size=self.project_gridsize |
467 | else: | 468 | else: |
468 | self.t_grid_size = self.lonlat_gridsize | 469 | self.t_grid_size = self.lonlat_gridsize |
470 | + | ||
469 | for grid_size in self.t_grid_size: | 471 | for grid_size in self.t_grid_size: |
470 | # 最少抽稀个数 | 472 | # 最少抽稀个数 |
471 | if lc > self.least_vacuate_count: | 473 | if lc > self.least_vacuate_count: |
@@ -482,7 +484,8 @@ class VacuateProcess: | @@ -482,7 +484,8 @@ class VacuateProcess: | ||
482 | 484 | ||
483 | # 创建抽稀ds | 485 | # 创建抽稀ds |
484 | for l in range(self.max_level): | 486 | for l in range(self.max_level): |
485 | - pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, DES.decode(sqlalchemy_uri)) | 487 | + # pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, DES.decode(sqlalchemy_uri)) |
488 | + pg_ds_l: DataSource = PGUtil.open_pg_data_source(1, configure.SQLALCHEMY_DATABASE_URI) | ||
486 | pg_ds_l.StartTransaction() | 489 | pg_ds_l.StartTransaction() |
487 | self.pg_ds_dict[l] = pg_ds_l | 490 | self.pg_ds_dict[l] = pg_ds_l |
488 | 491 | ||
@@ -500,16 +503,19 @@ class VacuateProcess: | @@ -500,16 +503,19 @@ class VacuateProcess: | ||
500 | grid_name = str(this_grid_len) | 503 | grid_name = str(this_grid_len) |
501 | if this_grid_len<1: | 504 | if this_grid_len<1: |
502 | grid_name = str(this_grid_len).split(".")[-1] | 505 | grid_name = str(this_grid_len).split(".")[-1] |
503 | - if this_grid_len.__eq__(0.000075): | ||
504 | - grid_name = "000075" | 506 | + if this_grid_len.__eq__(0.00008): |
507 | + grid_name = "00008" | ||
505 | 508 | ||
506 | # 抽稀图层是点面混合的 | 509 | # 抽稀图层是点面混合的 |
507 | # 抽稀表有固定的命名规则 | 510 | # 抽稀表有固定的命名规则 |
508 | # 抽稀表一定要覆盖 | 511 | # 抽稀表一定要覆盖 |
509 | 512 | ||
510 | 513 | ||
511 | - vl = pg.CreateLayer("{}_vacuate_{}_{}".format(new_layer_name, self.t_grid_size.index(this_grid_len), grid_name), layer.GetSpatialRef(), | ||
512 | - ogr.wkbUnknown, options) | 514 | + print("{}:{}".format(self.t_grid_size.index(this_grid_len),this_grid_len)) |
515 | + | ||
516 | + | ||
517 | + v_ln = "z{}_vacuate_{}_{}".format(table_guid, self.t_grid_size.index(this_grid_len), grid_name) | ||
518 | + vl = pg.CreateLayer(v_ln, layer.GetSpatialRef(),ogr.wkbUnknown, options) | ||
513 | # 抽稀表不需要属性 | 519 | # 抽稀表不需要属性 |
514 | # vl.CreateFields(schema) | 520 | # vl.CreateFields(schema) |
515 | self.vacuate_layers[l] = vl | 521 | self.vacuate_layers[l] = vl |
@@ -532,6 +538,13 @@ class VacuateProcess: | @@ -532,6 +538,13 @@ class VacuateProcess: | ||
532 | lat_extent = extent[3]-extent[2] | 538 | lat_extent = extent[3]-extent[2] |
533 | 539 | ||
534 | this_grid_len =self.vacuate_layers_gridsize[level] | 540 | this_grid_len =self.vacuate_layers_gridsize[level] |
541 | + #超大的直接加入 | ||
542 | + # if long_extent > 10*this_grid_len or lat_extent >10*this_grid_len: | ||
543 | + # vacuate_layer: Layer = self.vacuate_layers.get(level) | ||
544 | + # feat = ogr.Feature(vacuate_layer.GetLayerDefn()) | ||
545 | + # feat.SetGeometry(g) | ||
546 | + # vacuate_layer.CreateFeature(feat) | ||
547 | + # else: | ||
535 | 548 | ||
536 | row = int((center.GetY() - self.extent[2]) / this_grid_len) | 549 | row = int((center.GetY() - self.extent[2]) / this_grid_len) |
537 | col = int((center.GetX() - self.extent[0]) / this_grid_len) | 550 | col = int((center.GetX() - self.extent[0]) / this_grid_len) |
@@ -549,7 +562,14 @@ class VacuateProcess: | @@ -549,7 +562,14 @@ class VacuateProcess: | ||
549 | else: | 562 | else: |
550 | feat.SetGeometry(g) | 563 | feat.SetGeometry(g) |
551 | vacuate_layer.CreateFeature(feat) | 564 | vacuate_layer.CreateFeature(feat) |
552 | - self.fill_dict[key] += 1 | 565 | + self.fill_dict[key] += 1 |
566 | + #超大的还有机会 | ||
567 | + elif (long_extent > 10*this_grid_len or lat_extent >10*this_grid_len) and self.fill_dict[key]<5: | ||
568 | + vacuate_layer: Layer = self.vacuate_layers.get(level) | ||
569 | + feat = ogr.Feature(vacuate_layer.GetLayerDefn()) | ||
570 | + feat.SetGeometry(g) | ||
571 | + vacuate_layer.CreateFeature(feat) | ||
572 | + self.fill_dict[key] += 1 | ||
553 | 573 | ||
554 | def end(self): | 574 | def end(self): |
555 | for pg in self.pg_ds_dict.values(): | 575 | for pg in self.pg_ds_dict.values(): |
app/util/component/copy.txt
0 → 100644
1 | +メムヘノ20000 |
@@ -355,6 +355,9 @@ IncludeOptional conf.d/*.conf | @@ -355,6 +355,9 @@ IncludeOptional conf.d/*.conf | ||
355 | LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so" | 355 | LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so" |
356 | "/var/gdal" | 356 | "/var/gdal" |
357 | 357 | ||
358 | + dmapmanager processes=4 threads=16 display-name=%{GROUP} | ||
359 | + dmapmanager | ||
360 | + | ||
358 | / /usr/src/app/run.wsgi | 361 | / /usr/src/app/run.wsgi |
359 | <Directory /usr/> | 362 | <Directory /usr/> |
360 | Require all granted | 363 | Require all granted |
@@ -19,15 +19,5 @@ import json | @@ -19,15 +19,5 @@ import json | ||
19 | # print(sys.getsizeof(json.dumps(pixel_array.tolist()))) | 19 | # print(sys.getsizeof(json.dumps(pixel_array.tolist()))) |
20 | # print(sys.getsizeof((content))) | 20 | # print(sys.getsizeof((content))) |
21 | 21 | ||
22 | -def c(dd): | ||
23 | - return 1 | ||
24 | - | ||
25 | -dd = numpy.zeros((2000, 2000), dtype=int) + 2 | ||
26 | - | ||
27 | - | ||
28 | -dd[range(0, 5), 1]=1 | ||
29 | - | ||
30 | - | ||
31 | - | ||
32 | - | ||
33 | -print(dd) | ||
22 | +for x in range(-3,3,1): | ||
23 | + print(x) |
请
注册
或
登录
后发表评论