Skip to content

Commit 93a8cc3

Browse files
committed
editoast: fix psl signs angle
1 parent 04c1192 commit 93a8cc3

File tree

13 files changed

+121
-74
lines changed

13 files changed

+121
-74
lines changed

editoast/map_layers.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,11 @@ layers:
169169
geo:
170170
on_field: geographic
171171
cache_duration: 3600
172-
data_expr: layer.data
172+
data_expr: layer.data || jsonb_build_object('angle', layer.angle_geo)
173173
sch:
174174
on_field: schematic
175175
cache_duration: 3600
176-
data_expr: layer.data
176+
data_expr: layer.data || jsonb_build_object('angle', layer.angle_geo)
177177

178178
neutral_signs:
179179
table_name: infra_layer_neutral_sign
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
DROP TABLE infra_layer_neutral_sign;
2+
ALTER TABLE infra_layer_psl_sign DROP COLUMN angle_geo;
3+
ALTER TABLE infra_layer_psl_sign DROP COLUMN angle_sch;
24
UPDATE infra
35
SET railjson_version = '3.4.8';

editoast/migrations/2024-01-30-232707_add_neutral_sign/up.sql

+4
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,9 @@ CREATE TABLE infra_layer_neutral_sign (
1010
);
1111
CREATE INDEX infra_layer_neutral_sign_geographic ON infra_layer_neutral_sign USING gist (geographic);
1212
CREATE INDEX infra_layer_neutral_sign_schematic ON infra_layer_neutral_sign USING gist (schematic);
13+
ALTER TABLE infra_layer_psl_sign
14+
ADD COLUMN angle_geo float8 DEFAULT 0;
15+
ALTER TABLE infra_layer_psl_sign
16+
ADD COLUMN angle_sch float8 DEFAULT 0;
1317
UPDATE infra
1418
SET railjson_version = '3.4.9';

editoast/src/generated_data/sql/generate_psl_sign_layer.sql

