File: geometry_cast.sql

package info (click to toggle)
postgis 3.3.2%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 87,748 kB
  • sloc: ansic: 158,671; sql: 91,546; xml: 54,004; cpp: 12,339; sh: 5,187; perl: 5,100; makefile: 3,085; python: 1,205; yacc: 447; lex: 151; javascript: 6
file content (126 lines) | stat: -rw-r--r-- 3,853 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
\set VERBOSITY terse
set client_min_messages to WARNING;

select NULL FROM createtopology('tt', 4326);

-- layer 1 is PUNTUAL
CREATE TABLE tt.f_point(lbl text primary key);
SELECT NULL FROM AddTopoGeometryColumn('tt', 'tt', 'f_point', 'g', 'POINT');

-- layer 2 is LINEAL
CREATE TABLE tt.f_line(lbl text primary key );
SELECT NULL FROM AddTopoGeometryColumn('tt', 'tt', 'f_line', 'g', 'LINE');

-- layer 3 is AREAL
CREATE TABLE tt.f_area(lbl text primary key);
SELECT NULL FROM AddTopoGeometryColumn('tt', 'tt', 'f_area', 'g', 'POLYGON');

-- layer 4 is MIXED
CREATE TABLE tt.f_coll(lbl text primary key);
SELECT NULL FROM AddTopoGeometryColumn('tt', 'tt', 'f_coll', 'g', 'COLLECTION');

-- layer 5 is HIERARCHICAL PUNTUAL
CREATE TABLE tt.f_hier_point(lbl text primary key);
SELECT NULL FROM AddTopoGeometryColumn('tt', 'tt', 'f_hier_point', 'g', 'POINT', 1);

-- layer 6 is HIERARCHICAL LINEAL
CREATE TABLE tt.f_hier_line(lbl text primary key);
SELECT NULL FROM AddTopoGeometryColumn('tt', 'tt', 'f_hier_line', 'g', 'LINE', 2);

-- layer 7 is HIERARCHICAL AREAL
CREATE TABLE tt.f_hier_area(lbl text primary key);
SELECT NULL FROM AddTopoGeometryColumn('tt', 'tt', 'f_hier_area', 'g', 'POLYGON', 3);

-- layer 8 is HIERARCHICAL MIXED
CREATE TABLE tt.f_hier_coll(lbl text primary key);
SELECT NULL FROM AddTopoGeometryColumn('tt', 'tt', 'f_hier_coll', 'g', 'COLLECTION', 4);


-- Cast empties
SELECT 'empty', 'puntal', ST_AsEWKT(CreateTopoGeom('tt', 1, 1)::geometry);
SELECT 'empty', 'lineal', ST_AsEWKT(CreateTopoGeom('tt', 2, 2)::geometry);
SELECT 'empty', 'areal', ST_AsEWKT(CreateTopoGeom('tt', 3, 3)::geometry);
SELECT 'empty', 'mixed', ST_AsEWKT(CreateTopoGeom('tt', 4, 4)::geometry);

SELECT 'empty', 'hier', 'puntal', ST_AsEWKT(CreateTopoGeom('tt', 1, 5)::geometry);
SELECT 'empty', 'hier', 'lineal', ST_AsEWKT(CreateTopoGeom('tt', 2, 6)::geometry);
SELECT 'empty', 'hier', 'areal', ST_AsEWKT(CreateTopoGeom('tt', 3, 7)::geometry);
SELECT 'empty', 'hier', 'mixed', ST_AsEWKT(CreateTopoGeom('tt', 4, 8)::geometry);

-- Cast directed lineal
-- See https://trac.osgeo.org/postgis/ticket/4881

-- Insert 3 horizontal edge going in mixed directions
-- Odd ids: left-to-right
-- Even ids: right-to-left
INSERT INTO tt.node(node_id, containing_face, geom) VALUES
( 1, NULL, 'SRID=4326;POINT(1 0)' ),
( 2, NULL, 'SRID=4326;POINT(2 0)' ),
( 3, NULL, 'SRID=4326;POINT(3 0)' ),
( 4, NULL, 'SRID=4326;POINT(4 0)' )
;
SELECT NULL FROM setval('tt.node_node_id_seq', 3);
INSERT INTO tt.edge(
  edge_id, start_node, end_node,
  next_left_edge, next_right_edge,
  left_face, right_face,
  geom
)
VALUES (
  1, 1, 2,
  -2, 1,
  0, 0,
  'SRID=4326;LINESTRING(0 0, 1 0)'
),(
  2, 3, 2,
  -1, 2,
  0, 0,
  'SRID=4326;LINESTRING(2 0, 1 0)'
),(
  3, 3, 4,
  -3, 2,
  0, 0,
  'SRID=4326;LINESTRING(2 0, 3 0)'
)
;
SELECT NULL FROM setval('tt.edge_data_edge_id_seq', 2);

-- Insert two lines using the horizontal edge
-- in opposite directions
INSERT INTO tt.f_line(lbl, g) VALUES (
  'dir.2r', CreateTopoGeom('tt', 2, 2, '{{1,2},{-2,2},{3,2}}')
), (
  'dir.2l', CreateTopoGeom('tt', 2, 2, '{{-1,2},{-3,2},{2,2}}')
), (
  'dir.multi.2r', CreateTopoGeom('tt', 2, 2, '{{1,2},{3,2}}')
), (
  'dir.multi.2l', CreateTopoGeom('tt', 2, 2, '{{-1,2},{-3,2}}')
), (
  'dir.multi.converge', CreateTopoGeom('tt', 2, 2, '{{1,2},{-3,2}}')
), (
  'dir.multi.diverge', CreateTopoGeom('tt', 2, 2, '{{-1,2},{3,2}}')
);

-- Check out lines are rendered with direction
-- based on their signed element_id
SELECT
  '#4881',
  'E',
  e.edge_id,
  ST_AsText(e.geom)
FROM tt.edge e
ORDER BY e.edge_id;

SELECT
  '#4881',
  l.lbl,
  ST_AsEWKT(ST_CollectionHomogenize(l.g::geometry)),
  array_agg(r.element_id ORDER BY abs(r.element_id))
FROM tt.f_line l, tt.relation r
WHERE lbl like 'dir.%'
AND r.topogeo_id = id(l.g)
GROUP BY 1,2,3
ORDER BY lbl;

-- Cleanup
SELECT NULL FROM DropTopology('tt');