fzjbnt.py 8.5 KB

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