zbmx.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import sys
  4. import log
  5. import uuid
  6. import utils
  7. import json
  8. import copy
  9. import io
  10. import gc
  11. # import importlib
  12. import appconfig
  13. import zbmx.modelFlow
  14. import zbmx.arcTools
  15. import zbmx.resultTools
  16. import arcpy
  17. import db.postgresql as db
  18. from arcpy import env
  19. from db.postgresql import Postgresql
  20. import importlib, sys
  21. importlib.reload(sys)
  22. class ModelBuider:
  23. def __init__(self, data):
  24. # 数据库
  25. self.model = data
  26. self.db = Postgresql(appconfig.DB_CONN)
  27. self.load()
  28. time = utils.getNowTimeStr();
  29. gdbName = "{0}_{1}.gdb".format(time, data["bsm"]);
  30. self.root = os.path.dirname(os.path.abspath(__file__))
  31. self.path = os.path.join(self.root, "out");
  32. self.outGdb = os.path.join(self.path, gdbName)
  33. if not os.path.exists(self.path):
  34. os.makedirs(self.path)
  35. arcpy.CreateFileGDB_management(self.path, gdbName)
  36. # 输出文件夹里面已经有内容的,就覆盖掉
  37. env.overwriteOutput = True
  38. # 设置工作空间
  39. # env.workspace = appconfig.SDE["KJGH_QY"]
  40. def load(self):
  41. '''加载数据-行政区'''
  42. sql = "SELECT substr(XZQDM,0,6) as \"XZQDM\",XZQMC as \"XZQMC\" FROM KJGH.XZQXS";
  43. if self.model['xzqbm'] != '' and self.model['xzqbm'] != None:
  44. sql += " WHERE substr(XZQDM,0,6) LIKE '{0}%'".format(self.model['xzqbm'][0:6])
  45. xzq = self.db.query(sql)
  46. if self.model['xzqbm'] == '':
  47. xzqds = {}
  48. xzqds["XZQDM"] = "1506"
  49. xzqds["XZQMC"] = "鄂尔多斯市"
  50. xzq.append(xzqds)
  51. self.xzq = xzq
  52. def initData(self):
  53. '''清空数据'''
  54. temp = utils.toJson(self.model["mxcs"])
  55. self.nodes = temp["nodeDataArray"] # 节点
  56. self.links = temp["linkDataArray"] # 关系
  57. def run(self):
  58. '''执行'''
  59. log.info('开始')
  60. self.runLog("info", "开始执行模型运算")
  61. self.xzqbm = '1506'
  62. self.xzqmc = '鄂尔多斯市'
  63. # 先把市的算出来,然后在分
  64. log.info("然后在分")
  65. self.initData()
  66. self.runLog("info", "初始化数据")
  67. log.info("初始化数据")
  68. self.xzqgl()
  69. log.info("xzqgl")
  70. self.analysis()
  71. log.info("analysis")
  72. self.result()
  73. log.info("result")
  74. self.xzjs()
  75. log.info('结束')
  76. print("####OK####" + self.outGdb)
  77. self.db.close()
  78. def xzjs(self):
  79. self.runLog("info", "按行政区进行分别统计结果")
  80. for x in self.xzq:
  81. self.xzqbm = x["XZQDM"]
  82. self.xzqmc = x["XZQMC"]
  83. self.runLog("info", self.xzqbm + "统计结果")
  84. log.info("行政区>>>" + self.xzqbm)
  85. inList = [{
  86. "key": self.xzqbm,
  87. "text": "行政区",
  88. "category": "sjy",
  89. "sjylx": "KJGH",
  90. "sjy": "XZQXS"
  91. }]
  92. comObj = {
  93. "key": "xzq",
  94. "text": "条件筛选",
  95. "category": "jsfs",
  96. "tool": "Select_analysis",
  97. "gltj": "XZQDM LIKE '{0}%'".format(self.xzqbm)
  98. }
  99. xzq = arcTools.Select_analysis(inList, comObj, self.outGdb, self.xzqbm)
  100. xzqObj = {
  101. "category": "sjy_xzq",
  102. "key": "xzq",
  103. "sjy": xzq,
  104. }
  105. # 把所有记算的数据切一下
  106. scfs = filter(modelFlow.filterScfs, self.nodes)
  107. for comObj in scfs:
  108. lins = modelFlow.getLink(comObj["key"], self.links)
  109. inList = []
  110. for x in lins:
  111. node = copy.deepcopy(modelFlow.getKey(self.nodes, x))
  112. node["sjy"] = arcTools.Intersect_analysis([node, xzqObj], None, self.outGdb, self.xzqbm)
  113. inList.append(node)
  114. # zb = resultTools.Area_proportion(inList, comObj, self.outGdb)
  115. zb = eval("resultTools.{0}".format(comObj["tool"]))(inList, comObj, self.outGdb, self.xzqbm)
  116. gc.collect()
  117. # 入库
  118. self.insertdb(zb)
  119. def xzqgl(self):
  120. '''行政区过滤'''
  121. sjy = filter(modelFlow.filterSjy, self.nodes)
  122. inList = [{
  123. "key": self.xzqbm,
  124. "text": "行政区",
  125. "category": "sjy",
  126. "sjylx": "KJGH",
  127. "sjy": "XZQXS"
  128. }]
  129. comObj = {
  130. "key": "xzq",
  131. "text": "条件筛选",
  132. "category": "jsfs",
  133. "tool": "Select_analysis",
  134. "gltj": "XZQDM LIKE '{0}%'".format(self.xzqbm)
  135. }
  136. xzq = arcTools.Select_analysis(inList, comObj, self.outGdb, self.xzqbm)
  137. for in_node in sjy:
  138. self.runLog("info", "行政区过滤{0}数据源".format(in_node["text"]))
  139. # 有条件先过滤
  140. if in_node["gltj"] != "":
  141. in_node['sjy'] = arcTools.Select_analysis([in_node], {"gltj": in_node["gltj"]}, self.outGdb, self.xzqbm)
  142. in_node['category'] = "sjy_gl"
  143. in2 = [
  144. in_node,
  145. {
  146. "category": "sjy_xzq",
  147. "key": "xzq",
  148. "sjy": xzq,
  149. }
  150. ]
  151. in_node['sjy'] = arcTools.Intersect_analysis(in2, None, self.outGdb, self.xzqbm)
  152. in_node['category'] = "sjy_xzq"
  153. in_node['xzq'] = xzq
  154. def analysis(self):
  155. '''计算分析'''
  156. jsfs = filter(modelFlow.filterJsfs, self.nodes)
  157. tempOut = []
  158. index = 0
  159. while True:
  160. if len(jsfs) == 0:
  161. break
  162. comObj = jsfs[index]
  163. lins = modelFlow.getLink(comObj["key"], self.links)
  164. inList = []
  165. isRun = True
  166. indata = ""
  167. for x in lins:
  168. node = modelFlow.getKey(self.nodes, x)
  169. if node['category'] == 'sjy' or node.get('sjy') != None:
  170. inList.append(node)
  171. indata += node["text"] + "、"
  172. else:
  173. isRun = False
  174. break
  175. if isRun:
  176. self.runLog("info", "{0}执行{1}分析".format(indata, comObj["text"]))
  177. data = eval("arcTools.{0}".format(comObj["tool"]))(inList, comObj, self.outGdb, self.xzqbm) # 空间分析
  178. comObj["sjy"] = data
  179. del jsfs[index]
  180. index = 0
  181. else:
  182. index += 1
  183. def result(self):
  184. '''结果输出'''
  185. scfs = filter(modelFlow.filterScfs, self.nodes)
  186. for comObj in scfs:
  187. lins = modelFlow.getLink(comObj["key"], self.links)
  188. inList = []
  189. for x in lins:
  190. node = modelFlow.getKey(self.nodes, x)
  191. inList.append(node)
  192. self.runLog("info", "模型进行" + comObj["text"])
  193. zb = eval("resultTools.{0}".format(comObj["tool"]))(inList, comObj, self.outGdb, self.xzqbm)
  194. # 入库
  195. self.insertdb(zb)
  196. def insertdb(self, jcz):
  197. '''入库'''
  198. self.runLog("info", "成果数据入库")
  199. 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})"
  200. dtime = utils.getNowTime()
  201. sql = sql.format('{0}_{1}'.format(self.model["bsm"], utils.getNowTimeStr()),
  202. self.model["zbbh"],
  203. self.xzqbm.ljust(6, '0'),
  204. self.xzqmc,
  205. utils.getTimeStr(dtime, "%Y-%m-%d %H:%M:%S"),
  206. jcz,
  207. 'sys',
  208. utils.getTimeStr(dtime, "%Y-%m-%d %H:%M:%S"),
  209. utils.getTimeStr(dtime, "%Y"),
  210. utils.getTimeStr(dtime, "%m")
  211. )
  212. self.db.insert(sql)
  213. def runLog(self, rzlx, rzlr):
  214. 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}')"
  215. sql = sql.format(self.model["mxbsm"],
  216. self.model["mxmc"],
  217. self.model["bsm"],
  218. rzlx,
  219. utils.getNowTimeStr("%Y-%m-%d %H:%M:%S"),
  220. rzlr
  221. )
  222. log.info(sql)
  223. self.db.insert(sql)