merge_links_25070602.sh 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #!/bin/bash
  2. set -e
  3. source env.sh
  4. echo "🔗 Ühendan kõik links_* tabelid skeemist ${destination_schema}"
  5. # Leia esimene relation_id, mida kasutada struktuuri eeskujuks
  6. LINKS_TEMPLATE=$(psql ${CONNECTION_NAME} -At -d ${destination_dbname} -c "SELECT relation_id FROM ${destination_schema}.ardok_administrative WHERE admin_level = '6' LIMIT 1;")
  7. #psql ${CONNECTION_NAME} -d ${destination_dbname} -c "DROP TABLE IF EXISTS ${destination_schema}.links CASCADE;"
  8. psql ${CONNECTION_NAME} -d ${destination_dbname} <<EOF
  9. DO \$\$
  10. DECLARE
  11. schema_name text := '${destination_schema}';
  12. template_name text := 'links_' || '${LINKS_TEMPLATE}';
  13. r record;
  14. BEGIN
  15. RAISE NOTICE 'Loon %', schema_name || '.links';
  16. EXECUTE format('DROP TABLE IF EXISTS %I.links CASCADE', schema_name);
  17. EXECUTE format('CREATE TABLE %I.links (LIKE %I.%I INCLUDING ALL)', schema_name, schema_name, template_name);
  18. FOR r IN
  19. EXECUTE format('SELECT tablename FROM pg_tables WHERE schemaname = %L AND tablename LIKE %L', schema_name, 'links_%')
  20. LOOP
  21. EXECUTE format('INSERT INTO %I.links SELECT * FROM %I.%I', schema_name, schema_name, r.tablename);
  22. END LOOP;
  23. -- Loo ruumiline indeks
  24. EXECUTE format('CREATE INDEX links_geom_idx ON %I.links USING GIST (geom)', schema_name);
  25. END
  26. \$\$;
  27. EOF
  28. psql ${CONNECTION_NAME} -d ${destination_dbname} <<EOF
  29. -- SQL-plokk, mis eemaldab ainult maakondade jagatud lõikude duplikaadid
  30. DO \$\$
  31. DECLARE
  32. schema_name text := '${destination_schema}';
  33. BEGIN
  34. -- Eemalda duplikaatsed geomeetriad, mida esineb rohkem kui 1 kord
  35. EXECUTE format(
  36. 'DELETE FROM %I.links a
  37. USING (
  38. SELECT geom, MIN(ctid) AS keep_ctid
  39. FROM %I.links
  40. GROUP BY geom
  41. HAVING COUNT(*) > 1
  42. ) b
  43. WHERE a.geom = b.geom AND a.ctid <> b.keep_ctid',
  44. schema_name, schema_name
  45. );
  46. END\$\$;
  47. EOF
  48. psql ${CONNECTION_NAME} -d ${destination_dbname} <<EOF
  49. -- 3. Eemalda isoleeritud lõigud (st mõlemad tipud ei esine mujal)
  50. DO \$\$
  51. DECLARE
  52. schema_name text := '${destination_schema}';
  53. BEGIN
  54. -- Loo ajutine tiputabel
  55. EXECUTE format('
  56. DROP TABLE IF EXISTS %I.links_vertices;
  57. CREATE UNLOGGED TABLE %I.links_vertices AS
  58. SELECT ST_StartPoint(geom) AS pt FROM %I.links
  59. UNION ALL
  60. SELECT ST_EndPoint(geom) FROM %I.links;', schema_name, schema_name, schema_name, schema_name
  61. );
  62. -- Eemalda lõigud, millel puuduvad ühendused teiste tippudega
  63. EXECUTE format('
  64. DELETE FROM %I.links l
  65. WHERE NOT EXISTS (
  66. SELECT 1 FROM %I.links_vertices v
  67. WHERE ST_DWithin(ST_StartPoint(l.geom), v.pt, 0.001)
  68. AND EXISTS (
  69. SELECT 1 FROM %I.links_vertices vv
  70. WHERE NOT ST_Equals(vv.pt, v.pt) AND ST_DWithin(ST_EndPoint(l.geom), vv.pt, 0.001)
  71. )
  72. );',
  73. schema_name, schema_name, schema_name
  74. );
  75. END\$\$;
  76. EOF