hgxfx.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import sys
  4. import log
  5. import uuid
  6. import appconfig
  7. import arcpy
  8. import datetime
  9. import time
  10. import utils
  11. from arcpy import env
  12. from db.postgresql import Postgresql
  13. import importlib, sys
  14. importlib.reload(sys)
  15. class Hgxfx:
  16. def __init__(self, data):
  17. self.bsm = data
  18. # self.bsm = 'b9ca0e7812544e8ba1d10ac59b5e0f4d'
  19. self.db = Postgresql(appconfig.DB_CONN)
  20. log.info(data)
  21. self.fxlog(self.bsm, "info", "开始进行合规性分析")
  22. # 读任务
  23. self.task()
  24. # 选址GDB
  25. self.root = os.path.dirname(os.path.abspath(__file__))
  26. path = os.path.join(self.root, "out")
  27. # self.tbxPath = os.path.abspath(os.path.join(self.root,"../tbxs"))
  28. if not os.path.exists(path):
  29. os.makedirs(path)
  30. self.outGdb = os.path.join(path, "{0}.gdb".format(data))
  31. arcpy.Delete_management(self.outGdb)
  32. arcpy.CreateFileGDB_management(path, "{0}.gdb".format(data))
  33. # 输出文件夹里面已经有内容的,就覆盖掉
  34. env.overwriteOutput = True
  35. # 设置工作空间
  36. env.workspace = appconfig.SDE["KJGH"]
  37. def task(self):
  38. '''加载数据-任务、因子'''
  39. sql = "SELECT BSM as \"BSM\",cast(FXMJ as VARCHAR) as \"FXMJ\",XMMC as \"XMMC\",XMLX as \"XMLX\",JSDW as \"JSDW\",YDXZ_BSM as \"YDXZ_BSM\" FROM onemap.T_FZSS_HGXFX WHERE BSM='{0}'".format(
  40. self.bsm)
  41. tasks = self.db.query(sql)
  42. if len(tasks) == 0:
  43. self.fxlog(self.bsm, "error", "任务标识错误[{0}]".format(self.bsm))
  44. raise Exception("任务标识错误[{0}]".format(self.bsm))
  45. self.task = tasks[0]
  46. sql = "SELECT A.BSM as \"BSM\",A.RWBSM as \"RWBSM\",A.SCXBSM as \"SCXBSM\",B.YSDM as \"YSDM\",B.YSMC as \"YSMC\",B.SJY as \"SJY\" FROM onemap.T_FZSS_HGXFX_HGSCX A LEFT JOIN onemap.T_FZSS_HGXFX_SCX B ON A.SCXBSM = B.BSM WHERE A.RWBSM = '{0}' ORDER BY B.XSSX,B.KZXJB".format(
  47. self.bsm)
  48. self.hgscx = self.db.query(sql)
  49. yznames = ""
  50. for yz in self.hgscx:
  51. yznames = yznames + yz['YSMC'] + "、"
  52. self.fxlog(self.bsm, "info", "检查要素:{0}".format(yznames[:-1]))
  53. def run(self):
  54. # 1.范围导入
  55. # 设置工作空间
  56. self.fw = r"{0}\FW".format(self.outGdb)
  57. # 范围
  58. where = '"rwbsm"=\'{0}\''.format(self.bsm)
  59. arcpy.Select_analysis("KJGH.T_FZSS_FXRW_GIS", self.fw, where)
  60. self.fxlog(self.bsm, "info", "载入审查范围完成")
  61. # 2.用地用海单独处理
  62. # ydyh = r"{0}\SJY".format(self.outGdb)
  63. # arcpy.Intersect_analysis(["KJGH_QY.XZYDYH"], self.fw] , ydyh)
  64. # arcpy.ImportToolbox(os.path.join(self.tbxPath,"xzydyh.tbx"),"xzydyh")
  65. # arcpy.hgxfx_xzydyh(ydyh)
  66. # self.fxlog(self.bsm, "info", "用地用海分析完成")
  67. # 2.分析-检查项
  68. for scx in self.hgscx:
  69. out = r"{0}\FX_{1}".format(self.outGdb, scx['SCXBSM'])
  70. yzsjy = scx['SJY'] # 数据
  71. mj = 0 # 占压面积和距离
  72. sfhg = "" # 是否合规
  73. bz = ""
  74. jcjg = "" # 检查结果
  75. mjField = "YZMJ" # 面积和距离字段
  76. arcpy.Intersect_analysis([self.fw, yzsjy], out)
  77. fid = "FID_{0}".format(yzsjy.split('.')[1]);
  78. # 删
  79. attrs = ["objectid", "shape", "shape_length", "shape_area", "rwbsm", fid.lower()]
  80. fields = arcpy.ListFields(out)
  81. for field in fields:
  82. if field.name.lower() not in attrs:
  83. arcpy.DeleteField_management(out, field.name)
  84. # 加
  85. arcpy.AddField_management(out, "BSM", "TEXT")
  86. arcpy.AddField_management(out, "SCXBSM", "TEXT")
  87. arcpy.AddField_management(out, "YSDM", "TEXT")
  88. arcpy.AddField_management(out, "YSMC", "TEXT")
  89. arcpy.AddField_management(out, "YZMJ", "DOUBLE")
  90. arcpy.AddField_management(out, "OBJID", "DOUBLE")
  91. arcpy.AddField_management(out, "CJSJ", "DATE")
  92. # 算
  93. arcpy.CalculateField_management(out, "YZMJ", "!shape.area@SQUAREMETERS!", "PYTHON_9.3")
  94. ufields = ["BSM", "SCXBSM", "YSDM", "YSMC", "OBJID", "CJSJ", fid]
  95. with arcpy.da.UpdateCursor(out, ufields) as cursor:
  96. for row in cursor:
  97. guid = ''.join(str(uuid.uuid1()).split('-'))
  98. row[0] = guid
  99. row[1] = scx['BSM']
  100. row[2] = scx['YSDM']
  101. row[3] = scx['YSMC']
  102. row[4] = row[6]
  103. row[5] = datetime.datetime.now()
  104. cursor.updateRow(row)
  105. with arcpy.da.SearchCursor(out, [mjField]) as cursor:
  106. for row in cursor:
  107. mj = mj + row[0]
  108. if mj > 0:
  109. jcjg = "项目范围共涉及" + scx["YSMC"] + "约" + str(round(mj, 2)) + "㎡";
  110. else:
  111. jcjg = "项目范围未涉及" + scx["YSMC"];
  112. # 分析结果更新
  113. self.fxjggx(scx["BSM"], mj, jcjg, sfhg, bz);
  114. arcpy.Append_management([out], "KJGH.T_FZSS_HGXFX_JG_GIS", "NO_TEST")
  115. self.fxlog(self.bsm, "info", "{0}审查分析完成".format(scx['YSMC']))
  116. time.sleep(1)
  117. self.fxlog(self.bsm, "info", "审查完成")
  118. print("####OK####")
  119. def fxlog(self, bsm, rzlx, msg):
  120. sql = "INSERT INTO onemap.T_FZSS_FXRWRZ(RWLX,RWBSM,RZLX,FXJG,RZSJ,RZLR,BSM) VALUES ('{0}','{1}','{2}','{3}',to_date('{4}','yyyy-mm-dd hh24:mi:ss'),'{5}','{6}')";
  121. sql = sql.format(
  122. '合规性审查'
  123. , bsm
  124. , rzlx
  125. , ''
  126. , utils.getNowTimeStr("%Y-%m-%d %H:%M:%S")
  127. , msg
  128. , ''.join(str(uuid.uuid1()).split('-'))
  129. )
  130. self.db.insert(sql)
  131. def fxjggx(self, bsm, zdmj, jcjg, sfhg, bz):
  132. sql = "UPDATE onemap.T_FZSS_HGXFX_HGSCX SET ZDMJ = " + str(zdmj);
  133. if jcjg != "" and jcjg != None:
  134. sql = sql + " ,JCJG = '" + jcjg + "'";
  135. sql = sql + " WHERE BSM = '" + bsm + "'";
  136. self.db.insert(sql)