ctfx.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import sys
  4. import json
  5. import log
  6. import appconfig
  7. import arcpy
  8. import utils
  9. from arcpy import env
  10. from db.oracle import Oracle
  11. reload(sys)
  12. sys.setdefaultencoding('utf-8')
  13. class Ctfx:
  14. def __init__(self, data):
  15. self.bsm = data
  16. self.db = Oracle(appconfig.DB_CONN)
  17. self.outputname = "CTFX" + data
  18. log.info(data)
  19. # 根据BSM获取任务信息
  20. self.task()
  21. # 临时工作空间
  22. self.root = os.path.dirname(os.path.abspath(__file__))
  23. path = os.path.join(self.root, "out")
  24. if not os.path.exists(path):
  25. os.makedirs(path)
  26. # 创建输出GDB,如果已存在则删除后新建
  27. self.outGdb = os.path.join(path, "{0}.gdb".format(data))
  28. arcpy.Delete_management(self.outGdb)
  29. arcpy.CreateFileGDB_management(path, "{0}.gdb".format(data))
  30. # 输出文件夹里面已经有内容的,就覆盖掉
  31. env.overwriteOutput = True
  32. # 设置工作空间
  33. env.workspace = appconfig.SDE["KJGH"]
  34. def task(self):
  35. # 根据BSM获取任务信息
  36. sql = "select t.sjy,t.xzqdm,t.fxyz,t.rwzt,t.fxtable,t.fxyear,to_char(yz.cxtj) as \"CXTJ\",yz.name as \"YZNAME\",sjy.name as \"SJYNAME\" from t_fxpj_ctfx_main t left join t_fxpj_ctfx_yz yz on yz.id = t.fxyz left join t_fxpj_ctfx_sjy sjy on sjy.tablename = t.sjy where t.id = '{0}'".format(
  37. self.bsm)
  38. tasks = self.db.query(sql)
  39. if len(tasks) == 0:
  40. raise Exception("任务标识错误[{0}]".format(self.bsm))
  41. self.task = tasks[0]
  42. # 查询条件(SQL语句,二调三调用英文分号隔开,二调在前三调在后,以当前分析年份与2019年作比较)
  43. self.task["CXTJ"] = str(self.task["CXTJ"])
  44. if self.task["CXTJ"].find(";") > -1:
  45. if int(self.task["FXYEAR"]) > 2018:
  46. self.task["CXTJ"] = self.task["CXTJ"].split(";")[1]
  47. else:
  48. self.task["CXTJ"] = self.task["CXTJ"].split(";")[0]
  49. def run(self):
  50. try:
  51. # 记录任务开始时间
  52. self.rwkssj = utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  53. # self.updateFxzt(self.bsm, "1", "")
  54. mjField = "TBMJ"
  55. # 1.根据查询条件获取分析数据源
  56. sjy = r"{0}\SJY".format(self.outGdb)
  57. if self.task["CXTJ"] != None and self.task["CXTJ"] != "":
  58. arcpy.Select_analysis(self.task["FXTABLE"], sjy, self.task["CXTJ"])
  59. else:
  60. arcpy.Select_analysis(self.task["FXTABLE"], sjy)
  61. arcpy.AddField_management(sjy, mjField, "DOUBLE")
  62. arcpy.CalculateField_management(sjy, mjField, "!shape.area@SQUAREMETERS!", "PYTHON_9.3")
  63. # 计算分析数据源总面积
  64. fxTotal = 0
  65. with arcpy.da.SearchCursor(sjy, ['TBMJ']) as cursor:
  66. for row in cursor:
  67. fxTotal = fxTotal + row[0]
  68. self.fxTotal = fxTotal
  69. log.info(self.bsm + "根据查询条件获取分析数据源完成")
  70. # 2.裁剪数据源
  71. env.workspace = appconfig.getSDE("SDE")
  72. fxjg = r"{0}\{1}".format(self.outGdb, self.outputname)
  73. arcpy.Clip_analysis(sjy, self.task["SJY"], fxjg, 0)
  74. log.info(self.bsm + "裁剪分析数据源完成")
  75. # 3.计算面积
  76. log.info("面积")
  77. arcpy.AddField_management(fxjg, mjField, "DOUBLE")
  78. arcpy.CalculateField_management(fxjg, mjField, "!shape.area@SQUAREMETERS!", "PYTHON_9.3")
  79. # 计算分析结果总面积
  80. jgTotal = 0
  81. with arcpy.da.SearchCursor(fxjg, ['TBMJ']) as cursor:
  82. for row in cursor:
  83. jgTotal = jgTotal + row[0]
  84. self.jgTotal = jgTotal
  85. # 4. 添加统计字段
  86. subXzqLeng = self.getSubXzqLength()
  87. staticsField = "STATICS"
  88. arcpy.AddField_management(fxjg, staticsField, "TEXT")
  89. arcpy.CalculateField_management(fxjg, staticsField, "!ZLDWDM![0:" + str(subXzqLeng) + "]", "PYTHON_9.3")
  90. # 5.根据行政区划统计信息
  91. xzqstatist = r"{0}\XZQSTCTIST".format(self.outGdb)
  92. arcpy.Statistics_analysis(fxjg, xzqstatist, [[mjField, "SUM"]], staticsField)
  93. # 遍历GDB统计表
  94. statistobj = {}
  95. with arcpy.da.SearchCursor(xzqstatist, [staticsField, "SUM_" + mjField]) as cursor:
  96. for row in cursor:
  97. statistobj[row[0]] = row[1]
  98. log.info(json.dumps(statistobj))
  99. # 结果数据拷贝到sde数据库
  100. # sde = appconfig.SDE["SDE"]
  101. # env.workspace = sde
  102. # sdeTableName = "SDE." + self.outputname
  103. # try:
  104. # arcpy.Delete_management(sdeTableName)
  105. # except arcpy.ExecuteError:
  106. # log.error(arcpy.GetMessages())
  107. # except:
  108. # msg = str(sys.exc_info()).decode('string-escape')
  109. # log.error(msg)
  110. # arcpy.Copy_management(fxjg, sdeTableName)
  111. # 记录任务开始时间
  112. self.rwjssj = utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  113. # 组装分析结果
  114. self.updateFxztAndStatist(self.bsm, "2", self.createFxjg(), json.dumps(statistobj))
  115. log.info("####OK####")
  116. print("####OK####")
  117. except arcpy.ExecuteError:
  118. print("####ERROR####" + arcpy.GetMessages())
  119. log.error(arcpy.GetMessages())
  120. self.updateFxzt(self.bsm, "3", arcpy.GetMessages())
  121. except:
  122. msg = str(sys.exc_info()).decode('string-escape')
  123. print("####ERROR####" + msg)
  124. log.error(msg)
  125. self.updateFxzt(self.bsm, "3", msg)
  126. # 获取行政区下属级别代码长度
  127. def getSubXzqLength(self):
  128. curlength = len(self.task["XZQDM"])
  129. if curlength == 4:
  130. curlength = 6
  131. elif curlength == 6:
  132. curlength = 9
  133. elif curlength == 9:
  134. curlength = 12
  135. return curlength
  136. # 组装分析结果
  137. def createFxjg(self):
  138. # fxjgstr = self.task["SJYNAME"] + "内约有" + self.task["YZNAME"] + self.areaTransform(self.jgTotal) + ",占分析范围内" + self.task["YZNAME"] + "总面积的" + self.proportion()
  139. fxjgstr = "{0}内约有{1}{2},占分析范围内{1}总面积的{3}。"
  140. fxjgstr = fxjgstr.format(self.task["SJYNAME"], self.task["YZNAME"], self.areaTransform(
  141. self.jgTotal), self.proportion())
  142. return fxjgstr
  143. # 面积转换 平方米转万亩
  144. def areaTransform(self, area):
  145. res = area * 0.0015 / 10000
  146. return "" + "%.2f" % res + "万亩"
  147. # 面积转换 平方米转万亩
  148. def proportion(self):
  149. res = (self.jgTotal / self.fxTotal) * 100
  150. return "" + "%.2f" % res + "%"
  151. # 更新冲突分析任务状态
  152. def updateFxzt(self, bsm, fxzt, msg):
  153. # 记录任务结束时间
  154. self.rwjssj = utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  155. sql = "update t_fxpj_ctfx_main t set rwzt = '{0}',rwkssj = to_date('{1}','yyyy-mm-dd hh24:mi:ss') , rwjssj = to_date('{2}','yyyy-mm-dd hh24:mi:ss') ,fxjg = '{3}',fxjgtable = '{4}',workspace = '{5}' where t.id = '{6}'"
  156. sql = sql.format(
  157. fxzt
  158. , self.rwkssj
  159. , self.rwjssj
  160. , msg
  161. , self.outputname
  162. , self.outGdb
  163. , bsm)
  164. self.db.insert(sql)
  165. # 更新冲突分析任务状态
  166. def updateFxztAndStatist(self, bsm, fxzt, msg, statist):
  167. # 记录任务结束时间
  168. self.rwjssj = utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  169. sql = "update t_fxpj_ctfx_main t set rwzt = '{0}',rwkssj = to_date('{1}','yyyy-mm-dd hh24:mi:ss') , rwjssj = to_date('{2}','yyyy-mm-dd hh24:mi:ss') ,fxjg = '{3}',fxjgtable = '{4}',workspace = '{5}', statist = '{7}' where t.id = '{6}'"
  170. sql = sql.format(
  171. fxzt
  172. , self.rwkssj
  173. , self.rwjssj
  174. , msg
  175. , self.outputname
  176. , self.outGdb
  177. , bsm
  178. , statist)
  179. self.db.insert(sql)