xmydsyx.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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 Xmydsyx:
  14. def __init__(self, data):
  15. self.bsm = data
  16. self.db = Oracle(appconfig.DB_CONN)
  17. self.outputname = "XMYDSYX" + 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.id,m.fxtable,y.name,y.sjlx from t_fxpj_xmyd_rz t left join t_fxpj_ctfx_main m on m.id = t.rwbsm left join t_fxpj_ctfx_yz y on y.id = t.yzbsm where t.rwbsm = '{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.tasks = tasks
  42. def run(self):
  43. try:
  44. self.fxjgtable = "result_" + self.bsm
  45. # 记录任务开始时间
  46. self.rwkssj = utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  47. mjField = "TBMJ"
  48. syxField = "SYX"
  49. markField = "SW_XZQH"
  50. # 配置以哪个适宜性为主
  51. firstStyle = "0"
  52. fxtable = ""
  53. # 记录主任务开始时间并写入表
  54. # 遍历分析因子 进行叠加分析
  55. for curtask in self.tasks:
  56. curkssj = utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  57. try:
  58. fxtable = curtask["FXTABLE"]
  59. # 创建当前分析因子叠加结果表
  60. curtablename = curtask["SJLX"]
  61. curt = r"{0}\{1}".format(self.outGdb, curtablename)
  62. # 使用要素识别,用影响因子切分项目范围
  63. arcpy.Identity_analysis(fxtable, "SDE." + curtask["SJLX"], curt, "ALL", 0)
  64. # 计算面积
  65. arcpy.AddField_management(curt, mjField, "DOUBLE")
  66. arcpy.CalculateField_management(curt, mjField, "!shape.area@SQUAREMETERS!", "PYTHON_9.3")
  67. # 增加适宜性字段
  68. arcpy.AddField_management(curt, syxField, "TEXT")
  69. # 遍历数据 设置markField不为空则表示压覆,反之则不压覆,并计算各类面积统计
  70. syArea = 0 # 适宜面积统计
  71. bsyArea = 0 # 不适宜面积统计
  72. totalArea = 0
  73. with arcpy.da.UpdateCursor(curt, [markField, syxField, mjField]) as cursor:
  74. for row in cursor:
  75. if row[0] != None and row[0] != "":
  76. row[1] = "0"
  77. bsyArea = bsyArea + row[2]
  78. else:
  79. row[1] = "1"
  80. syArea = syArea + row[2]
  81. totalArea = totalArea + row[2]
  82. cursor.updateRow(row)
  83. # 组装返回结果
  84. self.updateFxyzzt(curtask["ID"], "2", curkssj, curtablename,
  85. self.arrangeFxjg(syArea, bsyArea, totalArea))
  86. except arcpy.ExecuteError:
  87. log.error(arcpy.GetMessages())
  88. self.updateFxyzzt(curtask["ID"], "3", curkssj, curtablename, arcpy.GetMessages())
  89. except:
  90. msg = str(sys.exc_info()).decode('string-escape')
  91. log.error(msg)
  92. self.updateFxyzzt(curtask["ID"], "3", curkssj, curtablename, msg)
  93. # 遍历分析因子 将权重高的数据类型统一提取到临时表
  94. templist = []
  95. for curtask in self.tasks:
  96. curtablename = curtask["SJLX"]
  97. curt = r"{0}\{1}".format(self.outGdb, curtablename)
  98. tempt = r"{0}\{1}".format(self.outGdb, "temp" + curtablename)
  99. templist.append(tempt)
  100. arcpy.Select_analysis(curt, tempt, "" + syxField + " = '" + firstStyle + "'")
  101. # 将权重数据提取到一张临时表进行要素图斑范围合并
  102. merget = "{0}\{1}".format(self.outGdb, "merge_" + firstStyle)
  103. # 定义合并字段
  104. # fldmap = arcpy.FieldMap()
  105. # for cur in templist:
  106. # fldmap.addInputField(cur, markField)
  107. # fldmap_outField = fldmap.outputField
  108. # fldmap_outField.name = markField
  109. # fldmap.outputField = fldmap_outField
  110. # fieldmappings = arcpy.FieldMappings()
  111. # for cur in templist:
  112. # fieldmappings.addTable(cur)
  113. # fieldmappings.addFieldMap(fldmap)
  114. arcpy.Merge_management(templist, merget)
  115. mergelast = r"{0}\{1}".format(self.outGdb, "mergelast_" + firstStyle)
  116. arcpy.Dissolve_management(merget, mergelast)
  117. arcpy.AddField_management(mergelast, markField, "TEXT")
  118. arcpy.CalculateField_management(mergelast, markField, "'1'", "PYTHON_9.3")
  119. # 使用要素识别,用影响因子切分项目范围
  120. fxjgtable = r"{0}\{1}".format(self.outGdb, self.fxjgtable)
  121. arcpy.Identity_analysis(fxtable, mergelast, fxjgtable, "ALL", 0)
  122. # 计算面积
  123. arcpy.AddField_management(fxjgtable, mjField, "DOUBLE")
  124. arcpy.CalculateField_management(fxjgtable, mjField, "!shape.area@SQUAREMETERS!", "PYTHON_9.3")
  125. # 增加适宜性字段
  126. arcpy.AddField_management(fxjgtable, syxField, "TEXT")
  127. # 遍历数据 设置markField不为空则表示压覆,反之则不压覆,并计算各类面积统计
  128. syArea = 0 # 适宜面积统计
  129. bsyArea = 0 # 不适宜面积统计
  130. totalArea = 0
  131. with arcpy.da.UpdateCursor(fxjgtable, [markField, syxField, mjField]) as cursor:
  132. for row in cursor:
  133. if row[0] != None and row[0] != "":
  134. row[1] = "0"
  135. bsyArea = bsyArea + row[2]
  136. else:
  137. row[1] = "1"
  138. syArea = syArea + row[2]
  139. totalArea = totalArea + row[2]
  140. cursor.updateRow(row)
  141. # 组装返回结果
  142. self.updateFxzt(self.bsm, "2", self.arrangeFxjg(syArea, bsyArea, totalArea))
  143. log.info("####OK####")
  144. print("####OK####")
  145. except arcpy.ExecuteError:
  146. print("####ERROR####" + arcpy.GetMessages())
  147. log.error(arcpy.GetMessages())
  148. self.updateFxzt(self.bsm, "3", arcpy.GetMessages())
  149. except:
  150. msg = str(sys.exc_info()).decode('string-escape')
  151. print("####ERROR####" + msg)
  152. log.error(msg)
  153. self.updateFxzt(self.bsm, "3", msg)
  154. # 整理统计数据
  155. def arrangeFxjg(self, syArea, bsyArea, totalArea):
  156. obj = {
  157. "sy": {
  158. "area": "%.2f" % syArea,
  159. "proportion": "" + "%.2f" % (syArea / totalArea * 100) + "%"
  160. },
  161. "bsy": {
  162. "area": "%.2f" % bsyArea,
  163. "proportion": "" + "%.2f" % (bsyArea / totalArea * 100) + "%"
  164. }
  165. }
  166. return json.dumps(obj)
  167. # 更新分析因子任务状态
  168. def updateFxyzzt(self, bsm, fxzt, rwkssj, outputname, msg):
  169. # 记录任务结束时间
  170. rwjssj = utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  171. sql = "update t_fxpj_xmyd_rz t set rwzt = '{0}',rwkssj = to_date('{1}','yyyy-mm-dd hh24:mi:ss') , rwjssj = to_date('{2}','yyyy-mm-dd hh24:mi:ss') ,statist = '{3}',fxjgtable = '{4}',workspace = '{5}' where t.id = '{6}'"
  172. sql = sql.format(
  173. fxzt
  174. , rwkssj
  175. , rwjssj
  176. , msg
  177. , outputname
  178. , self.outGdb
  179. , bsm)
  180. self.db.insert(sql)
  181. # 更新冲突分析任务状态
  182. def updateFxzt(self, bsm, fxzt, msg):
  183. # 记录任务结束时间
  184. self.rwjssj = utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  185. 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}'"
  186. sql = sql.format(
  187. fxzt
  188. , self.rwkssj
  189. , self.rwjssj
  190. , msg
  191. , self.fxjgtable
  192. , self.outGdb
  193. , bsm)
  194. self.db.insert(sql)