0_init.sql 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. -- 7.24
  2. -- 修改表结构和数据,需要同步到现场
  3. base.t_jsc_sql
  4. -- 新增表
  5. vector."TB_GDZL"
  6. vector."TB_HDGLX"
  7. vector."TB_GYL"
  8. -- 修改表结构和数据,需要同步到现场
  9. vector."AFTER_JCSH"
  10. -- 添加影像数据
  11. -- D:/onemapfile/15影像.tif
  12. --修改表数据,需要同步到现场
  13. vector."AFTER_BJXM_SZ"
  14. -- 只同步数据
  15. base."t_fzss_fzxz_factor"
  16. -- 需要修改的nacos
  17. -- onemap-spatial-dev.yml
  18. -- onemap-analyse-dev.yml
  19. -- 添加多地块合并方法
  20. drop function if exists area_in_range;
  21. CREATE OR REPLACE FUNCTION area_in_range(jsonarg json, systemarg json)
  22. RETURNS VARCHAR AS $$
  23. DECLARE
  24. sql TEXT;
  25. records VARCHAR;
  26. begin
  27. execute format('
  28. insert into %s
  29. with t as(
  30. select array[id] idarray, st_area (st_transform(geom, 3857) ) /2000*3 area, ''%s'' feature , 0.0 weight,geom
  31. from %s order by area
  32. )
  33. select t.* from t where area between %s and %s
  34. limit 3; ', systemarg->>'选址结果',systemarg->>'选址方式',systemarg->>'初步结果',jsonarg->>'面积下限', jsonarg->>'面积上限');
  35. return 'OK';
  36. END;
  37. $$ LANGUAGE plpgsql;
  38. drop function if exists block_merge;
  39. CREATE OR REPLACE FUNCTION block_merge(jsonarg json , systemarg json)
  40. RETURNS VARCHAR AS $$
  41. DECLARE
  42. sql TEXT;
  43. records VARCHAR;
  44. BEGIN
  45. with a as(select jsonb(jsonarg) arg),
  46. an as (select regexp_split_to_table( substring('abcdefghijklmnopqrstuvwxyz',1, cast(a.arg->>'小地块最多合并块数' as integer) ), '') alias from a),
  47. t1 as ( select string_agg( an.alias || '.id', ',') idarr,
  48. string_agg( an.alias || '.area' , ' + ') areaarr,
  49. string_agg ('t2 as ' || an.alias , ',') tblarr,
  50. string_agg( an.alias || '.geom', ',' ) geomarr
  51. from an),
  52. t2 as (select alias, lead(alias) over() n from an ),
  53. t3 as ( select string_agg( alias || '.id < ' || n ||'.id', ' and ') cond from t2 where n notnull),
  54. in_t1 as (select format('select id, st_area (st_transform(geom, 3857) ) /2000*3 area, geom from %s order by area ', systemarg->>'初步结果' ) t ) ,
  55. in_t2 as (select format('select id,area,geom from t1 where area < %s', a.arg->>'面积下限') t from a) ,
  56. in_t3 as (select format(
  57. 'select ARRAY[%s] idarray, %s area ,st_collect(ARRAY[%s]) geom
  58. from %s
  59. where %s', idarr, areaarr,geomarr , tblarr, cond ) t from t1,t3)
  60. select
  61. format('insert into %s
  62. with t1 as (%s),
  63. t2 as (%s),
  64. t3 as(%s)
  65. select idarray,area, ''%s'' feature, 0.0 weight, geom from t3
  66. where area between %s and %s
  67. order by area
  68. limit 3',systemarg->>'选址结果',
  69. in_t1.t, in_t2.t, in_t3.t,systemarg->>'选址方式',a.arg->>'面积下限',a.arg->>'面积上限' ) into sql from in_t1, in_t2, in_t3,a;
  70. EXECUTE sql;
  71. return 'OK';
  72. END;
  73. $$ LANGUAGE plpgsql;
  74. drop function if exists big_area_block;
  75. CREATE OR REPLACE FUNCTION big_area_block(jsonarg json, systemarg json)
  76. RETURNS VARCHAR AS $$
  77. DECLARE
  78. sql TEXT;
  79. records VARCHAR;
  80. begin
  81. execute format('
  82. insert into %s
  83. with t as(
  84. select array[id] idarray, st_area (st_transform(geom, 3857) ) /2000*3 area, ''%s'' feature ,0 weight, geom
  85. from %s order by area
  86. )select * from t
  87. where area > %s order by area limit 3;
  88. with recursive cte(arealimit,tolerance, movedirection, area, grade, movescale, interarea, idarray,width,height,geom,env) as(
  89. select cast(arg->>''面积上限'' as float8) arealimit, (cast(arg->>''面积上限'' as float8) - cast(arg->>''面积下限'' as float8) ) / 100.0 tolerance,
  90. array[sign(cast(arg->>''截取地块X方位'' as integer)), sign(cast(arg->>''截取地块Y方位'' as integer))] movedirection, area,
  91. 1 grade, 0.5::float4 movescale,
  92. st_area(st_intersection(st_transform(geom,3857), st_translate(st_envelope(st_transform(geom,3857)), (st_xmax(st_transform(geom,3857)) - st_xmin(st_transform(geom,3857)))*abs(sign(cast(arg->>''截取地块X方位'' as integer)))*0.5,
  93. (st_ymax(st_transform(geom,3857)) - st_ymin(st_transform(geom,3857)))*abs(sign(cast(arg->>''截取地块Y方位'' as integer)))*0.5) ) ) *3/2000 interarea ,
  94. idarray, (st_xmax(st_transform(geom,3857)) - st_xmin(st_transform(geom,3857))) width,
  95. (st_ymax(st_transform(geom,3857)) - st_ymin(st_transform(geom,3857))) height,
  96. st_transform(geom,3857) geom,
  97. st_envelope(st_transform(geom,3857)) env
  98. from vector.选址结果, jsonb(''%s'') arg
  99. where feature like ''%s''
  100. union all
  101. select arealimit, tolerance, movedirection, area, grade + 1 grade,
  102. movescale + (1.0/power(2, (grade + 1) )*(case when arealimit < interarea then 1 else -1 end) )::float4 movescale,
  103. st_area(st_intersection(geom, st_translate(env,
  104. width*(movescale + (1.0/power(2, (grade + 1) )*(case when arealimit < interarea then 1 else -1 end) )::float4)*movedirection[1],
  105. height*(movescale + (1.0/power(2, (grade + 1) )*(case when arealimit < interarea then 1 else -1 end) )::float4)*movedirection[2])
  106. )
  107. ) *3/2000 interarea ,
  108. idarray,width,height,geom,env from cte
  109. where grade < 16 and abs(interarea - arealimit) > tolerance
  110. ),
  111. t as(
  112. select idarray, st_transform( st_collectionextract( st_intersection(geom, st_translate(env,
  113. width*(movescale::float4)*movedirection[1],
  114. height*(movescale::float4)*movedirection[2])
  115. ) ,3), 4326) geom
  116. from cte order by grade DESC limit 1)
  117. update %s f set geom = t.geom from t
  118. where feature like ''%s'' and f.idarray = t.idarray and t.geom is not null
  119. ', systemarg->>'选址结果',systemarg->>'选址方式', systemarg->>'初步结果', jsonarg->>'面积上限',jsonarg, systemarg->>'选址方式', systemarg->>'选址结果', systemarg->>'选址方式' );
  120. return 'OK';
  121. END;
  122. $$ LANGUAGE plpgsql;