@@ -4,6 +4,7 @@ WITH signs AS (
4
4
jsonb_array_elements(data- > ' extensions' - > ' psl_sncf' - > ' announcement' )- > ' position'
5
5
)::float AS position,
6
6
jsonb_array_elements(data- > ' extensions' - > ' psl_sncf' - > ' announcement' )- >> ' track' AS track_id,
7
+ jsonb_array_elements(data- > ' extensions' - > ' psl_sncf' - > ' announcement' )- >> ' direction' AS direction,
7
8
jsonb_array_elements(data- > ' extensions' - > ' psl_sncf' - > ' announcement' ) AS data
8
9
FROM infra_object_speed_section
9
10
WHERE infra_id = $1
@@ -14,6 +15,7 @@ WITH signs AS (
14
15
jsonb_array_elements(data- > ' extensions' - > ' psl_sncf' - > ' r' )- > ' position'
15
16
)::float AS position,
16
17
jsonb_array_elements(data- > ' extensions' - > ' psl_sncf' - > ' r' )- >> ' track' AS track_id,
18
+ jsonb_array_elements(data- > ' extensions' - > ' psl_sncf' - > ' r' )- >> ' direction' AS direction,
17
19
jsonb_array_elements(data- > ' extensions' - > ' psl_sncf' - > ' r' ) AS data
18
20
FROM infra_object_speed_section
19
21
WHERE infra_id = $1
@@ -22,6 +24,7 @@ WITH signs AS (
22
24
SELECT obj_id AS sc_id,
23
25
(data- > ' extensions' - > ' psl_sncf' - > ' z' - > ' position' )::float AS position,
24
26
data- > ' extensions' - > ' psl_sncf' - > ' z' - >> ' track' AS track_id,
27
+ data- > ' extensions' - > ' psl_sncf' - > ' z' - >> ' direction' AS direction,
25
28
data- > ' extensions' - > ' psl_sncf' - > ' z' AS data
26
29
FROM infra_object_speed_section
27
30
WHERE infra_id = $1
@@ -30,36 +33,57 @@ WITH signs AS (
30
33
collect AS (
31
34
SELECT signs .sc_id ,
32
35
signs .data ,
33
- ST_LineInterpolatePoint(
34
- tracks_layer .geographic ,
35
- LEAST(
36
- GREATEST(
37
- signs .position / (tracks .data - > ' length' )::float,
38
- 0 .
39
- ),
40
- 1 .
41
- )
42
- ) AS geo,
43
- ST_LineInterpolatePoint(
44
- tracks_layer .schematic ,
45
- LEAST(
46
- GREATEST(
47
- signs .position / (tracks .data - > ' length' )::float,
48
- 0 .
49
- ),
50
- 1 .
51
- )
52
- ) AS sch
36
+ tracks_layer .geographic AS track_geo,
37
+ tracks_layer .schematic AS track_sch,
38
+ LEAST(
39
+ GREATEST(position / (tracks .data - >> ' length' )::float, 0 .),
40
+ 1 .
41
+ ) AS norm_pos,
42
+ CASE
43
+ direction
44
+ WHEN ' STOP_TO_START' THEN 180 .
45
+ ELSE 0 .
46
+ END AS angle_direction
53
47
FROM signs
54
48
INNER JOIN infra_object_track_section AS tracks ON tracks .obj_id = signs .track_id
55
49
AND tracks .infra_id = $1
56
- INNER JOIN infra_layer_track_section AS tracks_layer ON tracks . obj_id = tracks_layer .obj_id
50
+ INNER JOIN infra_layer_track_section AS tracks_layer ON signs . track_id = tracks_layer .obj_id
57
51
AND tracks .infra_id = tracks_layer .infra_id
58
52
)
59
- INSERT INTO infra_layer_psl_sign (obj_id, infra_id, geographic, schematic, data)
60
- SELECT sc_id,
53
+ INSERT INTO infra_layer_psl_sign (
54
+ obj_id,
55
+ infra_id,
56
+ geographic,
57
+ schematic,
58
+ angle_geo,
59
+ angle_sch,
60
+ data
61
+ )
62
+ SELECT DISTINCT ON (
63
+ ST_LineInterpolatePoint(track_geo, norm_pos),
64
+ ST_LineInterpolatePoint(track_sch, norm_pos),
65
+ (data- >> ' type' )::text
66
+ ) collect .sc_id ,
61
67
$1 ,
62
- geo,
63
- sch,
64
- data
68
+ ST_LineInterpolatePoint(track_geo, norm_pos),
69
+ ST_LineInterpolatePoint(track_sch, norm_pos),
70
+ COALESCE(
71
+ degrees(
72
+ ST_Azimuth(
73
+ ST_LineInterpolatePoint(track_geo, GREATEST(norm_pos - 0 .0001 , 0 .)),
74
+ ST_LineInterpolatePoint(track_geo, LEAST(norm_pos + 0 .0001 , 1 .))
75
+ )
76
+ ) + angle_direction,
77
+ 0 .
78
+ ),
79
+ COALESCE(
80
+ degrees(
81
+ ST_Azimuth(
82
+ ST_LineInterpolatePoint(track_sch, GREATEST(norm_pos - 0 .0001 , 0 .)),
83
+ ST_LineInterpolatePoint(track_sch, LEAST(norm_pos + 0 .0001 , 1 .))
84
+ )
85
+ ) + angle_direction,
86
+ 0 .
87
+ ),
88
+ collect .data
65
89
FROM collect
0 commit comments