Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
Interactive Isochrone Map of Swiss Public Transport
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
orestis.malaspin
Interactive Isochrone Map of Swiss Public Transport
Commits
09bc42d7
Commit
09bc42d7
authored
10 months ago
by
Florian Burgener
Browse files
Options
Downloads
Patches
Plain Diff
Error handling
parent
5ab216a8
Branches
Branches containing commit
Tags
v0.1.0
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
scripts/a.py
+0
-277
0 additions, 277 deletions
scripts/a.py
src/assets/js/app.js
+56
-10
56 additions, 10 deletions
src/assets/js/app.js
src/index.html
+7
-12
7 additions, 12 deletions
src/index.html
with
63 additions
and
299 deletions
scripts/a.py
deleted
100644 → 0
+
0
−
277
View file @
5ab216a8
import
matplotlib.pyplot
as
plt
import
numpy
as
np
import
networkx
as
nx
from
shapely.geometry
import
Polygon
# Points
points
=
np
.
array
([[
2488912.0
,
1115153.0
],
[
2488979.0
,
1114141.0
],
[
2498627.0
,
1117834.0
],
[
2499819.0
,
1119645.0
],
[
2498359.0
,
1113540.0
],
[
2487828.0
,
1112948.0
],
[
2494806.0
,
1114873.0
],
[
2499616.0
,
1116520.0
],
[
2499281.0
,
1116589.0
],
[
2497915.0
,
1115857.0
],
[
2499975.0
,
1117114.0
],
[
2497142.0
,
1119572.0
],
[
2488745.0
,
1114763.0
],
[
2494041.0
,
1114769.0
],
[
2496242.0
,
1119699.0
],
[
2499648.0
,
1118428.0
],
[
2499369.0
,
1115509.0
],
[
2500332.0
,
1118330.0
],
[
2490359.0
,
1113416.0
],
[
2486535.0
,
1112032.0
],
[
2498295.0
,
1113913.0
],
[
2495333.0
,
1121462.0
],
[
2493597.0
,
1114661.0
],
[
2500656.0
,
1117699.0
],
[
2497225.0
,
1120644.0
],
[
2500321.0
,
1117673.0
],
[
2493237.0
,
1113488.0
],
[
2487515.0
,
1117697.0
],
[
2491775.0
,
1119342.0
],
[
2494041.0
,
1119836.0
],
[
2500154.0
,
1119824.0
],
[
2500402.0
,
1119186.0
],
[
2488553.0
,
1116943.0
],
[
2499469.0
,
1117097.0
],
[
2496829.0
,
1120305.0
],
[
2493423.0
,
1113262.0
],
[
2500527.0
,
1118645.0
],
[
2499736.0
,
1119816.0
],
[
2499326.0
,
1118992.0
],
[
2500050.0
,
1118238.0
],
[
2499270.0
,
1117680.0
],
[
2500753.0
,
1117527.0
],
[
2493940.0
,
1117414.0
],
[
2499788.0
,
1117456.0
],
[
2493571.0
,
1120018.0
],
[
2496388.0
,
1119533.0
],
[
2494533.0
,
1120651.0
],
[
2493600.0
,
1114365.0
],
[
2496207.0
,
1115659.0
],
[
2498573.0
,
1115793.0
],
[
2491553.0
,
1119000.0
],
[
2495600.0
,
1119250.0
],
[
2499399.0
,
1115714.0
],
[
2488894.0
,
1115135.0
],
[
2496696.0
,
1116410.0
],
[
2493296.0
,
1117149.0
],
[
2499150.0
,
1114693.0
],
[
2494349.0
,
1113299.0
],
[
2499288.0
,
1118655.0
],
[
2496912.0
,
1116287.0
],
[
2499171.0
,
1117949.0
],
[
2496914.0
,
1116506.0
],
[
2498148.0
,
1116295.0
],
[
2499432.0
,
1116312.0
],
[
2500161.0
,
1119935.0
],
[
2498783.0
,
1115972.0
],
[
2500234.0
,
1119555.0
],
[
2495049.0
,
1120436.0
],
[
2495735.0
,
1115435.0
],
[
2493038.0
,
1119778.0
],
[
2487792.0
,
1117521.0
],
[
2496227.0
,
1115259.0
],
[
2491729.0
,
1118587.0
],
[
2496939.0
,
1119488.0
],
[
2499177.0
,
1117785.0
],
[
2499620.0
,
1118736.0
],
[
2498385.0
,
1116858.0
],
[
2495817.0
,
1115035.0
],
[
2498234.0
,
1115355.0
],
[
2491799.0
,
1117508.0
],
[
2491873.0
,
1119074.0
],
[
2489551.0
,
1115765.0
],
[
2497425.0
,
1116548.0
],
[
2494090.0
,
1119794.0
],
[
2488723.0
,
1116564.0
],
[
2500400.0
,
1119982.0
],
[
2499890.0
,
1119190.0
],
[
2489269.0
,
1113883.0
],
[
2491891.0
,
1119053.0
],
[
2499662.0
,
1119484.0
],
[
2498414.0
,
1114352.0
],
[
2497453.0
,
1118044.0
],
[
2488583.0
,
1113987.0
],
[
2494934.0
,
1119901.0
],
[
2498647.0
,
1119026.0
],
[
2498507.0
,
1116671.0
],
[
2497518.0
,
1119428.0
],
[
2494566.0
,
1115021.0
],
[
2497776.0
,
1114515.0
],
[
2497093.0
,
1118740.0
],
[
2486202.0
,
1111405.0
],
[
2499571.0
,
1117311.0
],
[
2501814.0
,
1117463.0
],
[
2499731.0
,
1119167.0
],
[
2498822.0
,
1117871.0
],
[
2495823.0
,
1119383.0
],
[
2485792.0
,
1111318.0
],
[
2500942.0
,
1123625.0
],
[
2498100.0
,
1119190.0
],
[
2500314.0
,
1118144.0
],
[
2495263.0
,
1120814.0
],
[
2496503.0
,
1119828.0
],
[
2495100.0
,
1119282.0
],
[
2494946.0
,
1119906.0
],
[
2499986.0
,
1117599.0
],
[
2492476.0
,
1116165.0
],
[
2494240.0
,
1120766.0
],
[
2491082.0
,
1118374.0
],
[
2499967.0
,
1118415.0
],
[
2494570.0
,
1114688.0
],
[
2500646.0
,
1119188.0
],
[
2498553.0
,
1116033.0
],
[
2495024.0
,
1121099.0
],
[
2494822.0
,
1118597.0
],
[
2495246.0
,
1115119.0
],
[
2493771.0
,
1120441.0
],
[
2493906.0
,
1114511.0
],
[
2499944.0
,
1118161.0
],
[
2500086.0
,
1117464.0
],
[
2495947.0
,
1115729.0
],
[
2499600.0
,
1115100.0
],
[
2495085.0
,
1118827.0
],
[
2498910.0
,
1114429.0
],
[
2499880.0
,
1118772.0
],
[
2494925.0
,
1119605.0
],
[
2499120.0
,
1118319.0
],
[
2498890.0
,
1116913.0
],
[
2500364.0
,
1122923.0
],
[
2499929.0
,
1116547.0
],
[
2496997.0
,
1115960.0
],
[
2489986.0
,
1116227.0
],
[
2495940.0
,
1115536.0
],
[
2499005.0
,
1118858.0
],
[
2497274.0
,
1116681.0
],
[
2500596.0
,
1118825.0
],
[
2488339.0
,
1117110.0
],
[
2499759.0
,
1117746.0
],
[
2497855.0
,
1117041.0
],
[
2494783.0
,
1113645.0
],
[
2487415.0
,
1112733.0
],
[
2497963.0
,
1114745.0
],
[
2500399.0
,
1122132.0
],
[
2492335.0
,
1117556.0
],
[
2492431.0
,
1115892.0
],
[
2499269.0
,
1116272.0
],
[
2498073.0
,
1118482.0
],
[
2489482.0
,
1115448.0
],
[
2499047.0
,
1116116.0
],
[
2498337.0
,
1114795.0
],
[
2498329.0
,
1115591.0
],
[
2499824.0
,
1116792.0
],
[
2490325.0
,
1116210.0
],
[
2498296.0
,
1115061.0
],
[
2498180.0
,
1113981.0
],
[
2494036.0
,
1120612.0
],
[
2489330.0
,
1114571.0
],
[
2497495.0
,
1120801.0
],
[
2499495.0
,
1119268.0
],
[
2494878.0
,
1119801.0
],
[
2499969.0
,
1118468.0
],
[
2498050.0
,
1116973.0
],
[
2500419.0
,
1122878.0
],
[
2494930.0
,
1115148.0
],
[
2498892.0
,
1114497.0
],
[
2494667.0
,
1118537.0
],
[
2494391.0
,
1118402.0
],
[
2493206.0
,
1119928.0
],
[
2497682.0
,
1118619.0
],
[
2500400.0
,
1121878.0
],
[
2500209.0
,
1118791.0
],
[
2496161.0
,
1119516.0
],
[
2496262.0
,
1119732.0
],
[
2500436.0
,
1118490.0
],
[
2496700.0
,
1120102.0
],
[
2497662.0
,
1116048.0
],
[
2494353.0
,
1114581.0
],
[
2497660.0
,
1120989.0
],
[
2499304.0
,
1118142.0
],
[
2495426.0
,
1120280.0
],
[
2496942.0
,
1118901.0
],
[
2498860.0
,
1115065.0
],
[
2492725.0
,
1117213.0
],
[
2494486.0
,
1113431.0
],
[
2498799.0
,
1118272.0
],
[
2498967.0
,
1117437.0
],
[
2497035.0
,
1120556.0
],
[
2493895.0
,
1115452.0
],
[
2493407.0
,
1120097.0
],
[
2494097.0
,
1113193.0
],
[
2497140.0
,
1115813.0
],
[
2493769.0
,
1117287.0
],
[
2495035.0
,
1114952.0
],
[
2496631.0
,
1116130.0
],
[
2495304.0
,
1119106.0
],
[
2500016.0
,
1116765.0
],
[
2496754.0
,
1115732.0
],
[
2485845.0
,
1111438.0
],
[
2495371.0
,
1119303.0
],
[
2499448.0
,
1118286.0
],
[
2496652.0
,
1115539.0
],
[
2499516.0
,
1116077.0
],
[
2498194.0
,
1118825.0
],
[
2488290.0
,
1113598.0
],
[
2500557.0
,
1119591.0
],
[
2497603.0
,
1116321.0
],
[
2498644.0
,
1114766.0
],
[
2499071.0
,
1119132.0
],
[
2497602.0
,
1116765.0
],
[
2499911.0
,
1119669.0
],
[
2486709.0
,
1111980.0
],
[
2498506.0
,
1118344.0
],
[
2499207.0
,
1117324.0
],
[
2500005.0
,
1117858.0
],
[
2492306.0
,
1116676.0
],
[
2498423.0
,
1114149.0
],
[
2492313.0
,
1116330.0
],
[
2489152.0
,
1115064.0
],
[
2499738.0
,
1118100.0
],
[
2499908.0
,
1117575.0
]])
# Edges (defined by indices of points)
edges
=
np
.
array
([
[
18
,
219
],
[
219
,
100
],
[
100
,
106
],
[
106
,
206
],
[
206
,
19
],
[
19
,
149
],
[
149
,
212
],
[
212
,
12
],
[
12
,
27
],
[
27
,
28
],
[
28
,
125
],
[
125
,
164
],
[
164
,
116
],
[
116
,
21
],
[
21
,
137
],
[
137
,
107
],
[
107
,
151
],
[
151
,
178
],
[
178
,
85
],
[
85
,
213
],
[
213
,
120
],
[
120
,
102
],
[
102
,
130
],
[
130
,
56
],
[
56
,
132
],
[
132
,
4
],
[
4
,
57
],
[
57
,
198
],
[
198
,
35
],
[
35
,
18
]
])
# Create a graph from the points and edges
G
=
nx
.
Graph
()
for
i
,
point
in
enumerate
(
points
):
G
.
add_node
(
i
,
pos
=
point
)
for
edge
in
edges
:
G
.
add_edge
(
edge
[
0
],
edge
[
1
])
# Find all cycles in the graph
cycles
=
list
(
nx
.
cycle_basis
(
G
))
# Plotting
plt
.
figure
(
figsize
=
(
8
,
6
))
# Plot points
plt
.
scatter
(
points
[:,
0
],
points
[:,
1
],
color
=
'
red
'
,
zorder
=
5
)
# Plot edges
for
edge
in
edges
:
plt
.
plot
(
points
[
edge
,
0
],
points
[
edge
,
1
],
color
=
'
blue
'
)
# Fill each cycle
for
cycle
in
cycles
:
polygon_points
=
points
[
cycle
]
plt
.
fill
(
polygon_points
[:,
0
],
polygon_points
[:,
1
],
alpha
=
0.3
)
# Add labels to points
for
i
,
(
x
,
y
)
in
enumerate
(
points
):
plt
.
text
(
x
,
y
,
f
'
{
i
}
'
,
verticalalignment
=
'
bottom
'
,
horizontalalignment
=
'
right
'
)
plt
.
title
(
'
Graph with Points and Filled Polygons
'
)
plt
.
xlabel
(
'
X
'
)
plt
.
ylabel
(
'
Y
'
)
plt
.
autoscale
()
plt
.
grid
(
True
)
#plt.gca().set_aspect('equal', adjustable='box')
plt
.
show
()
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/assets/js/app.js
+
56
−
10
View file @
09bc42d7
...
@@ -3,6 +3,7 @@ const legend = document.getElementById("legend");
...
@@ -3,6 +3,7 @@ const legend = document.getElementById("legend");
const
chooseOriginPoint
=
document
.
getElementById
(
"
choose-origin-point
"
);
const
chooseOriginPoint
=
document
.
getElementById
(
"
choose-origin-point
"
);
const
originPointCoordElem
=
document
.
getElementById
(
'
origin-point-coord
'
);
const
originPointCoordElem
=
document
.
getElementById
(
'
origin-point-coord
'
);
const
mapElem
=
document
.
getElementById
(
'
map
'
);
const
mapElem
=
document
.
getElementById
(
'
map
'
);
const
formElem
=
document
.
getElementById
(
'
form
'
);
let
isChoosingOriginPoint
=
false
;
let
isChoosingOriginPoint
=
false
;
let
originPointMarker
=
null
;
let
originPointMarker
=
null
;
...
@@ -43,10 +44,50 @@ const getDisplayMode = () => {
...
@@ -43,10 +44,50 @@ const getDisplayMode = () => {
return
'
contour_line
'
;
return
'
contour_line
'
;
}
}
return
''
;
// This exception should never be thrown.
throw
new
Error
(
"
Required
"
);
};
};
const
getCurrentDateTime
=
()
=>
{
const
now
=
new
Date
();
const
year
=
now
.
getFullYear
().
toString
().
padStart
(
2
,
'
0
'
);
const
month
=
(
now
.
getMonth
()
+
1
).
toString
().
padStart
(
2
,
'
0
'
);
const
day
=
now
.
getDate
().
toString
().
padStart
(
2
,
'
0
'
);
const
hour
=
now
.
getHours
().
toString
().
padStart
(
2
,
'
0
'
);
const
minute
=
now
.
getMinutes
().
toString
().
padStart
(
2
,
'
0
'
);
return
year
+
"
-
"
+
month
+
"
-
"
+
day
+
"
"
+
hour
+
"
:
"
+
minute
;
};
departureAtInput
.
value
=
getCurrentDateTime
();
formElem
.
addEventListener
(
'
submit
'
,
async
(
e
)
=>
{
e
.
preventDefault
();
submitButton
.
disabled
=
true
;
await
computeIsochrones
();
submitButton
.
disabled
=
false
;
});
const
setMinMaxDepartureAt
=
async
()
=>
{
try
{
const
response
=
await
fetch
(
'
http://localhost:8100/metadata
'
);
const
metadata
=
await
response
.
json
();
departureAtInput
.
min
=
metadata
.
start_date
+
"
00:00
"
;
departureAtInput
.
max
=
metadata
.
end_date
+
"
23:59
"
;
}
catch
(
error
)
{
alert
(
"
Une erreur inconnue s'est produite lors du chargement des métadonnées.
"
);
return
;
}
};
setMinMaxDepartureAt
();
const
computeIsochrones
=
async
()
=>
{
const
computeIsochrones
=
async
()
=>
{
if
(
originPointCoord
===
null
)
{
alert
(
"
Vous devez d'abord choisir un point d'origine.
"
);
return
;
}
clearPreviousIsochroneMap
();
clearPreviousIsochroneMap
();
const
departureDate
=
departureAtInput
.
value
.
split
(
'
T
'
)[
0
];
const
departureDate
=
departureAtInput
.
value
.
split
(
'
T
'
)[
0
];
...
@@ -65,11 +106,22 @@ const computeIsochrones = async () => {
...
@@ -65,11 +106,22 @@ const computeIsochrones = async () => {
display_mode
:
displayMode
,
display_mode
:
displayMode
,
};
};
const
response
=
await
fetch
(
'
http://localhost:8100/isochrones?
'
+
new
URLSearchParams
(
params
).
toString
());
let
isochrones
;
const
isochrones
=
await
response
.
json
();
try
{
const
response
=
await
fetch
(
'
http://localhost:8100/isochrones?
'
+
new
URLSearchParams
(
params
).
toString
());
isochrones
=
await
response
.
json
();
}
catch
(
error
)
{
alert
(
"
Une erreur inconnue s'est produite. Veuillez réessayer.
"
);
return
;
}
if
(
isochrones
.
items
.
length
===
0
)
{
alert
(
"
La carte isochrone n'a pas pu être calculée, car aucun arrêt n'est atteignable dans le temps imparti.
"
);
return
;
}
map
.
setView
([
originPointCoord
[
0
],
originPointCoord
[
1
]]);
map
.
setView
([
originPointCoord
[
0
],
originPointCoord
[
1
]]);
console
.
log
([
isochrones
.
departure_stop_coord
.
x
,
isochrones
.
departure_stop_coord
.
y
]);
const
palette
=
[
const
palette
=
[
'
#36AB68
'
,
// Green 1.
'
#36AB68
'
,
// Green 1.
...
@@ -206,10 +258,4 @@ timeLimitInput.addEventListener('change', () => {
...
@@ -206,10 +258,4 @@ timeLimitInput.addEventListener('change', () => {
updateIsochroneIntervalOptions
();
updateIsochroneIntervalOptions
();
});
});
submitButton
.
addEventListener
(
'
click
'
,
async
()
=>
{
submitButton
.
disabled
=
true
;
await
computeIsochrones
();
submitButton
.
disabled
=
false
;
});
updateIsochroneIntervalOptions
();
updateIsochroneIntervalOptions
();
This diff is collapsed.
Click to expand it.
src/index.html
+
7
−
12
View file @
09bc42d7
...
@@ -27,7 +27,7 @@
...
@@ -27,7 +27,7 @@
<div
class=
"form-container"
>
<div
class=
"form-container"
>
<h2>
Calculer une carte isochrone
</h2>
<h2>
Calculer une carte isochrone
</h2>
<form>
<form
id=
"form"
>
<div
class=
"input-container"
>
<div
class=
"input-container"
>
<label>
Point d'origine
</label>
<label>
Point d'origine
</label>
<button
class=
"btn btn-secondary"
id=
"choose-origin-point"
type=
"button"
>
<button
class=
"btn btn-secondary"
id=
"choose-origin-point"
type=
"button"
>
...
@@ -38,22 +38,17 @@
...
@@ -38,22 +38,17 @@
<div
class=
"input-container"
>
<div
class=
"input-container"
>
<label
for=
"departure-at"
>
Date et heure de départ
</label>
<label
for=
"departure-at"
>
Date et heure de départ
</label>
<input
type=
"datetime-local"
id=
"departure-at"
value=
"2024-10-09 08:30"
>
<input
type=
"datetime-local"
id=
"departure-at"
required
>
</div>
</div>
<div
class=
"input-container"
>
<div
class=
"input-container"
>
<label
for=
"time-limit"
>
Limite de temps (en minutes)
</label>
<label
for=
"time-limit"
>
Limite de temps (en minutes)
</label>
<input
type=
"number"
id=
"time-limit"
min=
"10"
max=
"480"
value=
"60"
>
<input
type=
"number"
id=
"time-limit"
min=
"10"
max=
"480"
value=
"60"
required
>
</div>
</div>
<div
class=
"input-container"
>
<div
class=
"input-container"
>
<label
for=
"isochrone-interval"
>
Intervalle entre les isochrones
</label>
<label
for=
"isochrone-interval"
>
Intervalle entre les isochrones
</label>
<select
id=
"isochrone-interval"
>
<select
id=
"isochrone-interval"
required
></select>
<!--
<option selected disabled>Sélectionner</option>
<option>15 min.</option>
-->
</select>
</div>
</div>
<div
class=
"input-container"
>
<div
class=
"input-container"
>
...
@@ -61,17 +56,17 @@
...
@@ -61,17 +56,17 @@
<div
class=
"display-mode-container"
>
<div
class=
"display-mode-container"
>
<label>
<label>
<input
type=
"radio"
id=
"display-mode-circles"
name=
"display_mode"
checked
>
Cercles
<input
type=
"radio"
id=
"display-mode-circles"
name=
"display_mode"
required
checked
>
Cercles
</label>
</label>
<label>
<label>
<input
type=
"radio"
id=
"display-mode-contour-line"
name=
"display_mode"
>
Ligne de contour
<input
type=
"radio"
id=
"display-mode-contour-line"
name=
"display_mode"
required
>
Ligne de contour
</label>
</label>
</div>
</div>
</div>
</div>
<div
class=
"mt-6"
>
<div
class=
"mt-6"
>
<button
class=
"btn"
id=
"submit-button"
type=
"
button
"
>
<button
class=
"btn"
id=
"submit-button"
type=
"
submit
"
>
<img
src=
"./assets/images/target.png"
width=
"20"
height=
"20"
>
Calculer
<img
src=
"./assets/images/target.png"
width=
"20"
height=
"20"
>
Calculer
</button>
</button>
</div>
</div>
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment