123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- # -*- coding: utf-8 -*-
- import os
- import sys
- import log
- import uuid
- import utils
- import json
- import copy
- import io
- import gc
- # import importlib
- import appconfig
- import zbmx.modelFlow
- import zbmx.arcTools
- import zbmx.resultTools
- import arcpy
- import db.postgresql as db
- from arcpy import env
- from db.postgresql import Postgresql
- import importlib, sys
- importlib.reload(sys)
- class ModelBuider:
- def __init__(self, data):
- # 数据库
- self.model = data
- self.db = Postgresql(appconfig.DB_CONN)
- self.load()
- time = utils.getNowTimeStr();
- gdbName = "{0}_{1}.gdb".format(time, data["bsm"]);
- self.root = os.path.dirname(os.path.abspath(__file__))
- self.path = os.path.join(self.root, "out");
- self.outGdb = os.path.join(self.path, gdbName)
- if not os.path.exists(self.path):
- os.makedirs(self.path)
- arcpy.CreateFileGDB_management(self.path, gdbName)
- # 输出文件夹里面已经有内容的,就覆盖掉
- env.overwriteOutput = True
- # 设置工作空间
- # env.workspace = appconfig.SDE["KJGH_QY"]
- def load(self):
- '''加载数据-行政区'''
- sql = "SELECT substr(XZQDM,0,6) as \"XZQDM\",XZQMC as \"XZQMC\" FROM KJGH.XZQXS";
- if self.model['xzqbm'] != '' and self.model['xzqbm'] != None:
- sql += " WHERE substr(XZQDM,0,6) LIKE '{0}%'".format(self.model['xzqbm'][0:6])
- xzq = self.db.query(sql)
- if self.model['xzqbm'] == '':
- xzqds = {}
- xzqds["XZQDM"] = "1506"
- xzqds["XZQMC"] = "鄂尔多斯市"
- xzq.append(xzqds)
- self.xzq = xzq
- def initData(self):
- '''清空数据'''
- temp = utils.toJson(self.model["mxcs"])
- self.nodes = temp["nodeDataArray"] # 节点
- self.links = temp["linkDataArray"] # 关系
- def run(self):
- '''执行'''
- log.info('开始')
- self.runLog("info", "开始执行模型运算")
- self.xzqbm = '1506'
- self.xzqmc = '鄂尔多斯市'
- # 先把市的算出来,然后在分
- log.info("然后在分")
- self.initData()
- self.runLog("info", "初始化数据")
- log.info("初始化数据")
- self.xzqgl()
- log.info("xzqgl")
- self.analysis()
- log.info("analysis")
- self.result()
- log.info("result")
- self.xzjs()
- log.info('结束')
- print("####OK####" + self.outGdb)
- self.db.close()
- def xzjs(self):
- self.runLog("info", "按行政区进行分别统计结果")
- for x in self.xzq:
- self.xzqbm = x["XZQDM"]
- self.xzqmc = x["XZQMC"]
- self.runLog("info", self.xzqbm + "统计结果")
- log.info("行政区>>>" + self.xzqbm)
- inList = [{
- "key": self.xzqbm,
- "text": "行政区",
- "category": "sjy",
- "sjylx": "KJGH",
- "sjy": "XZQXS"
- }]
- comObj = {
- "key": "xzq",
- "text": "条件筛选",
- "category": "jsfs",
- "tool": "Select_analysis",
- "gltj": "XZQDM LIKE '{0}%'".format(self.xzqbm)
- }
- xzq = arcTools.Select_analysis(inList, comObj, self.outGdb, self.xzqbm)
- xzqObj = {
- "category": "sjy_xzq",
- "key": "xzq",
- "sjy": xzq,
- }
- # 把所有记算的数据切一下
- scfs = filter(modelFlow.filterScfs, self.nodes)
- for comObj in scfs:
- lins = modelFlow.getLink(comObj["key"], self.links)
- inList = []
- for x in lins:
- node = copy.deepcopy(modelFlow.getKey(self.nodes, x))
- node["sjy"] = arcTools.Intersect_analysis([node, xzqObj], None, self.outGdb, self.xzqbm)
- inList.append(node)
- # zb = resultTools.Area_proportion(inList, comObj, self.outGdb)
- zb = eval("resultTools.{0}".format(comObj["tool"]))(inList, comObj, self.outGdb, self.xzqbm)
- gc.collect()
- # 入库
- self.insertdb(zb)
- def xzqgl(self):
- '''行政区过滤'''
- sjy = filter(modelFlow.filterSjy, self.nodes)
- inList = [{
- "key": self.xzqbm,
- "text": "行政区",
- "category": "sjy",
- "sjylx": "KJGH",
- "sjy": "XZQXS"
- }]
- comObj = {
- "key": "xzq",
- "text": "条件筛选",
- "category": "jsfs",
- "tool": "Select_analysis",
- "gltj": "XZQDM LIKE '{0}%'".format(self.xzqbm)
- }
- xzq = arcTools.Select_analysis(inList, comObj, self.outGdb, self.xzqbm)
- for in_node in sjy:
- self.runLog("info", "行政区过滤{0}数据源".format(in_node["text"]))
- # 有条件先过滤
- if in_node["gltj"] != "":
- in_node['sjy'] = arcTools.Select_analysis([in_node], {"gltj": in_node["gltj"]}, self.outGdb, self.xzqbm)
- in_node['category'] = "sjy_gl"
- in2 = [
- in_node,
- {
- "category": "sjy_xzq",
- "key": "xzq",
- "sjy": xzq,
- }
- ]
- in_node['sjy'] = arcTools.Intersect_analysis(in2, None, self.outGdb, self.xzqbm)
- in_node['category'] = "sjy_xzq"
- in_node['xzq'] = xzq
- def analysis(self):
- '''计算分析'''
- jsfs = filter(modelFlow.filterJsfs, self.nodes)
- tempOut = []
- index = 0
- while True:
- if len(jsfs) == 0:
- break
- comObj = jsfs[index]
- lins = modelFlow.getLink(comObj["key"], self.links)
- inList = []
- isRun = True
- indata = ""
- for x in lins:
- node = modelFlow.getKey(self.nodes, x)
- if node['category'] == 'sjy' or node.get('sjy') != None:
- inList.append(node)
- indata += node["text"] + "、"
- else:
- isRun = False
- break
- if isRun:
- self.runLog("info", "{0}执行{1}分析".format(indata, comObj["text"]))
- data = eval("arcTools.{0}".format(comObj["tool"]))(inList, comObj, self.outGdb, self.xzqbm) # 空间分析
- comObj["sjy"] = data
- del jsfs[index]
- index = 0
- else:
- index += 1
- def result(self):
- '''结果输出'''
- scfs = filter(modelFlow.filterScfs, self.nodes)
- for comObj in scfs:
- lins = modelFlow.getLink(comObj["key"], self.links)
- inList = []
- for x in lins:
- node = modelFlow.getKey(self.nodes, x)
- inList.append(node)
- self.runLog("info", "模型进行" + comObj["text"])
- zb = eval("resultTools.{0}".format(comObj["tool"]))(inList, comObj, self.outGdb, self.xzqbm)
- # 入库
- self.insertdb(zb)
- def insertdb(self, jcz):
- '''入库'''
- self.runLog("info", "成果数据入库")
- sql = "INSERT INTO onemap.T_ZBMX_ZBJCZ(BSM,ZBBH,XZQDM,XZQMC,JCSJ,JCZ,JCYH,TJSJ,JCN,JCY) VALUES ('{0}','{1}','{2}','{3}',to_date('{4}', 'yyyy-mm-dd hh24:mi:ss'),{5},'{6}',to_date('{7}', 'yyyy-mm-dd hh24:mi:ss'),{8},{9})"
- dtime = utils.getNowTime()
- sql = sql.format('{0}_{1}'.format(self.model["bsm"], utils.getNowTimeStr()),
- self.model["zbbh"],
- self.xzqbm.ljust(6, '0'),
- self.xzqmc,
- utils.getTimeStr(dtime, "%Y-%m-%d %H:%M:%S"),
- jcz,
- 'sys',
- utils.getTimeStr(dtime, "%Y-%m-%d %H:%M:%S"),
- utils.getTimeStr(dtime, "%Y"),
- utils.getTimeStr(dtime, "%m")
- )
- self.db.insert(sql)
- def runLog(self, rzlx, rzlr):
- sql = "INSERT INTO onemap.T_ZBMX_MXJSRWRZ(BSM,MXBSM,MXMC,RWBSM,RZLX,RZSJ,RZLR) VALUES (SEQ_T_ZBMX_MXJSRWRZ.NEXTVAL,'{0}', '{1}', '{2}', '{3}', TO_DATE('{4}', 'SYYYY-MM-DD HH24:MI:SS'), '{5}')"
- sql = sql.format(self.model["mxbsm"],
- self.model["mxmc"],
- self.model["bsm"],
- rzlx,
- utils.getNowTimeStr("%Y-%m-%d %H:%M:%S"),
- rzlr
- )
- log.info(sql)
- self.db.insert(sql)
|