main.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import sys
  4. import json
  5. import utils
  6. import importlib, sys
  7. from osgeo import ogr
  8. from tools.PostgreSQL.PostgreSQL import PostgreSQL
  9. from tools.StringUtils import (getConnectionStr, getNow)
  10. importlib.reload(sys)
  11. def run(fun, data):
  12. try:
  13. message = eval("{0}".format(fun))(data)
  14. print(message)
  15. # 输出成功信息 做交互用
  16. # print("####OK####")
  17. except:
  18. msg = str(sys.exc_info()).decode('string-escape')
  19. print("####ERROR####" + msg)
  20. # 测试
  21. def test(data):
  22. print(data["bsm"])
  23. # postgisupdate
  24. def postgisupdate(data):
  25. print("===========进行数据更新开始===========")
  26. # 当前时间
  27. now = getNow()
  28. # 获取参数
  29. # ogrLayer = "D:\\gisdata\\三亚\\规划地块部分数据\\4525.shp"
  30. # allowoverlap = True
  31. # tablename = "vector.updatetest"
  32. ogrLayer = data["source"]
  33. allowoverlap = data["allowoverlap"]
  34. tablename = data["target"]
  35. pgconn = PostgreSQL(schema='base')
  36. srid = pgconn.getVectorTableSrid(tablename=tablename)
  37. geomtype = pgconn.getVectorTableGeomType(tablename=tablename)
  38. ds = ogr.Open(ogrLayer, 0)
  39. layer = ds.GetLayer()
  40. layer_spatial_ref = layer.GetSpatialRef()
  41. layer_def = layer.GetLayerDefn()
  42. vectorepsg = layer_spatial_ref.GetAttrValue('AUTHORITY', 1)
  43. alltablefiled = pgconn.getAllTableField(tablename=tablename)
  44. insertcount = 0
  45. misscount = 0
  46. for feature in layer:
  47. geom_wkt = feature.GetGeometryRef().ExportToWkt()
  48. # 判断是否允许更新重叠数据
  49. updatebool = True
  50. if allowoverlap == False:
  51. instersectsCount = pgconn.getInstersectsCount(tablename=tablename, tablesrid=srid, wkts=[geom_wkt],
  52. wktsrid=vectorepsg)
  53. count = int(instersectsCount)
  54. if count > 0:
  55. updatebool = False
  56. misscount += 1
  57. if updatebool == True:
  58. # 遍历当前数据的属性信息
  59. attributes = {}
  60. for i in range(layer_def.GetFieldCount()):
  61. field_def = layer_def.GetFieldDefn(i)
  62. field_name = field_def.GetName()
  63. field_value = feature.GetField(i)
  64. attributes[field_name] = field_value
  65. # print(field_value)
  66. # if self.is_string(field_value) == True:
  67. # print(field_value.encode('utf-8'))
  68. # 拼接insert into语句
  69. insertvalus = []
  70. for field in alltablefiled:
  71. b = utils.contains_keys(attributes, [field.lower()])
  72. if b == True:
  73. insertvalus.append(attributes[field.lower()])
  74. else:
  75. b = utils.contains_keys(attributes, [field.upper()])
  76. if b == True:
  77. insertvalus.append(attributes[field.upper()])
  78. else:
  79. insertvalus.append(None)
  80. pgconn.insertVectorFeature(tablename=tablename, fields=alltablefiled, values=insertvalus, wkt=geom_wkt,
  81. wktsrid=vectorepsg, geomtype=geomtype, rksj=now)
  82. insertcount += 1
  83. pgconn.updateVectorVersion(tablename=tablename, version=now)
  84. pgconn.close()
  85. return str({
  86. "status": "更新成功",
  87. "insert": str(insertcount) + "条记录",
  88. "miss": str(misscount) + "条记录,存在空间叠加。"
  89. })
  90. if __name__ == '__main__':
  91. if len(sys.argv) == 3:
  92. fun = sys.argv[1]
  93. jsonData = utils.b64Decode(sys.argv[2])
  94. print(jsonData)
  95. run(fun, json.loads(jsonData))