+50-26
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ WITH signs AS (
44
jsonb_array_elements(data->'extensions'->'psl_sncf'->'announcement')->'position'
55
)::float AS position,
66
jsonb_array_elements(data->'extensions'->'psl_sncf'->'announcement')->>'track' AS track_id,
7+
jsonb_array_elements(data->'extensions'->'psl_sncf'->'announcement')->>'direction' AS direction,
78
jsonb_array_elements(data->'extensions'->'psl_sncf'->'announcement') AS data
89
FROM infra_object_speed_section
910
WHERE infra_id = $1
@@ -14,6 +15,7 @@ WITH signs AS (
1415
jsonb_array_elements(data->'extensions'->'psl_sncf'->'r')->'position'
1516
)::float AS position,
1617
jsonb_array_elements(data->'extensions'->'psl_sncf'->'r')->>'track' AS track_id,
18+
jsonb_array_elements(data->'extensions'->'psl_sncf'->'r')->>'direction' AS direction,
1719
jsonb_array_elements(data->'extensions'->'psl_sncf'->'r') AS data
1820
FROM infra_object_speed_section
1921
WHERE infra_id = $1
@@ -22,6 +24,7 @@ WITH signs AS (
2224
SELECT obj_id AS sc_id,
2325
(data->'extensions'->'psl_sncf'->'z'->'position')::float AS position,
2426
data->'extensions'->'psl_sncf'->'z'->>'track' AS track_id,
27+
data->'extensions'->'psl_sncf'->'z'->>'direction' AS direction,
2528
data->'extensions'->'psl_sncf'->'z' AS data
2629
FROM infra_object_speed_section
2730
WHERE infra_id = $1
@@ -30,36 +33,57 @@ WITH signs AS (
3033
collect AS (
3134
SELECT signs.sc_id,
3235
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
5347
FROM signs
5448
INNER JOIN infra_object_track_section AS tracks ON tracks.obj_id = signs.track_id
5549
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
5751
AND tracks.infra_id = tracks_layer.infra_id
5852
)
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,
6167
$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
6589
FROM collect

editoast/src/generated_data/sql/insert_psl_sign_layer.sql

+50-26
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ WITH signs AS (
44
jsonb_array_elements(data->'extensions'->'psl_sncf'->'announcement')->'position'
55
)::float AS position,
66
jsonb_array_elements(data->'extensions'->'psl_sncf'->'announcement')->>'track' AS track_id,
7+
jsonb_array_elements(data->'extensions'->'psl_sncf'->'announcement')->>'direction' AS direction,
78
jsonb_array_elements(data->'extensions'->'psl_sncf'->'announcement') AS data
89
FROM infra_object_speed_section
910
WHERE infra_id = $1
@@ -15,6 +16,7 @@ WITH signs AS (
1516
jsonb_array_elements(data->'extensions'->'psl_sncf'->'r')->'position'
1617
)::float AS position,
1718
jsonb_array_elements(data->'extensions'->'psl_sncf'->'r')->>'track' AS track_id,
19+
jsonb_array_elements(data->'extensions'->'psl_sncf'->'r')->>'direction' AS direction,
1820
jsonb_array_elements(data->'extensions'->'psl_sncf'->'r') AS data
1921
FROM infra_object_speed_section
2022
WHERE infra_id = $1
@@ -24,6 +26,7 @@ WITH signs AS (
2426
SELECT obj_id AS sc_id,
2527
(data->'extensions'->'psl_sncf'->'z'->'position')::float AS position,
2628
data->'extensions'->'psl_sncf'->'z'->>'track' AS track_id,
29+
data->'extensions'->'psl_sncf'->'z'->>'direction' AS direction,
2730
data->'extensions'->'psl_sncf'->'z' AS data
2831
FROM infra_object_speed_section
2932
WHERE infra_id = $1
@@ -33,36 +36,57 @@ WITH signs AS (
3336
collect AS (
3437
SELECT signs.sc_id,
3538
signs.data,
36-
ST_LineInterpolatePoint(
37-
tracks_layer.geographic,
38-
LEAST(
39-
GREATEST(
40-
signs.position / (tracks.data->'length')::float,
41-
0.
42-
),
43-
1.
44-
)
45-
) AS geo,
46-
ST_LineInterpolatePoint(
47-
tracks_layer.schematic,
48-
LEAST(
49-
GREATEST(
50-
signs.position / (tracks.data->'length')::float,
51-
0.
52-
),
53-
1.
54-
)
55-
) AS sch
39+
tracks_layer.geographic AS track_geo,
40+
tracks_layer.schematic AS track_sch,
41+
LEAST(
42+
GREATEST(position / (tracks.data->>'length')::float, 0.),
43+
1.
44+
) AS norm_pos,
45+
CASE
46+
direction
47+
WHEN 'STOP_TO_START' THEN 180.
48+
ELSE 0.
49+
END AS angle_direction
5650
FROM signs
5751
INNER JOIN infra_object_track_section AS tracks ON tracks.obj_id = signs.track_id
5852
AND tracks.infra_id = $1
59-
INNER JOIN infra_layer_track_section AS tracks_layer ON tracks.obj_id = tracks_layer.obj_id
53+
INNER JOIN infra_layer_track_section AS tracks_layer ON signs.track_id = tracks_layer.obj_id
6054
AND tracks.infra_id = tracks_layer.infra_id
6155
)
62-
INSERT INTO infra_layer_psl_sign (obj_id, infra_id, geographic, schematic, data)
63-
SELECT sc_id,
56+
INSERT INTO infra_layer_psl_sign (
57+
obj_id,
58+
infra_id,
59+
geographic,
60+
schematic,
61+
angle_geo,
62+
angle_sch,
63+
data
64+
)
65+
SELECT DISTINCT ON (
66+
ST_LineInterpolatePoint(track_geo, norm_pos),
67+
ST_LineInterpolatePoint(track_sch, norm_pos),
68+
(data->>'type')::text
69+
) collect.sc_id,
6470
$1,
65-
geo,
66-
sch,
67-
data
71+
ST_LineInterpolatePoint(track_geo, norm_pos),
72+
ST_LineInterpolatePoint(track_sch, norm_pos),
73+
COALESCE(
74+
degrees(
75+
ST_Azimuth(
76+
ST_LineInterpolatePoint(track_geo, GREATEST(norm_pos - 0.0001, 0.)),
77+
ST_LineInterpolatePoint(track_geo, LEAST(norm_pos + 0.0001, 1.))
78+
)
79+
) + angle_direction,
80+
0.
81+
),
82+
COALESCE(
83+
degrees(
84+
ST_Azimuth(
85+
ST_LineInterpolatePoint(track_sch, GREATEST(norm_pos - 0.0001, 0.)),
86+
ST_LineInterpolatePoint(track_sch, LEAST(norm_pos + 0.0001, 1.))
87+
)
88+
) + angle_direction,
89+
0.
90+
),
91+
collect.data
6892
FROM collect

editoast/src/tables.rs

+2
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ diesel::table! {
160160
schematic -> Geometry,
161161
data -> Jsonb,
162162
infra_id -> Int8,
163+
angle_geo -> Nullable<Float8>,
164+
angle_sch -> Nullable<Float8>,
163165
}
164166
}
165167

editoast/src/views/layers/mod.rs

-4
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,6 @@ async fn cache_and_get_mvt_tile(
193193

194194
let geo_json_query = get_geo_json_sql_query(&layer.table_name, view);
195195
let mut conn = db_pool.get().await?;
196-
println!("{}", geo_json_query.clone());
197-
println!("{}", z);
198-
println!("{}", x);
199-
println!("{}", y);
200196
let records = sql_query(geo_json_query)
201197
.bind::<Integer, _>(z as i32)
202198
.bind::<Integer, _>(x as i32)

front/src/applications/editor/tools/rangeEdition/components.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,7 @@ export const RangeEditionLeftPanel = () => {
278278
announcement: [],
279279
r: [],
280280
z: {
281-
angle_sch: 0,
282-
angle_geo: 0,
281+
angle: 0,
283282
position: firstRange.begin,
284283
side: 'LEFT',
285284
track: firstRange.track,

front/src/applications/editor/tools/rangeEdition/speedSection/EditPSLSection.tsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ const getNewAnnouncementSign = (
2525
const speedInKmH = msToKmh(speedLimit);
2626
const speedMultipleOfFive = Math.ceil(speedInKmH / 5) * 5;
2727
return {
28-
angle_geo: 0,
29-
angle_sch: 0,
28+
angle: 0,
3029
position: firstRange.begin,
3130
side: 'LEFT',
3231
track: firstRange.track,
@@ -41,8 +40,7 @@ const getNewRSign = (
4140
) => {
4241
const lastRange = trackRanges[trackRanges.length - 1];
4342
return {
44-
angle_geo: 0,
45-
angle_sch: 0,
43+
angle: 0,
4644
position: lastRange.end,
4745
side: 'LEFT',
4846
track: lastRange.track,

front/src/applications/editor/tools/rangeEdition/speedSection/PslSignCard.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ const PslSignCard = ({
3939
type="number"
4040
id="psl-angle-geo"
4141
label={t('Editor.tools.speed-edition.sign-angle-geo')}
42-
value={!isNil(sign.angle_geo) ? sign.angle_geo : 0}
42+
value={!isNil(sign.angle) ? sign.angle : 0}
4343
onChange={(e) =>
4444
updateSign(signInfo, {
4545
...sign,
46-
angle_geo: Number(e.target.value),
46+
angle: Number(e.target.value),
4747
})
4848
}
4949
sm
@@ -53,11 +53,11 @@ const PslSignCard = ({
5353
type="number"
5454
id="psl-angle-sch"
5555
label={t('Editor.tools.speed-edition.sign-angle-sch')}
56-
value={!isNil(sign.angle_sch) ? sign.angle_sch : 0}
56+
value={!isNil(sign.angle) ? sign.angle : 0}
5757
onChange={(e) =>
5858
updateSign(signInfo, {
5959
...sign,
60-
angle_sch: Number(e.target.value),
60+
angle: Number(e.target.value),
6161
})
6262
}
6363
sm

front/src/applications/editor/tools/rangeEdition/types.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ export type TrackRangeExtremityFeature = Feature<
2424
export type PslSignFeature = Feature<
2525
Point,
2626
{
27-
angle_sch: number;
28-
angle_geo: number;
27+
angle: number;
2928
position: number;
3029
side: 'LEFT' | 'CENTER' | 'RIGHT';
3130
track: string;

front/src/common/Map/Layers/extensions/SNCF/PSLSigns.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export function getPSLSignsLayerProps({
5858
],
5959
],
6060
'icon-rotation-alignment': 'map',
61-
'icon-rotate': ['get', 'angle_geo'],
61+
'icon-rotate': ['get', 'angle'],
6262
'icon-allow-overlap': true,
6363
'icon-ignore-placement': false,
6464
},
@@ -83,7 +83,7 @@ export default function SNCF_PSL_Signs(props: SNCF_PSL_SignsProps) {
8383

8484
const mastsParams: LayerProps = getCommonSignsMastLayerProps({
8585
sourceTable: 'psl_signs',
86-
anglePropertyName: 'angle_geo',
86+
anglePropertyName: 'angle',
8787
});
8888

8989
const KPLabelsParams: LayerProps = getKPLabelLayerProps({

front/src/types/editor.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ export interface TrackSectionEntity
4747
export const APPLICABLE_DIRECTIONS = ['BOTH', 'START_TO_STOP', 'STOP_TO_START'] as const;
4848
export type ApplicableDirection = (typeof APPLICABLE_DIRECTIONS)[number];
4949
export interface PSLSign {
50-
angle_sch: number;
51-
angle_geo: number;
50+
angle: number;
5251
position: number;
5352
side: 'LEFT' | 'RIGHT' | 'CENTER';
5453
track: string;

0 commit comments

Comments
 (0)