fzjbnt.py 8.3 KB

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