(
Array.from(boothsById.values())
)
-
+ const [openSurvey, setOpenSurvey] = useState(false)
const [editorMode, setEditorMode] = useState(false)
+ useEffect(() => {
+ if (isSurveyDataLoaded) setOpenSurvey(!surveyData)
+ }, [surveyData, isSurveyDataLoaded])
+
+ useEffect(() => {
+ // A new survey page for filter when using mobile
+ if (openSurvey && width && width < 768) {
+ router.push("/student/map/survey")
+ }
+ }, [width])
+
+ const handleClickFilter = () => {
+ setOpenSurvey(prev => !prev)
+ if (width && width < 768) {
+ router.push("/student/map/survey")
+ }
+ }
+
return (
{!editorMode ? (
@@ -96,6 +123,20 @@ export default function MainView({
)}
+ {/* Questions Modal for filter when using PC*/}
+
+ setOpenSurvey(false)} />
+
+
+
+
,
- boothIds: BoothID[],
- stateKey: "active" | "hover" | "filtered"
-) {
- useEffect(() => {
- const map = mapRef.current
- if (map == null || boothIds.length === 0) return
-
- for (const boothId of boothIds) {
- map.setFeatureState(
- { source: "booths", id: boothId },
- { [stateKey]: true }
- )
- }
-
- return () => {
- for (const boothId of boothIds) {
- map.setFeatureState(
- { source: "booths", id: boothId },
- { [stateKey]: false }
- )
- }
- }
- }, [boothIds, stateKey])
-}
-
export function MapComponent({
boothsById,
location,
@@ -81,17 +58,28 @@ export function MapComponent({
center: [longitude, latitude],
zoom: zoom
})
- })
+ setMarkerScale(0.6)
+ }, [location])
+
+ useEffect(() => {
+ // Load icon assets for points location
+ if (mapRef && !mapRef.current?.hasImage("exit-icon")) {
+ addMapIconAssets(mapRef)
+ }
+ }, [mapRef.current])
+
+ //Change layer style data source based on selected location
+ const [geoJsonPlanData, geoJsonPlanRoutesData, geoJsonPlanRoomsData] =
+ useGeoJsonPlanData(location)
// Fly to selected booth on change
useEffect(() => {
if (activeBoothId == null) return
const booth = boothsById.get(activeBoothId)
if (!booth) return
-
mapRef.current?.flyTo({
center: booth.center as [number, number],
- zoom: 18.5,
+ zoom: 21,
speed: 0.8
})
}, [activeBoothId, boothsById])
@@ -123,10 +111,14 @@ export function MapComponent({
}
}
- function onBoothMouseEnter(e: MapLayerMouseEvent) {
+ // Avoid delays in booth switching
+ function onBoothMouseMove(e: MapLayerMouseEvent) {
const feature = e.features?.[0] as GeoJsonBooth | undefined
if (feature) {
- setHoveredBoothId(feature.properties.id)
+ const boothId = feature.properties.id
+ if (boothId !== hoveredBoothId) {
+ setHoveredBoothId(boothId)
+ }
}
}
@@ -140,7 +132,7 @@ export function MapComponent({
function onZoomChange() {
const zoom = mapRef.current?.getZoom()
if (zoom === undefined) return
- const scale = Math.max(0.3, Math.min(2, 1 + (zoom - 18) * 0.3))
+ const scale = Math.max(0.3, Math.min(2, 1 + (zoom - 20) * 0.5))
setMarkerScale(scale)
}
@@ -149,14 +141,14 @@ export function MapComponent({
+ {/** Order sensitive! */}
+
+
+
+
diff --git a/src/app/student/map/_components/QuestionnaireForm.tsx b/src/app/student/map/_components/QuestionnaireForm.tsx
new file mode 100644
index 0000000..1fb4cfd
--- /dev/null
+++ b/src/app/student/map/_components/QuestionnaireForm.tsx
@@ -0,0 +1,115 @@
+"use client"
+
+import { LOCAL_STORAGE_KEY } from "@/app/student/map/lib/survey"
+import IndustryTypeSelection from "@/app/student/map/survey/_components/IndustryTypeSelection"
+import JobTypeSelection from "@/app/student/map/survey/_components/JobTypeSelection"
+import ProgrammeSelection from "@/app/student/map/survey/_components/ProgrammeSelection"
+import { useScreenSize } from "@/components/shared/hooks/useScreenSize"
+import { useSurveyData } from "@/components/shared/hooks/useSurveyData"
+import { Page } from "@/components/shared/Page"
+import { Button } from "@/components/ui/button"
+import { ArrowLeft } from "lucide-react"
+import Link from "next/link"
+import { useRouter } from "next/navigation"
+import { useEffect, useState } from "react"
+
+export function QuestionnaireForm({ onClose }: { onClose?: () => void }) {
+ const router = useRouter()
+
+ const { width } = useScreenSize()
+
+ const { surveyData } = useSurveyData()
+
+ const [programme, setProgramme] = useState(surveyData?.Programme ?? "")
+ const [jobTypeSelection, setJobTypeSelection] = useState(
+ surveyData?.JobType ?? []
+ )
+ const [industryTypeSelection, setIndustryTypeSelection] = useState(
+ surveyData?.IndustryType ?? []
+ )
+
+ const onProgrammeSelectChange = (programme: string) => {
+ setProgramme(programme)
+ }
+
+ const onJobTypeSelect = (jobType: string) => {
+ setJobTypeSelection(prev => {
+ if (prev.includes(jobType)) {
+ return prev.filter(item => item !== jobType)
+ } else {
+ return [...prev, jobType]
+ }
+ })
+ }
+
+ const onIndustryTypeSelect = (industryType: string) => {
+ setIndustryTypeSelection(prev => {
+ if (prev.includes(industryType)) {
+ return prev.filter(item => item !== industryType)
+ } else {
+ return [...prev, industryType]
+ }
+ })
+ }
+
+ const onSubmit = () => {
+ const surveyDataToSave = {
+ Programme: programme,
+ JobType: jobTypeSelection,
+ IndustryType: industryTypeSelection
+ }
+ localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(surveyDataToSave))
+ if (onClose) {
+ onClose()
+ }
+ router.push("/student/map")
+ }
+
+ useEffect(() => {
+ if (width && width > 768) {
+ router.push("/student/map")
+ }
+ }, [width])
+
+ useEffect(() => {
+ if (surveyData) {
+ setProgramme(surveyData.Programme)
+ setJobTypeSelection(surveyData?.JobType ?? [])
+ setIndustryTypeSelection(surveyData.IndustryType ?? [])
+ }
+ }, [surveyData])
+
+ return (
+
+
PREFERENCES
+
+
+
+
+
+
+ Back to Homepage
+
+
+
+
+ )
+}
diff --git a/src/app/student/map/data/booths.json b/src/app/student/map/data/booths.json
index a11e146..b383abd 100644
--- a/src/app/student/map/data/booths.json
+++ b/src/app/student/map/data/booths.json
@@ -2,99 +2,93 @@
"type": "FeatureCollection",
"features": [
{
+ "id": 1,
"type": "Feature",
"properties": {
- "id": 2,
- "location": "nymble/1",
+ "id": 1,
+ "location": "nymble/2",
"exhibitorId": 1480
},
"geometry": {
"coordinates": [
[
- [18.07029991338672, 59.347298947935656],
- [18.070475002265198, 59.34724853882139],
- [18.070619193106694, 59.34729684755746],
- [18.07054297794724, 59.347381912773244],
- [18.07029991338672, 59.347298947935656]
+ [18.070641888358352, 59.34753482037593],
+ [18.070677245316716, 59.3475153523533],
+ [18.070636101004737, 59.34749819704916],
+ [18.070601220246914, 59.347517639681826],
+ [18.070641888358352, 59.34753482037593]
]
],
"type": "Polygon"
- },
- "id": 2
+ }
},
{
+ "id": 2,
"type": "Feature",
"properties": {
- "id": 3,
+ "id": 2,
"location": "nymble/2",
"exhibitorId": 1481
},
"geometry": {
"coordinates": [
[
- [18.069718627383196, 59.34736374888348],
- [18.069924096226515, 59.34725459950366],
- [18.070206872544077, 59.34737625788199],
- [18.07003348475709, 59.34743819281414],
- [18.06998849534679, 59.34741611419537],
- [18.06990038592093, 59.34745915540765],
- [18.069718627383196, 59.34736374888348]
+ [18.070636263079393, 59.3474980634314],
+ [18.070677410587763, 59.347515187766675],
+ [18.070710160196057, 59.347497358414216],
+ [18.07066942146642, 59.34748035805126],
+ [18.070636263079393, 59.3474980634314]
]
],
"type": "Polygon"
- },
- "id": 3
+ }
},
{
+ "id": 3,
"type": "Feature",
"properties": {
- "id": 5,
- "location": "nymble/1",
- "exhibitorId": 1519
+ "id": 3,
+ "location": "nymble/2",
+ "exhibitorId": 1482
},
"geometry": {
"coordinates": [
[
- [18.070375103584013, 59.347422622171706],
- [18.070536145622015, 59.34740928023734],
- [18.070724363503942, 59.347424674751466],
- [18.070554262851317, 59.34747701615794],
- [18.07036503845646, 59.34749241066632],
- [18.070375103584013, 59.347422622171706]
+ [18.070710321003645, 59.34749725662604],
+ [18.070669673830054, 59.34748024858581],
+ [18.070706022705878, 59.347459848025636],
+ [18.070747087443095, 59.34747708562409],
+ [18.070710321003645, 59.34749725662604]
]
],
"type": "Polygon"
- },
- "id": 5
+ }
},
{
+ "id": 5,
"type": "Feature",
"properties": {
- "id": 1,
- "location": "nymble/1",
- "exhibitorId": 1530
+ "id": 5,
+ "location": "nymble/2",
+ "exhibitorId": 1621
},
"geometry": {
"coordinates": [
[
- [18.070812322632406, 59.347317866214325],
- [18.07069365574077, 59.347232349780256],
- [18.070808503018583, 59.34720013837014],
- [18.071091766256927, 59.347249060467476],
- [18.070985336718053, 59.34733302163491],
- [18.0708514575378, 59.34736603760001],
- [18.070703868866474, 59.347354040774036],
- [18.070812322632406, 59.347317866214325]
+ [18.070706188297066, 59.347459808717076],
+ [18.070747291252644, 59.34747700512591],
+ [18.070782702786403, 59.347457754652595],
+ [18.070742598047786, 59.34743970908889],
+ [18.070706188297066, 59.347459808717076]
]
],
"type": "Polygon"
- },
- "id": 1
+ }
},
{
"type": "Feature",
"properties": {
- "id": 4,
+ "id": 30,
"location": "library",
"exhibitorId": 1531
},
@@ -113,24 +107,1578 @@
],
"type": "Polygon"
},
- "id": 4
+ "id": 30
+ },
+ {
+ "id": 31,
+ "type": "Feature",
+ "properties": {
+ "id": 31,
+ "location": "nymble/2",
+ "exhibitorId": 1483
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07074292112904, 59.34743958608374],
+ [18.070782879529133, 59.34745756088711],
+ [18.070818820855123, 59.34743747767803],
+ [18.07077923331167, 59.34741991261092],
+ [18.07074292112904, 59.34743958608374]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 32,
+ "type": "Feature",
+ "properties": {
+ "id": 32,
+ "location": "nymble/2",
+ "exhibitorId": 1484
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07077938744672, 59.3474199016585],
+ [18.070818965216375, 59.34743736426083],
+ [18.070854269867567, 59.347417555954166],
+ [18.070814693049385, 59.34740077658506],
+ [18.07077938744672, 59.3474199016585]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 33,
+ "type": "Feature",
+ "properties": {
+ "id": 33,
+ "location": "nymble/2",
+ "exhibitorId": 1485
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070814778968213, 59.34740057682805],
+ [18.070854722517765, 59.347417306474966],
+ [18.07089316483072, 59.34739598739537],
+ [18.070855045720776, 59.34737890917066],
+ [18.070814778968213, 59.34740057682805]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 34,
+ "type": "Feature",
+ "properties": {
+ "id": 34,
+ "location": "nymble/2",
+ "exhibitorId": 1486
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07080632148117, 59.34735896237271],
+ [18.07085842969164, 59.34737762318895],
+ [18.070888333884113, 59.347357146680565],
+ [18.070834105695013, 59.34733947616678],
+ [18.07080632148117, 59.34735896237271]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 35,
+ "type": "Feature",
+ "properties": {
+ "id": 35,
+ "location": "nymble/2",
+ "exhibitorId": 1487
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07050580390927, 59.34743766367603],
+ [18.070549461505493, 59.34745858801725],
+ [18.07058864212496, 59.34743778076714],
+ [18.070544260343553, 59.347416499474974],
+ [18.07050580390927, 59.34743766367603]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 36,
+ "type": "Feature",
+ "properties": {
+ "id": 36,
+ "location": "nymble/2",
+ "exhibitorId": 1488
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070544456000135, 59.34741637283685],
+ [18.070588782008855, 59.34743776051755],
+ [18.07062967741541, 59.34741524120946],
+ [18.07058664431989, 59.34739385363713],
+ [18.070544456000135, 59.34741637283685]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 37,
+ "type": "Feature",
+ "properties": {
+ "id": 37,
+ "location": "nymble/2",
+ "exhibitorId": 1631
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07058678970344, 59.34739382696833],
+ [18.07062996789034, 59.347415201366715],
+ [18.070671269298686, 59.347393175801955],
+ [18.07062815237677, 59.34737137769673],
+ [18.07058678970344, 59.34739382696833]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 38,
+ "type": "Feature",
+ "properties": {
+ "id": 38,
+ "location": "nymble/2",
+ "exhibitorId": 1489
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070628160363867, 59.34737138790538],
+ [18.07067150708039, 59.34739315748007],
+ [18.07071106811412, 59.347371986092156],
+ [18.07066743348736, 59.34735003067985],
+ [18.070628160363867, 59.34737138790538]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 39,
+ "type": "Feature",
+ "properties": {
+ "id": 39,
+ "location": "nymble/2",
+ "exhibitorId": 1490
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070667549324156, 59.347349811267605],
+ [18.07071103916965, 59.347371959879695],
+ [18.070764308610165, 59.34734366090001],
+ [18.070718989712077, 59.34732213809795],
+ [18.070667549324156, 59.347349811267605]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 40,
+ "type": "Feature",
+ "properties": {
+ "id": 40,
+ "location": "nymble/2",
+ "exhibitorId": 1491
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070950120106687, 59.34736679779584],
+ [18.070969675256976, 59.34734725024907],
+ [18.070995231148572, 59.34735462611374],
+ [18.07097129442363, 59.34737284985147],
+ [18.070950120106687, 59.34736679779584]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 41,
+ "type": "Feature",
+ "properties": {
+ "id": 41,
+ "location": "nymble/2",
+ "exhibitorId": 1624
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070995155943592, 59.34735468491024],
+ [18.07101935837767, 59.34736172739329],
+ [18.071001665571202, 59.347373015668495],
+ [18.07097957326502, 59.34736657415931],
+ [18.070995155943592, 59.34735468491024]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 42,
+ "type": "Feature",
+ "properties": {
+ "id": 42,
+ "location": "nymble/2",
+ "exhibitorId": 1492
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07092826668216, 59.347333372018085],
+ [18.07096540588074, 59.347345662364205],
+ [18.0709861316827, 59.34733067116804],
+ [18.07094912801449, 59.34731816082646],
+ [18.07092826668216, 59.347333372018085]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 43,
+ "type": "Feature",
+ "properties": {
+ "id": 43,
+ "location": "nymble/2",
+ "exhibitorId": 1493
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07095239325676, 59.34727058557871],
+ [18.07099420284524, 59.347277897343446],
+ [18.07101620244231, 59.34725271363496],
+ [18.0709748805061, 59.34724408190698],
+ [18.07095239325676, 59.34727058557871]
+ ]
+ ],
+ "type": "Polygon"
+ }
},
{
- "id": 6,
+ "id": 44,
"type": "Feature",
"properties": {
- "id": 6,
- "location": "nymble/1",
+ "id": 44,
+ "location": "nymble/2",
"exhibitorId": 1493
},
"geometry": {
"coordinates": [
[
- [18.070247817127182, 59.34714649896938],
- [18.070604550925793, 59.34700838274554],
- [18.070722568122363, 59.34714923393841],
- [18.07035242327862, 59.347242222755625],
- [18.070247817127182, 59.34714649896938]
+ [18.070958235024705, 59.3472296096445],
+ [18.070975399523064, 59.34720755813075],
+ [18.071045533964053, 59.347219859986325],
+ [18.071025994501355, 59.34724181498132],
+ [18.070958235024705, 59.3472296096445]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 45,
+ "type": "Feature",
+ "properties": {
+ "id": 45,
+ "location": "nymble/2",
+ "exhibitorId": 1589
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070867733829516, 59.347259556268654],
+ [18.070890899772678, 59.34723350274672],
+ [18.07093173063251, 59.34724188387739],
+ [18.0709081202138, 59.34726883746205],
+ [18.070867733829516, 59.347259556268654]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 46,
+ "type": "Feature",
+ "properties": {
+ "id": 46,
+ "location": "nymble/2",
+ "exhibitorId": 1630
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070804168863532, 59.34723182228501],
+ [18.070835498976464, 59.34724445291138],
+ [18.070863054730694, 59.34722535245396],
+ [18.070833268593248, 59.347212617618226],
+ [18.070804168863532, 59.34723182228501]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 47,
+ "type": "Feature",
+ "properties": {
+ "id": 47,
+ "location": "nymble/2",
+ "exhibitorId": 1496
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07077623220073, 59.3472858435434],
+ [18.070803604608813, 59.347269822831805],
+ [18.070780282826206, 59.3472576821317],
+ [18.070751191971482, 59.34727420349597],
+ [18.07077623220073, 59.3472858435434]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 48,
+ "type": "Feature",
+ "properties": {
+ "id": 48,
+ "location": "nymble/2",
+ "exhibitorId": 1498
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070603683430306, 59.3472623523424],
+ [18.070645737835235, 59.34727624464375],
+ [18.070667817921787, 59.34725935264041],
+ [18.07062534902451, 59.34724524753841],
+ [18.070603683430306, 59.3472623523424]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 49,
+ "type": "Feature",
+ "properties": {
+ "id": 49,
+ "location": "nymble/2",
+ "exhibitorId": 1497
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070646141705737, 59.34727618536243],
+ [18.070686940191678, 59.34728977072399],
+ [18.07071039950401, 59.34727339749281],
+ [18.070668329675584, 59.347259436550814],
+ [18.070646141705737, 59.34727618536243]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 50,
+ "type": "Feature",
+ "properties": {
+ "id": 50,
+ "location": "nymble/2",
+ "exhibitorId": 1499
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070654904566766, 59.34717230163764],
+ [18.07067519047365, 59.347153137415745],
+ [18.070726721954088, 59.34716593121348],
+ [18.07070533884132, 59.34718578071937],
+ [18.070654904566766, 59.34717230163764]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 51,
+ "type": "Feature",
+ "properties": {
+ "id": 51,
+ "location": "nymble/2",
+ "exhibitorId": 1500
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07070574360469, 59.34718570556274],
+ [18.07075348450101, 59.34719804327818],
+ [18.070775298374343, 59.347178853539475],
+ [18.070726783368457, 59.347165921699],
+ [18.07070574360469, 59.34718570556274]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 52,
+ "type": "Feature",
+ "properties": {
+ "id": 52,
+ "location": "nymble/2",
+ "exhibitorId": 1495
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07075367966607, 59.34719812508027],
+ [18.070775385574706, 59.34717895779244],
+ [18.07082537014267, 59.34719213942773],
+ [18.07080357177884, 59.34721122962378],
+ [18.07075367966607, 59.34719812508027]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 53,
+ "type": "Feature",
+ "properties": {
+ "id": 53,
+ "location": "nymble/2",
+ "exhibitorId": 1501
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07062030966202, 59.347218976644115],
+ [18.070640148513235, 59.34720099487163],
+ [18.070686491154532, 59.34721432318531],
+ [18.070666184806214, 59.34723257636335],
+ [18.07062030966202, 59.347218976644115]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 54,
+ "type": "Feature",
+ "properties": {
+ "id": 54,
+ "location": "nymble/2",
+ "exhibitorId": 1601
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.0706401052895, 59.3472009367629],
+ [18.070686640711216, 59.347214264249544],
+ [18.070705881620768, 59.34719669982695],
+ [18.070659158589592, 59.34718358097396],
+ [18.0706401052895, 59.3472009367629]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 55,
+ "type": "Feature",
+ "properties": {
+ "id": 55,
+ "location": "nymble/2",
+ "exhibitorId": 1502
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070666216706826, 59.3472325749197],
+ [18.070686702179785, 59.347214331909214],
+ [18.070728158041163, 59.34722604554804],
+ [18.070707506028384, 59.34724470465349],
+ [18.070666216706826, 59.3472325749197]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 56,
+ "type": "Feature",
+ "properties": {
+ "id": 56,
+ "location": "nymble/2",
+ "exhibitorId": 1503
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070707574594195, 59.34724470412698],
+ [18.070728216139116, 59.34722605656725],
+ [18.07076995954276, 59.34723845570181],
+ [18.07074831355513, 59.34725703289445],
+ [18.070707574594195, 59.34724470412698]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 57,
+ "type": "Feature",
+ "properties": {
+ "id": 57,
+ "location": "nymble/2",
+ "exhibitorId": 1507
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070686687883267, 59.3472142203982],
+ [18.070728033088415, 59.34722610862195],
+ [18.070747976331745, 59.347208503823396],
+ [18.07070597982522, 59.34719668970925],
+ [18.070686687883267, 59.3472142203982]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 58,
+ "type": "Feature",
+ "properties": {
+ "id": 58,
+ "location": "nymble/2",
+ "exhibitorId": 1508
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070728252106306, 59.34722598117193],
+ [18.070769990195032, 59.34723843272809],
+ [18.070790330037852, 59.34722042836961],
+ [18.070748193757822, 59.347208516982704],
+ [18.070728252106306, 59.34722598117193]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 59,
+ "type": "Feature",
+ "properties": {
+ "id": 59,
+ "location": "nymble/2",
+ "exhibitorId": 1513
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070670781257064, 59.34730423108056],
+ [18.070713419966296, 59.34732069346563],
+ [18.070671544615152, 59.34734342935167],
+ [18.070632322915287, 59.347325460942415],
+ [18.070670781257064, 59.34730423108056]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 60,
+ "type": "Feature",
+ "properties": {
+ "id": 60,
+ "location": "nymble/2",
+ "exhibitorId": 1512
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070632475828262, 59.347325297169476],
+ [18.070671431377974, 59.347343254793685],
+ [18.070627119440502, 59.34736683967728],
+ [18.070589949353376, 59.34734929583547],
+ [18.070632475828262, 59.347325297169476]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 61,
+ "type": "Feature",
+ "properties": {
+ "id": 61,
+ "location": "nymble/2",
+ "exhibitorId": 1511
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070589917560426, 59.347349153627505],
+ [18.070627157716928, 59.34736681096402],
+ [18.070582006347564, 59.347391043518684],
+ [18.070545042431064, 59.347373125110806],
+ [18.070589917560426, 59.347349153627505]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 62,
+ "type": "Feature",
+ "properties": {
+ "id": 62,
+ "location": "nymble/2",
+ "exhibitorId": 1510
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070544994495947, 59.34737311205592],
+ [18.070581875154687, 59.347391002962496],
+ [18.070540232931535, 59.34741337246268],
+ [18.070504166438013, 59.34739593576904],
+ [18.070544994495947, 59.34737311205592]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 63,
+ "type": "Feature",
+ "properties": {
+ "id": 63,
+ "location": "nymble/2",
+ "exhibitorId": 1509
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070504308496112, 59.3473957970057],
+ [18.070539949179647, 59.34741332548967],
+ [18.070499747506602, 59.34743467954743],
+ [18.0704638621159, 59.347417932003],
+ [18.070504308496112, 59.3473957970057]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 64,
+ "type": "Feature",
+ "properties": {
+ "id": 64,
+ "location": "nymble/2",
+ "exhibitorId": 1595
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07045000324615, 59.347415087472655],
+ [18.070487255529827, 59.3473938485036],
+ [18.070433518204084, 59.34736819154253],
+ [18.070396507080602, 59.34738965058054],
+ [18.07045000324615, 59.347415087472655]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 65,
+ "type": "Feature",
+ "properties": {
+ "id": 65,
+ "location": "nymble/2",
+ "exhibitorId": 1514
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.0703963753881, 59.34738963500925],
+ [18.070433631896577, 59.34736787619221],
+ [18.07037982969902, 59.34734116976688],
+ [18.07034017457491, 59.3473620690028],
+ [18.0703963753881, 59.34738963500925]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 66,
+ "type": "Feature",
+ "properties": {
+ "id": 66,
+ "location": "nymble/2",
+ "exhibitorId": 1515
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070407079295336, 59.347341496613524],
+ [18.070380476371838, 59.34732878609435],
+ [18.070416761416737, 59.34731049757437],
+ [18.070442756050852, 59.34732373329729],
+ [18.070407079295336, 59.347341496613524]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 67,
+ "type": "Feature",
+ "properties": {
+ "id": 67,
+ "location": "nymble/2",
+ "exhibitorId": 1516
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.0704427852107, 59.347323748563724],
+ [18.070481255073048, 59.347304283682064],
+ [18.070455792443084, 59.347291038828246],
+ [18.07041678538576, 59.34731046114865],
+ [18.0704427852107, 59.347323748563724]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 68,
+ "type": "Feature",
+ "properties": {
+ "id": 68,
+ "location": "nymble/2",
+ "exhibitorId": 1592
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070495369887595, 59.3476446321437],
+ [18.070540359297212, 59.34762787870474],
+ [18.070516326975508, 59.347611395080804],
+ [18.07047061877188, 59.347627476125325],
+ [18.070495369887595, 59.3476446321437]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 69,
+ "type": "Feature",
+ "properties": {
+ "id": 69,
+ "location": "nymble/2",
+ "exhibitorId": 1579
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070458980175232, 59.3475284199107],
+ [18.070489287634757, 59.34751611878653],
+ [18.070465164439696, 59.34749962303772],
+ [18.07043424311604, 59.347511288927194],
+ [18.070458980175232, 59.3475284199107]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 70,
+ "type": "Feature",
+ "properties": {
+ "id": 70,
+ "location": "nymble/2",
+ "exhibitorId": 1576
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070283502752915, 59.34753226710811],
+ [18.070321745718815, 59.347517957272885],
+ [18.070353197692043, 59.34754003053115],
+ [18.070314891896885, 59.3475544851043],
+ [18.070283502752915, 59.34753226710811]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 71,
+ "type": "Feature",
+ "properties": {
+ "id": 71,
+ "location": "nymble/2",
+ "exhibitorId": 1493
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070353469015032, 59.34754011622448],
+ [18.070315060144935, 59.34755458686507],
+ [18.070346186509937, 59.347576934619326],
+ [18.070385200044086, 59.34756262041344],
+ [18.070353469015032, 59.34754011622448]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 72,
+ "type": "Feature",
+ "properties": {
+ "id": 72,
+ "location": "nymble/2",
+ "exhibitorId": 1577
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07034619311102, 59.34757698240742],
+ [18.070385219134266, 59.347562640098204],
+ [18.0704137636381, 59.34758388336593],
+ [18.070375337873088, 59.34759776457852],
+ [18.07034619311102, 59.34757698240742]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 73,
+ "type": "Feature",
+ "properties": {
+ "id": 73,
+ "location": "nymble/2",
+ "exhibitorId": 1578
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070375395118504, 59.34759777505042],
+ [18.070413914112805, 59.347583923182384],
+ [18.07044056201073, 59.34760457214114],
+ [18.070403244370112, 59.34761742558166],
+ [18.070375395118504, 59.34759777505042]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 74,
+ "type": "Feature",
+ "properties": {
+ "id": 74,
+ "location": "nymble/2",
+ "exhibitorId": 1634
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070403475197253, 59.34761758470904],
+ [18.070440604135143, 59.34760462058176],
+ [18.070469314741388, 59.34762554304922],
+ [18.070432962380664, 59.347638279790374],
+ [18.070403475197253, 59.34761758470904]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 75,
+ "type": "Feature",
+ "properties": {
+ "id": 75,
+ "location": "nymble/2",
+ "exhibitorId": 1574
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070164827617674, 59.347311133719586],
+ [18.07019689135538, 59.34729576515798],
+ [18.07023630822343, 59.34731685527308],
+ [18.070205541144844, 59.347332587260894],
+ [18.070164827617674, 59.347311133719586]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 76,
+ "type": "Feature",
+ "properties": {
+ "id": 76,
+ "location": "nymble/2",
+ "exhibitorId": 1575
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070205498208594, 59.347332585583985],
+ [18.07023621282832, 59.34731697224336],
+ [18.070274703899003, 59.3473372901434],
+ [18.07024283069805, 59.347352411081886],
+ [18.070205498208594, 59.347332585583985]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 77,
+ "type": "Feature",
+ "properties": {
+ "id": 77,
+ "location": "nymble/2",
+ "exhibitorId": 1572
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070309372370474, 59.34731719465333],
+ [18.070357839754138, 59.34729248423071],
+ [18.070324054064457, 59.34727485832158],
+ [18.070275092769094, 59.34729900828086],
+ [18.070309372370474, 59.34731719465333]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 78,
+ "type": "Feature",
+ "properties": {
+ "id": 78,
+ "location": "nymble/2",
+ "exhibitorId": 1573
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070275230473726, 59.34729881871911],
+ [18.07032408429336, 59.347274718158815],
+ [18.070287740518552, 59.3472554367296],
+ [18.070239322936146, 59.34728017909177],
+ [18.070275230473726, 59.34729881871911]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 79,
+ "type": "Feature",
+ "properties": {
+ "id": 79,
+ "location": "nymble/2",
+ "exhibitorId": 1591
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07027938811325, 59.34732806993284],
+ [18.07030491278843, 59.3473151427192],
+ [18.070269752971768, 59.347296613704515],
+ [18.07024439733405, 59.347309282380536],
+ [18.07027938811325, 59.34732806993284]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 80,
+ "type": "Feature",
+ "properties": {
+ "id": 80,
+ "location": "nymble/2",
+ "exhibitorId": 1571
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070348012814833, 59.34726860791099],
+ [18.070393971325757, 59.347245176567384],
+ [18.07036352747238, 59.34722980440304],
+ [18.070318447149475, 59.34725338500152],
+ [18.070348012814833, 59.34726860791099]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 81,
+ "type": "Feature",
+ "properties": {
+ "id": 81,
+ "location": "nymble/2",
+ "exhibitorId": 1570
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070186136254506, 59.347293491620604],
+ [18.070155219673836, 59.347277659253024],
+ [18.070189343060377, 59.347259900605025],
+ [18.07022014415847, 59.34727620754154],
+ [18.070186136254506, 59.347293491620604]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 82,
+ "type": "Feature",
+ "properties": {
+ "id": 82,
+ "location": "nymble/2",
+ "exhibitorId": 1633
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070189461864175, 59.34725975411715],
+ [18.070220312007365, 59.34727609578991],
+ [18.070253990694965, 59.347258115052426],
+ [18.07022416344867, 59.347241987253],
+ [18.070189461864175, 59.34725975411715]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 83,
+ "type": "Feature",
+ "properties": {
+ "id": 83,
+ "location": "nymble/2",
+ "exhibitorId": 1569
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070224263882153, 59.34724198663204],
+ [18.0702540584235, 59.347258117832354],
+ [18.070291947470253, 59.347239213144775],
+ [18.070261890647856, 59.34722250517069],
+ [18.070224263882153, 59.34724198663204]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 84,
+ "type": "Feature",
+ "properties": {
+ "id": 84,
+ "location": "nymble/2",
+ "exhibitorId": 1568
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070261923417092, 59.34722248915301],
+ [18.070291846525066, 59.347239091463024],
+ [18.07032742698027, 59.34722085153217],
+ [18.070297070781606, 59.34720446795305],
+ [18.070261923417092, 59.34722248915301]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 85,
+ "type": "Feature",
+ "properties": {
+ "id": 85,
+ "location": "nymble/2",
+ "exhibitorId": 1567
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070297011754718, 59.347204328561844],
+ [18.070327409929632, 59.34722083935259],
+ [18.07036487259225, 59.34720260179057],
+ [18.070334255794933, 59.347185399466184],
+ [18.070297011754718, 59.347204328561844]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 86,
+ "type": "Feature",
+ "properties": {
+ "id": 86,
+ "location": "nymble/3",
+ "exhibitorId": 1557
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070589718763046, 59.3475656591026],
+ [18.070626391711812, 59.34754558256029],
+ [18.07059924149229, 59.34753195444267],
+ [18.070562332733743, 59.34755182542145],
+ [18.070589718763046, 59.3475656591026]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 87,
+ "type": "Feature",
+ "properties": {
+ "id": 87,
+ "location": "nymble/3",
+ "exhibitorId": 1558
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070455275135345, 59.34748103417161],
+ [18.070483479975223, 59.347470564772664],
+ [18.070511844766912, 59.34749137699467],
+ [18.070483168770863, 59.34750248907784],
+ [18.070455275135345, 59.34748103417161]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 88,
+ "type": "Feature",
+ "properties": {
+ "id": 88,
+ "location": "nymble/3",
+ "exhibitorId": 1617
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070513459369664, 59.34745846003193],
+ [18.070481967295166, 59.34744142678417],
+ [18.070519147681296, 59.347422149619604],
+ [18.070552690062414, 59.34743999271831],
+ [18.070513459369664, 59.34745846003193]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 89,
+ "type": "Feature",
+ "properties": {
+ "id": 89,
+ "location": "nymble/3",
+ "exhibitorId": 1559
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070519223856337, 59.34742206340334],
+ [18.07055296625643, 59.34743988984428],
+ [18.07059099861121, 59.34742075534788],
+ [18.070556992389527, 59.34740242753156],
+ [18.070519223856337, 59.34742206340334]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 90,
+ "type": "Feature",
+ "properties": {
+ "id": 90,
+ "location": "nymble/3",
+ "exhibitorId": 1560
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070557367461163, 59.34740231750854],
+ [18.0705910025753, 59.3474206159901],
+ [18.070631060666585, 59.347400541668634],
+ [18.0705972603576, 59.3473816562562],
+ [18.070557367461163, 59.34740231750854]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 91,
+ "type": "Feature",
+ "properties": {
+ "id": 91,
+ "location": "nymble/3",
+ "exhibitorId": 1613
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070597224830806, 59.34738153713252],
+ [18.07063113630761, 59.34740049528983],
+ [18.070673006324995, 59.34737948076747],
+ [18.070638620653995, 59.347360091066236],
+ [18.070597224830806, 59.34738153713252]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 92,
+ "type": "Feature",
+ "properties": {
+ "id": 92,
+ "location": "nymble/3",
+ "exhibitorId": 1561
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070638748914064, 59.34736002280968],
+ [18.070673003165297, 59.347379352088126],
+ [18.070715736164175, 59.34735751549803],
+ [18.070680618574187, 59.347338167856435],
+ [18.070638748914064, 59.34736002280968]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 93,
+ "type": "Feature",
+ "properties": {
+ "id": 93,
+ "location": "nymble/3",
+ "exhibitorId": 1562
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070680948721844, 59.34733794665655],
+ [18.070715873351105, 59.34735728466546],
+ [18.07075531530313, 59.34733749283507],
+ [18.070718879351972, 59.34731836514382],
+ [18.070680948721844, 59.34733794665655]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 94,
+ "type": "Feature",
+ "properties": {
+ "id": 94,
+ "location": "nymble/3",
+ "exhibitorId": 1554
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07086036275132, 59.347416051973596],
+ [18.070894359368566, 59.34739771528004],
+ [18.07086293959142, 59.3473820106247],
+ [18.070830327769045, 59.347400266035294],
+ [18.07086036275132, 59.347416051973596]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 95,
+ "type": "Feature",
+ "properties": {
+ "id": 95,
+ "location": "nymble/3",
+ "exhibitorId": 1553
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070894461437035, 59.347397661811755],
+ [18.070929497240996, 59.34737836932035],
+ [18.070895302805184, 59.34736373999857],
+ [18.070862962157804, 59.347382036466314],
+ [18.070894461437035, 59.347397661811755]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 96,
+ "type": "Feature",
+ "properties": {
+ "id": 96,
+ "location": "nymble/3",
+ "exhibitorId": 1555
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070735994158895, 59.347410851946165],
+ [18.07077425681794, 59.34738977602373],
+ [18.070746702441568, 59.34737437139901],
+ [18.07070594127876, 59.34739760996243],
+ [18.070735994158895, 59.347410851946165]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 97,
+ "type": "Feature",
+ "properties": {
+ "id": 97,
+ "location": "nymble/3",
+ "exhibitorId": 1620
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07080954157803, 59.34744462934839],
+ [18.07084587962953, 59.34742457822159],
+ [18.070815971768894, 59.3474103975702],
+ [18.070778437401543, 59.34743052494488],
+ [18.07080954157803, 59.34744462934839]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 98,
+ "type": "Feature",
+ "properties": {
+ "id": 98,
+ "location": "nymble/3",
+ "exhibitorId": 1552
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07080738892094, 59.34736151094134],
+ [18.070834973430294, 59.34734474156528],
+ [18.070809685453156, 59.34733441313222],
+ [18.07078182021135, 59.34735063885972],
+ [18.07080738892094, 59.34736151094134]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 99,
+ "type": "Feature",
+ "properties": {
+ "id": 99,
+ "location": "nymble/3",
+ "exhibitorId": 1563
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070844180684333, 59.34734233846987],
+ [18.070865161646196, 59.34732470094457],
+ [18.070908799819847, 59.34733748110335],
+ [18.070888358532414, 59.3473555701344],
+ [18.070844180684333, 59.34734233846987]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 100,
+ "type": "Feature",
+ "properties": {
+ "id": 100,
+ "location": "nymble/3",
+ "exhibitorId": 1603
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07088846848609, 59.34735563583337],
+ [18.07093194464167, 59.34736850076669],
+ [18.070951918667078, 59.34735046516141],
+ [18.07090898702731, 59.347337555883456],
+ [18.07088846848609, 59.34735563583337]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 101,
+ "type": "Feature",
+ "properties": {
+ "id": 101,
+ "location": "nymble/3",
+ "exhibitorId": 1564
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07100558325982, 59.347365446989386],
+ [18.07102772803171, 59.347343757356924],
+ [18.070997466414383, 59.347335766631375],
+ [18.07097472845433, 59.34735682563161],
+ [18.07100558325982, 59.347365446989386]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 102,
+ "type": "Feature",
+ "properties": {
+ "id": 102,
+ "location": "nymble/3",
+ "exhibitorId": 1567
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.07108545768864, 59.347334264711606],
+ [18.071108095253663, 59.34730972325809],
+ [18.071074392426766, 59.347300811939135],
+ [18.0710519191162, 59.3473241585142],
+ [18.07108545768864, 59.347334264711606]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 103,
+ "type": "Feature",
+ "properties": {
+ "id": 103,
+ "location": "nymble/3",
+ "exhibitorId": 1590
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070822070230122, 59.347295384884376],
+ [18.070858099970224, 59.34726920694496],
+ [18.07090114787735, 59.34728360091759],
+ [18.070865936653917, 59.3473097966143],
+ [18.070822070230122, 59.347295384884376]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 104,
+ "type": "Feature",
+ "properties": {
+ "id": 104,
+ "location": "nymble/3",
+ "exhibitorId": 1565
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070899871955504, 59.347241933323915],
+ [18.070916918995977, 59.34722388365455],
+ [18.070967333781027, 59.347235580790795],
+ [18.070951581949373, 59.34725411994094],
+ [18.070899871955504, 59.347241933323915]
+ ]
+ ],
+ "type": "Polygon"
+ }
+ },
+ {
+ "id": 105,
+ "type": "Feature",
+ "properties": {
+ "id": 105,
+ "location": "nymble/3",
+ "exhibitorId": 1566
+ },
+ "geometry": {
+ "coordinates": [
+ [
+ [18.070971451140593, 59.34725826053102],
+ [18.07098730801556, 59.347240179299234],
+ [18.071034330667544, 59.34725124388882],
+ [18.071018302229447, 59.34726979146123],
+ [18.070971451140593, 59.34725826053102]
]
],
"type": "Polygon"
diff --git a/src/app/student/map/data/buildings.json b/src/app/student/map/data/buildings.json
index 7c4fd95..08d4a83 100644
--- a/src/app/student/map/data/buildings.json
+++ b/src/app/student/map/data/buildings.json
@@ -2,88 +2,91 @@
"type": "FeatureCollection",
"features": [
{
- "id": "nymble",
"type": "Feature",
- "properties": {
- "id": 1,
- "location": "nymble/1",
- "exhibitorId": -1
- },
"geometry": {
+ "type": "Polygon",
"coordinates": [
[
- [18.06971462098832, 59.347364656309395],
- [18.069894289003997, 59.34745992686692],
- [18.069987039221786, 59.3474156134931],
- [18.070030460145233, 59.34743875061068],
- [18.07020534557526, 59.34737707459962],
- [18.07033227539216, 59.34745951937535],
- [18.070231692554188, 59.34749541549576],
- [18.070460687570687, 59.3476588360075],
- [18.070613957741045, 59.34760146636043],
- [18.070575600270928, 59.34757415173681],
- [18.07094204280932, 59.34737346884842],
- [18.071054025036204, 59.34741004879683],
- [18.071128124413036, 59.34734435464833],
- [18.0710932556959, 59.34733238922587],
- [18.071310353363742, 59.347069755137596],
- [18.071193006718772, 59.347042747244984],
- [18.07107431896935, 59.34718667513246],
- [18.07095093735478, 59.347159325462144],
- [18.07098379441581, 59.34712650582867],
- [18.07067601093098, 59.3470683876499],
- [18.070748798530218, 59.34696624213629],
- [18.07078702000925, 59.34698812199872],
- [18.07083529977146, 59.34696453277144],
- [18.070805795472353, 59.346948122864546],
- [18.07085541633907, 59.34691667052047],
- [18.070747457425682, 59.34686812445446],
- [18.069966796803726, 59.3472763603672],
- [18.06992730897153, 59.34725488600304],
- [18.06971462098832, 59.347364656309395]
+ [18.0697146209883, 59.3473646563094],
+ [18.069894289004, 59.3474599268669],
+ [18.0699870392218, 59.3474156134931],
+ [18.0700304601452, 59.3474387506107],
+ [18.0702053455753, 59.3473770745996],
+ [18.0703322753922, 59.3474595193754],
+ [18.0702316925542, 59.3474954154958],
+ [18.0704606875707, 59.3476588360075],
+ [18.070613957741, 59.3476014663604],
+ [18.0705756002709, 59.3475741517368],
+ [18.0709420428093, 59.3473734688484],
+ [18.0710540250362, 59.3474100487968],
+ [18.071128124413, 59.3473443546483],
+ [18.0713157587403, 59.347135634353],
+ [18.0713340409054, 59.3471418796446],
+ [18.0713891817805, 59.3470698234946],
+ [18.0713252326803, 59.3470541254728],
+ [18.0713103533637, 59.3470697551376],
+ [18.0711930067188, 59.347042747245],
+ [18.0710743189694, 59.3471866751325],
+ [18.0709509373548, 59.3471593254621],
+ [18.0709837944158, 59.3471265058287],
+ [18.070676010931, 59.3470683876499],
+ [18.0707487985302, 59.3469662421363],
+ [18.0707870200093, 59.3469881219987],
+ [18.0708352997715, 59.3469645327714],
+ [18.0708057954724, 59.3469481228645],
+ [18.0708554163391, 59.3469166705205],
+ [18.0707474574257, 59.3468681244545],
+ [18.0699667968037, 59.3472763603672],
+ [18.0699273089715, 59.347254886003],
+ [18.0697146209883, 59.3473646563094]
]
- ],
- "type": "Polygon"
+ ]
+ },
+ "id": "0f1fbe55-ac4a-497f-a37a-f356b83a3ca4",
+ "properties": {
+ "id": 1,
+ "location": "nymble/1",
+ "exhibitorId": -1
}
},
{
- "id": 2,
"type": "Feature",
- "properties": {
- "id": 2,
- "location": "nymble/1",
- "exhibitorId": -1
- },
"geometry": {
+ "type": "Polygon",
"coordinates": [
[
- [18.07120957474774, 59.348079085235696],
- [18.071290395870818, 59.34794277621802],
- [18.07095293780756, 59.34788991708149],
- [18.070757395490403, 59.34821375590255],
- [18.071095469388524, 59.348267118449854],
- [18.071128558666715, 59.34821604061807],
- [18.07119713894781, 59.34820760584307],
- [18.0712144943881, 59.34824530425803],
- [18.07161481408383, 59.348181034500556],
- [18.0716322484424, 59.34821658799845],
- [18.07282548715935, 59.34822584712978],
- [18.072838227651516, 59.348252170361576],
- [18.07313227489297, 59.34820751546644],
- [18.073117522744695, 59.348164099159135],
- [18.073259009269435, 59.34813504096962],
- [18.07273041213182, 59.34752166893173],
- [18.072507118230902, 59.347573290866336],
- [18.072491024976813, 59.347549360177766],
- [18.07232942188449, 59.347588674871304],
- [18.072381724960195, 59.347654313214235],
- [18.071626186978165, 59.34792091272823],
- [18.07167531500258, 59.347955687936064],
- [18.071444355183218, 59.34804026818318],
- [18.07120957474774, 59.348079085235696]
+ [18.0712095747477, 59.3480790852357],
+ [18.0712903958708, 59.347942776218],
+ [18.0709529378076, 59.3478899170815],
+ [18.0707573954904, 59.3482137559026],
+ [18.0710954693885, 59.3482671184499],
+ [18.0711285586667, 59.3482160406181],
+ [18.0711971389478, 59.3482076058431],
+ [18.0712144943881, 59.348245304258],
+ [18.0716148140838, 59.3481810345006],
+ [18.0716322484424, 59.3482165879985],
+ [18.0728254871594, 59.3482258471298],
+ [18.0728382276515, 59.3482521703616],
+ [18.073132274893, 59.3482075154664],
+ [18.0731175227447, 59.3481640991591],
+ [18.0732590092694, 59.3481350409696],
+ [18.0727304121318, 59.3475216689317],
+ [18.0725071182309, 59.3475732908663],
+ [18.0724910249768, 59.3475493601778],
+ [18.0723294218845, 59.3475886748713],
+ [18.0723817249602, 59.3476543132142],
+ [18.0716261869782, 59.3479209127282],
+ [18.0716753150026, 59.3479556879361],
+ [18.0714443551832, 59.3480402681832],
+ [18.0712095747477, 59.3480790852357]
]
- ],
- "type": "Polygon"
+ ]
+ },
+ "id": "018b7d37-760e-4817-b1d0-0c0148f30daa",
+ "properties": {
+ "id": 2,
+ "location": "nymble/1",
+ "exhibitorId": -1
}
}
]
diff --git a/src/app/student/map/data/nymble.plan2.json b/src/app/student/map/data/nymble.plan2.json
new file mode 100644
index 0000000..56e5421
--- /dev/null
+++ b/src/app/student/map/data/nymble.plan2.json
@@ -0,0 +1,999 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0697146209883, 59.3473646563094],
+ [18.069894289004, 59.3474599268669],
+ [18.0699870392218, 59.3474156134931],
+ [18.0700304601452, 59.3474387506107],
+ [18.0702053455753, 59.3473770745996],
+ [18.0703322753922, 59.3474595193754],
+ [18.0702316925542, 59.3474954154958],
+ [18.0704606875707, 59.3476588360075],
+ [18.070613957741, 59.3476014663604],
+ [18.0705756002709, 59.3475741517368],
+ [18.0709420428093, 59.3473734688484],
+ [18.0710540250362, 59.3474100487968],
+ [18.071128124413, 59.3473443546483],
+ [18.0713157587403, 59.347135634353],
+ [18.0713340409054, 59.3471418796446],
+ [18.0713891817805, 59.3470698234946],
+ [18.0713252326803, 59.3470541254728],
+ [18.0713103533637, 59.3470697551376],
+ [18.0711930067188, 59.347042747245],
+ [18.0710743189694, 59.3471866751325],
+ [18.0709509373548, 59.3471593254621],
+ [18.0709837944158, 59.3471265058287],
+ [18.070676010931, 59.3470683876499],
+ [18.0707487985302, 59.3469662421363],
+ [18.0707870200093, 59.3469881219987],
+ [18.0708352997715, 59.3469645327714],
+ [18.0708057954724, 59.3469481228645],
+ [18.0708554163391, 59.3469166705205],
+ [18.0707474574257, 59.3468681244545],
+ [18.0699667968037, 59.3472763603672],
+ [18.0699273089715, 59.347254886003],
+ [18.0697146209883, 59.3473646563094]
+ ]
+ ]
+ },
+ "id": "0f1fbe55-ac4a-497f-a37a-f356b83a3ca4",
+ "properties": {
+ "id": 1,
+ "location": "nymble/2",
+ "exhibitorId": -1
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0712095747477, 59.3480790852357],
+ [18.0712903958708, 59.347942776218],
+ [18.0709529378076, 59.3478899170815],
+ [18.0707573954904, 59.3482137559026],
+ [18.0710954693885, 59.3482671184499],
+ [18.0711285586667, 59.3482160406181],
+ [18.0711971389478, 59.3482076058431],
+ [18.0712144943881, 59.348245304258],
+ [18.0716148140838, 59.3481810345006],
+ [18.0716322484424, 59.3482165879985],
+ [18.0728254871594, 59.3482258471298],
+ [18.0728382276515, 59.3482521703616],
+ [18.073132274893, 59.3482075154664],
+ [18.0731175227447, 59.3481640991591],
+ [18.0732590092694, 59.3481350409696],
+ [18.0727304121318, 59.3475216689317],
+ [18.0725071182309, 59.3475732908663],
+ [18.0724910249768, 59.3475493601778],
+ [18.0723294218845, 59.3475886748713],
+ [18.0723817249602, 59.3476543132142],
+ [18.0716261869782, 59.3479209127282],
+ [18.0716753150026, 59.3479556879361],
+ [18.0714443551832, 59.3480402681832],
+ [18.0712095747477, 59.3480790852357]
+ ]
+ ]
+ },
+ "id": "018b7d37-760e-4817-b1d0-0c0148f30daa",
+ "properties": {
+ "id": 2,
+ "location": "nymble/2",
+ "exhibitorId": -1
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0706151829136, 59.3476018949493],
+ [18.0705756126778, 59.347574193637],
+ [18.0705526917998, 59.3475590370286],
+ [18.0705422766142, 59.3475518940418],
+ [18.0705422766142, 59.3475518940418],
+ [18.0705266538357, 59.3475411795617],
+ [18.0705110310573, 59.3475304650815],
+ [18.0705006158716, 59.3475233220947],
+ [18.070490200686, 59.347516179108],
+ [18.0704693703147, 59.3475018931344],
+ [18.0704589551291, 59.3474947501476],
+ [18.0704485399435, 59.3474876071608],
+ [18.0704277095722, 59.3474733211873],
+ [18.070406879201, 59.3474590352137],
+ [18.0703964640153, 59.347451892227],
+ [18.0703860488297, 59.3474447492402],
+ [18.0703652184584, 59.3474304632666],
+ [18.0702818969734, 59.3473733193724],
+ [18.0702818295423, 59.3473732664119],
+ [18.0702818295423, 59.3473733081831]
+ ]
+ },
+ "id": "6665ffd1-526a-434f-8868-4dd411379dda",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.070225784199, 59.3473907802145],
+ [18.0702818969734, 59.3473733193724],
+ [18.070349146703, 59.3473412903628],
+ [18.0703659591354, 59.3473332831104],
+ [18.0703827715678, 59.347325275858],
+ [18.0704163964326, 59.3473092613532],
+ [18.0704948017612, 59.3472719843365],
+ [18.0705060363941, 59.3472666010876],
+ [18.0705172710271, 59.3472612178387],
+ [18.0705508958919, 59.3472452033339],
+ [18.0705504169812, 59.3472453229691]
+ ]
+ },
+ "id": "7973fd7d-2a9d-4906-9349-ed3fc8f96418",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0710549640745, 59.3474109878662],
+ [18.0709927290977, 59.3473898818018],
+ [18.0709816374182, 59.3473862047108],
+ [18.0709704107452, 59.3473825636576],
+ [18.0709661244288, 59.3473812266502],
+ [18.0709625620977, 59.3473800708936],
+ [18.0709600476019, 59.3473792614957],
+ [18.0709563010326, 59.3473779244883],
+ [18.0709530625498, 59.3473767687315],
+ [18.0709499320167, 59.3473757780829],
+ [18.0709460458381, 59.3473744021821],
+ [18.070943309732, 59.3473732429792],
+ [18.070928452669, 59.3473689996196],
+ [18.070912632364, 59.3473641430449],
+ [18.0708965491055, 59.3473592951865],
+ [18.0708651260861, 59.3473489231999],
+ [18.0708337030666, 59.3473385512133],
+ [18.0708179915569, 59.34733336522],
+ [18.0708022800472, 59.3473281792267],
+ [18.0707865685375, 59.3473229932334],
+ [18.0707708570278, 59.3473178072401],
+ [18.0707394340084, 59.3473074352535],
+ [18.070708010989, 59.3472970632669],
+ [18.0706765879695, 59.3472866912803],
+ [18.0706608764598, 59.347281505287],
+ [18.0706451649501, 59.3472763192937],
+ [18.0706137419307, 59.3472659473071],
+ [18.0705823189113, 59.3472555753205],
+ [18.0705508958919, 59.3472452033339]
+ ]
+ },
+ "id": "30933b36-3b4f-4ae3-8a2e-374266add8b1",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0702774163296, 59.3475290960751],
+ [18.0703525629509, 59.3475012086312],
+ [18.0704006015907, 59.3474826389246],
+ [18.0704277095722, 59.3474733211873],
+ [18.0704666751267, 59.3474525854456],
+ [18.070486157904, 59.3474422175747],
+ [18.0705056406813, 59.3474318497038],
+ [18.0705251234585, 59.347421481833],
+ [18.0705446062358, 59.3474111139621],
+ [18.070564089013, 59.3474007460913],
+ [18.0705835717903, 59.3473903782204],
+ [18.0706030545676, 59.3473800103495],
+ [18.0706225373448, 59.3473696424787],
+ [18.0706420201221, 59.3473592746078],
+ [18.0706615028993, 59.3473489067369],
+ [18.0706809856766, 59.3473385388661],
+ [18.0707004684539, 59.3473281709952],
+ [18.0707199512311, 59.3473178031244],
+ [18.0707394340084, 59.3473074352535],
+ [18.0708150799516, 59.3472633265443],
+ [18.070850920914, 59.3472778373907],
+ [18.070850920914, 59.3472778373907],
+ [18.0708680861658, 59.3472576343637],
+ [18.0708770117904, 59.3472480851508],
+ [18.0708826652802, 59.3472417028279],
+ [18.070898010466, 59.3472239970207],
+ [18.0709204724391, 59.3471975784692],
+ [18.0709204724391, 59.3471975784692]
+ ]
+ },
+ "id": "6a69a0a9-2685-4895-83c8-56b4eff5d9c6",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0702818969734, 59.3473733193724],
+ [18.0702625301525, 59.3473631142046],
+ [18.0702431633316, 59.3473529090367],
+ [18.0702044296898, 59.347332498701],
+ [18.0701269624063, 59.3472916780295],
+ [18.070342600317, 59.3471808068307],
+ [18.0703644341558, 59.3471908582067],
+ [18.0703862679945, 59.3472009095827],
+ [18.070429935672, 59.3472210123347],
+ [18.0705172710271, 59.3472612178387]
+ ]
+ },
+ "id": "855caa9e-8f97-4d6f-bdaa-e016af533beb",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0702625301525, 59.3473631142046],
+ [18.0704699394737, 59.3472593087154],
+ [18.0704751191165, 59.3472622135463],
+ [18.0704834065438, 59.3472664387539],
+ [18.0704948017612, 59.3472719843365]
+ ]
+ },
+ "id": "2d08d679-a075-4674-af53-806bd8777550",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705508958919, 59.3472452033339],
+ [18.07059398149, 59.347183781676],
+ [18.070603223072, 59.3471678188885],
+ [18.0706148108521, 59.3471511498114],
+ [18.0706206654654, 59.3471420240734],
+ [18.0709204724391, 59.3471975784692],
+ [18.0710460733512, 59.3472197042177]
+ ]
+ },
+ "id": "7b8146c4-879d-4a99-b563-a83865bde7c0",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0711917249, 59.3470439841578],
+ [18.0712510741932, 59.3470572134811],
+ [18.0712807488398, 59.3470638281427],
+ [18.0713104234864, 59.3470704428044],
+ [18.0712832117236, 59.3471032308816],
+ [18.0712696058422, 59.3471196249202],
+ [18.0712628029015, 59.3471278219395],
+ [18.0712559999608, 59.3471360189588],
+ [18.0712015764352, 59.3472015951133],
+ [18.0711745713211, 59.3472340926581],
+ [18.0711607009897, 59.3472509249895],
+ [18.0711542542099, 59.3472586937533],
+ [18.0711470025161, 59.3472673828683],
+ [18.0711406606371, 59.3472749097195],
+ [18.0711298309974, 59.3472882566409],
+ [18.0711752783287, 59.34730006083],
+ [18.0711076517097, 59.3473638719518],
+ [18.0710723352894, 59.3473952577947],
+ [18.0710549640745, 59.3474109878662]
+ ]
+ },
+ "id": "56e6d88a-bc21-4cac-9efa-dd5b2196b419",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0711917249, 59.3470439841578],
+ [18.0711559570406, 59.3470874495902],
+ [18.0711470150757, 59.3470983159483],
+ [18.0711425440933, 59.3471037491273],
+ [18.0711403086021, 59.3471064657169],
+ [18.0711380731109, 59.3471091823064],
+ [18.0711201891812, 59.3471309150226],
+ [18.0710836208179, 59.3471755345339],
+ [18.0710741705672, 59.3471878939191],
+ [18.0710585573114, 59.3472048915958],
+ [18.0710502346712, 59.3472147666771],
+ [18.0710460733512, 59.3472197042177],
+ [18.0710419120311, 59.3472246417583],
+ [18.0710298670491, 59.3472383617839],
+ [18.070993369288, 59.3472793545899]
+ ]
+ },
+ "id": "5d5379d9-3ea6-49d4-9bf2-2a7f8189d92c",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0708179915569, 59.34733336522],
+ [18.0708678862071, 59.3473134424233],
+ [18.0709694426238, 59.3473472287524],
+ [18.070943309732, 59.3473732429792]
+ ]
+ },
+ "id": "5b6f0fac-a491-4a9e-bc69-f14bffd09e66",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0706148108521, 59.3471511498114],
+ [18.0705905617158, 59.3471469681871],
+ [18.0705581284899, 59.3471346691267],
+ [18.0705419118769, 59.3471285195965],
+ [18.070525695264, 59.3471223700664],
+ [18.0704984626785, 59.3471110308468],
+ [18.0704730432605, 59.3470996916217],
+ [18.0704882060981, 59.347089750879],
+ [18.0705065077208, 59.3470543406232],
+ [18.0705308508399, 59.3470217552616],
+ [18.0705507536308, 59.3470017592024],
+ [18.0705770923967, 59.3469838545476],
+ [18.0705999193277, 59.346971918106],
+ [18.0706198197285, 59.3469653530612],
+ [18.0706490850247, 59.346958489604],
+ [18.0706679128011, 59.3469560390472],
+ [18.0706411752915, 59.3469453296715],
+ [18.0707426271565, 59.3468911626914]
+ ]
+ },
+ "id": "89c7c9e6-2bee-4da3-b166-8affdcf21d81",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0703644341558, 59.3471908582067],
+ [18.0704984626785, 59.3471110308468]
+ ]
+ },
+ "id": "3bfb9111-3197-43ec-aa42-c57e3575c115",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0707230368427, 59.3468819627737],
+ [18.0707426271565, 59.3468911626914],
+ [18.0707680617587, 59.3468784344861]
+ ]
+ },
+ "id": "9fcb4bf6-564c-4609-9789-42a796fedd6e",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705905617158, 59.3471469681871],
+ [18.0707886779954, 59.3468876153966]
+ ]
+ },
+ "id": "bbfd9430-9d0f-4d9f-a89b-7b61c641eb79",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705110310573, 59.3475304650815],
+ [18.0704563101688, 59.3475515795966],
+ [18.0704367806215, 59.347537846171],
+ [18.070490200686, 59.347516179108]
+ ]
+ },
+ "id": "ed055085-4a9d-465d-8d0e-f6c0b57fe716",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.070993369288, 59.3472793545899],
+ [18.0710902928335, 59.347296434371]
+ ]
+ },
+ "id": "475c3fa1-bc6b-43ea-9afd-afb5962198e7",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0710298670491, 59.3472383617839],
+ [18.0711252314517, 59.347255534768]
+ ]
+ },
+ "id": "33b568b9-58e1-4ffc-8d15-da20cdb4deea",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.070850920914, 59.3472778373907],
+ [18.0707865685375, 59.3473229932334]
+ ]
+ },
+ "id": "59834d51-9bf1-418b-8caa-9c3205705cbf",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0711752783287, 59.34730006083],
+ [18.0713185694648, 59.3471358172039],
+ [18.0713400412441, 59.3471416127124],
+ [18.0713851474479, 59.3470695239672],
+ [18.0713211349985, 59.3470580409726],
+ [18.0713104234864, 59.3470704428044]
+ ]
+ },
+ "id": "c08ec742-5934-432e-b313-f02ac8c3b10e",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0710723352894, 59.3473952577947],
+ [18.0710453075944, 59.3473865656135],
+ [18.0710385506706, 59.3473843925681],
+ [18.0710317937469, 59.3473822195228],
+ [18.0710202054586, 59.3473785546882],
+ [18.0710602515606, 59.3473480865663],
+ [18.0710491618713, 59.3473424326851]
+ ]
+ },
+ "id": "1450f7d3-f9d1-4b2f-b9a9-ec2b5908a0c8",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0710741705672, 59.3471878939191],
+ [18.0709513462298, 59.3471597583099],
+ [18.0709812447586, 59.3471269106003],
+ [18.0706753768911, 59.3470679455592],
+ [18.0707498529622, 59.3469672662346],
+ [18.0707871833053, 59.346988142544],
+ [18.0708359612125, 59.3469645183129],
+ [18.0708064683299, 59.3469478935493],
+ [18.0708571082634, 59.3469164627163],
+ [18.0707886779954, 59.3468876153966],
+ [18.0707680617587, 59.3468784344861],
+ [18.0707472824216, 59.3468685630957],
+ [18.0707230368427, 59.3468819627737],
+ [18.0699662924215, 59.3472769501369],
+ [18.069925727329, 59.347253416085],
+ [18.0697133375816, 59.3473647920057],
+ [18.0698959511545, 59.3474599293919],
+ [18.0699874042477, 59.3474170959572],
+ [18.0700301375846, 59.3474409734286],
+ [18.0702075092173, 59.3473775909043],
+ [18.070225784199, 59.3473907802145],
+ [18.0703303660357, 59.3474597379816],
+ [18.070229126104, 59.3474949294918],
+ [18.0702774163296, 59.3475290960751],
+ [18.0704618862225, 59.3476591468337],
+ [18.070538534568, 59.3476305208915],
+ [18.0705481156112, 59.3476269426487],
+ [18.0705576966544, 59.3476233644059],
+ [18.0705768587408, 59.3476162079204],
+ [18.0706151829136, 59.3476018949493]
+ ]
+ },
+ "id": "0d1d3e79-c40e-40cf-9d1a-b95cd772dabc",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705756126778, 59.347574193637],
+ [18.070943309732, 59.3473732429792]
+ ]
+ },
+ "id": "de17e238-f520-44df-8061-97f3c1d4b488",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705576966544, 59.3476233644059],
+ [18.0705027770201, 59.3475831664543],
+ [18.0704866146362, 59.3475721797243],
+ [18.0705422766142, 59.3475518940418]
+ ]
+ },
+ "id": "6b9292f4-cda6-42ec-a061-ae2728fe642f",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.071067112854, 59.3473225812675],
+ [18.0710902928335, 59.347296434371],
+ [18.071101844995, 59.3472832160955],
+ [18.0711122125707, 59.34727137749],
+ [18.0711143968586, 59.3472686401653],
+ [18.0711162859435, 59.3472661521102],
+ [18.0711180176035, 59.3472642258737],
+ [18.0711198562797, 59.3472618270147],
+ [18.0711252314517, 59.347255534768],
+ [18.0711306066237, 59.3472492425214],
+ [18.0711521073119, 59.347224073535],
+ [18.0712381100643, 59.3471233975891]
+ ]
+ },
+ "id": "95f05b87-0342-4508-bd84-32650a8a49c5",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0711403086021, 59.3471064657169],
+ [18.0712381100643, 59.3471233975891],
+ [18.0712628029015, 59.3471278219395]
+ ]
+ },
+ "id": "7aa656e5-bfa8-4b04-a6e4-6b84acf1233c",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0709816374182, 59.3473862047108],
+ [18.0710491618713, 59.3473424326851],
+ [18.071067112854, 59.3473225812675]
+ ]
+ },
+ "id": "2ac88ae0-c712-4423-acf1-3a3cc89ba8b2",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0710385506706, 59.3473843925681],
+ [18.0710750378116, 59.3473531122405],
+ [18.0711076517097, 59.3473638719518]
+ ]
+ },
+ "id": "87d738e3-92e9-4a8e-810c-a4d9388401f8",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0708680861658, 59.3472576343637],
+ [18.0708337076987, 59.3472461102521],
+ [18.0708785811952, 59.3472148853845],
+ [18.070898010466, 59.3472239970207]
+ ]
+ },
+ "id": "d52a2404-e0e2-496d-b34e-b89420dfddd4",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.070525695264, 59.3471223700664],
+ [18.0704192723605, 59.3471909392729],
+ [18.0704546419059, 59.3472085035041],
+ [18.0704642881452, 59.3472038197099],
+ [18.0704431582867, 59.3471918760321],
+ [18.0705419118769, 59.3471285195965]
+ ]
+ },
+ "id": "e39d8934-a7d0-480f-88e3-707e7a3d06d2",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0704095288007, 59.3472730516879],
+ [18.0704099059865, 59.3472726029838],
+ [18.0704104927195, 59.3472719833446],
+ [18.0704109956338, 59.3472713423387],
+ [18.0704112051811, 59.3472709150014],
+ [18.0704115345016, 59.3472703257986],
+ [18.0704118725345, 59.3472696610567],
+ [18.0704121139871, 59.3472690209348],
+ [18.0704121622772, 59.347268356193],
+ [18.0704121622772, 59.3472676422108],
+ [18.0704121690999, 59.3472668980299],
+ [18.0704119208255, 59.3472661896264],
+ [18.0704114985483, 59.34726518868],
+ [18.0704108279953, 59.3472642699046],
+ [18.0704100736236, 59.3472633724959],
+ [18.0704095288007, 59.3472627314898],
+ [18.0704090233992, 59.3472621765534],
+ [18.0704080099306, 59.3472614666382],
+ [18.0704073393776, 59.3472609751997],
+ [18.0704063335502, 59.3472603982942],
+ [18.0704050343542, 59.3472597359213],
+ [18.0704033998838, 59.3472591162818],
+ [18.0704014301361, 59.3472585180092],
+ [18.0704000052129, 59.3472581547724],
+ [18.0703983165404, 59.34725780663],
+ [18.0703965144314, 59.3472575715942],
+ [18.0703947542309, 59.3472574006593],
+ [18.0703908203286, 59.3472571037851],
+ [18.0703873418378, 59.3472571892529],
+ [18.0703842824442, 59.347257488389],
+ [18.0703816840535, 59.3472578088923],
+ [18.0703796304873, 59.3472581934959],
+ [18.0703774511925, 59.3472587490347],
+ [18.0703750204405, 59.3472595823428],
+ [18.0703729758204, 59.3472604609384],
+ [18.0703714030345, 59.347261165602],
+ [18.0703693536478, 59.3472623805396],
+ [18.0703677564069, 59.347263911998],
+ [18.0703664219227, 59.3472651755329],
+ [18.0703657070201, 59.3472664390677],
+ [18.070365278078, 59.3472675811088],
+ [18.0703651762477, 59.3472687715095],
+ [18.070365366889, 59.3472702051353],
+ [18.0703658911503, 59.3472714200726],
+ [18.0703668443625, 59.3472732366679],
+ [18.0703687416947, 59.3472749221762],
+ [18.0703706235867, 59.3472763385093],
+ [18.070373043164, 59.3472774350254],
+ [18.0703765954614, 59.3472785182942],
+ [18.0703813767769, 59.3472792718756],
+ [18.0703847089296, 59.3472796104023],
+ [18.0703883787627, 59.3472797561947],
+ [18.0703895910738, 59.347276415842],
+ [18.070386613237, 59.3472762061101],
+ [18.0703843000635, 59.347275903717],
+ [18.0703821086108, 59.3472756106717],
+ [18.0703798381399, 59.3472750550423],
+ [18.0703782488103, 59.3472746151687],
+ [18.0703763870247, 59.3472738974807],
+ [18.0703752517893, 59.3472731797923],
+ [18.0703741541596, 59.3472723645198],
+ [18.0703738817027, 59.3472718783441],
+ [18.0703736092467, 59.3472712764119],
+ [18.0703732913801, 59.3472703040601],
+ [18.07037306656, 59.3472692351299],
+ [18.0703729757405, 59.3472681470218],
+ [18.0703731474254, 59.3472671354849],
+ [18.0703736822294, 59.3472661303003],
+ [18.0703745706441, 59.347265308373],
+ [18.0703771826061, 59.347263596317],
+ [18.0703795550912, 59.3472627193767],
+ [18.0703826393229, 59.3472618121973],
+ [18.070386077408, 59.3472610470056],
+ [18.0703890110744, 59.3472608333369],
+ [18.070390938912, 59.3472608760705],
+ [18.0703924895639, 59.3472610042718],
+ [18.0703938306685, 59.3472612606743],
+ [18.0703953394103, 59.3472615811772],
+ [18.0703968481535, 59.3472621153492],
+ [18.070398105438, 59.3472624999531],
+ [18.0703993627241, 59.3472630341247],
+ [18.0704009213526, 59.3472637096226],
+ [18.0704020529086, 59.3472643506287],
+ [18.0704030168274, 59.3472651839367],
+ [18.0704038969276, 59.3472661881795],
+ [18.0704043998496, 59.3472671283227],
+ [18.0704044836696, 59.3472682180328],
+ [18.0704043998496, 59.3472690513407],
+ [18.0704040873041, 59.3472697885014],
+ [18.0704035967383, 59.3472706543853],
+ [18.0704032910239, 59.3472712414485],
+ [18.0704029689946, 59.3472717168051],
+ [18.0704095707092, 59.3472730516879]
+ ]
+ },
+ "id": "43940d85-6b60-40df-ac32-49642b0a3d9b",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0711298309974, 59.3472882566409],
+ [18.071101844995, 59.3472832160955]
+ ]
+ },
+ "id": "6df7372d-390a-4713-be33-58403684be86",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0711613641483, 59.3472824116004]
+ },
+ "id": "45f5d03c-4d7a-49e0-9034-45cb387047f8",
+ "properties": {
+ "pointType": "Exit"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.071067112854, 59.3473225812675]
+ },
+ "id": "f668f93b-9ac8-4aa5-8900-596d2e343620",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.070859652998, 59.3472673082633]
+ },
+ "id": "a865cf39-195e-4fdc-ade4-152c36275805",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0708022800472, 59.3473281792267]
+ },
+ "id": "256c5666-cc6e-4022-a491-e50bae74883f",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0710698705253, 59.3473752647278]
+ },
+ "id": "e56fff22-ff5b-4e67-96f0-336addafe556",
+ "properties": {
+ "pointType": "Stair"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0710202054586, 59.3473785546882]
+ },
+ "id": "84fa30b6-f855-4825-9580-7536c9c11099",
+ "properties": {
+ "pointType": "WC"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0707199512311, 59.3473178031244]
+ },
+ "id": "477ceaac-0b59-4e06-966e-448b574db20d",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.07059398149, 59.347183781676]
+ },
+ "id": "4ea44c54-99c5-4159-b3a0-b9bfedc21131",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0705060363941, 59.3472666010876]
+ },
+ "id": "1b150529-2c99-4c07-9605-15f980520bab",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0703960202112, 59.3474519890836]
+ },
+ "id": "ab84fd34-b353-4098-b33e-5e59b60b69e3",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0704006015907, 59.3474826389246]
+ },
+ "id": "4b279cdf-3e99-49f0-bcb8-c4a19c95e9e2",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0705266538357, 59.3475411795617]
+ },
+ "id": "c023a164-2e1d-41f6-8fb3-16704093df14",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0705294694827, 59.3475918846156]
+ },
+ "id": "8a53b02f-e7b4-4c0a-87a2-5fcbdffb7b8c",
+ "properties": {
+ "pointType": "WC"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0704672744939, 59.3475366807326]
+ },
+ "id": "9ba6f082-cafe-4c2a-9f13-1ae65e3a5c82",
+ "properties": {
+ "pointType": "Disability"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0702685366238, 59.3474913798005]
+ },
+ "id": "bde82fe3-f102-4868-84cd-55b81e574230",
+ "properties": {
+ "pointType": "Exit"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0702977607746, 59.3475125827149]
+ },
+ "id": "907c815e-f1a1-4a1d-9660-0e771538783c",
+ "properties": {
+ "pointType": "Stair"
+ }
+ }
+ ]
+}
diff --git a/src/app/student/map/data/nymble.plan2.rooms.json b/src/app/student/map/data/nymble.plan2.rooms.json
new file mode 100644
index 0000000..82cceac
--- /dev/null
+++ b/src/app/student/map/data/nymble.plan2.rooms.json
@@ -0,0 +1,210 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0711752783287, 59.34730006083],
+ [18.0711076517097, 59.3473638719518],
+ [18.0710750378116, 59.3473531122405],
+ [18.0710385506706, 59.3473843925681],
+ [18.0710202054586, 59.3473785546882],
+ [18.0710602515606, 59.3473480865663],
+ [18.0710491618713, 59.3473424326851],
+ [18.071101844995, 59.3472832160955],
+ [18.0711298309974, 59.3472882566409],
+ [18.0711752783287, 59.34730006083]
+ ]
+ ]
+ },
+ "id": "cc013c1f-2cf1-4a4e-9c84-14590b5b912b",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0707865685375, 59.3473229932334],
+ [18.0708179915569, 59.34733336522],
+ [18.0708678862071, 59.3473134424233],
+ [18.0709694426238, 59.3473472287524],
+ [18.070943309732, 59.3473732429792],
+ [18.0709816374182, 59.3473862047108],
+ [18.0710491618713, 59.3473424326851],
+ [18.0710902928335, 59.347296434371],
+ [18.070993369288, 59.3472793545899],
+ [18.0710460733512, 59.3472197042177],
+ [18.0709204724391, 59.3471975784692],
+ [18.070850920914, 59.3472778373907],
+ [18.0707865685375, 59.3473229932334]
+ ]
+ ]
+ },
+ "id": "9bdbd468-2dc3-41f2-ba88-f73556a4727a",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0705508958919, 59.3472452033339],
+ [18.0707394340084, 59.3473074352535],
+ [18.0708150799516, 59.3472633265443],
+ [18.070850920914, 59.3472778373907],
+ [18.0708680861658, 59.3472576343637],
+ [18.0708337076987, 59.3472461102521],
+ [18.0708785811952, 59.3472148853845],
+ [18.070898010466, 59.3472239970207],
+ [18.0709204724391, 59.3471975784692],
+ [18.0706206654654, 59.3471420240734],
+ [18.0705508958919, 59.3472452033339]
+ ]
+ ]
+ },
+ "id": "62747e9b-b5a2-4373-955a-101af091dde3",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0704277095722, 59.3474733211873],
+ [18.0705756126778, 59.347574193637],
+ [18.070943309732, 59.3473732429792],
+ [18.0707394340084, 59.3473074352535],
+ [18.0704277095722, 59.3474733211873]
+ ]
+ ]
+ },
+ "id": "297d5795-9765-4f0d-944d-3c7d9ce24f26",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0704277095722, 59.3474733211873],
+ [18.0702818969734, 59.3473733193724],
+ [18.0705508958919, 59.3472452033339],
+ [18.0707394340084, 59.3473074352535],
+ [18.0704277095722, 59.3474733211873]
+ ]
+ ]
+ },
+ "id": "52cc08d5-74d6-48bb-84f9-e0d1132ee560",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0702625301525, 59.3473631142046],
+ [18.0704699394737, 59.3472593087154],
+ [18.0704948017612, 59.3472719843365],
+ [18.0705172710271, 59.3472612178387],
+ [18.070342600317, 59.3471808068307],
+ [18.0701269624063, 59.3472916780295],
+ [18.0702625301525, 59.3473631142046]
+ ]
+ ]
+ },
+ "id": "6c5272aa-37f3-46b0-9b30-2bdbe485b2d3",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0705172710271, 59.3472612178387],
+ [18.0705508958919, 59.3472452033339],
+ [18.0706148108521, 59.3471511498114],
+ [18.0705905617158, 59.3471469681871],
+ [18.0705419118769, 59.3471285195965],
+ [18.0704431582867, 59.3471918760321],
+ [18.0704642881452, 59.3472038197099],
+ [18.0704546419059, 59.3472085035041],
+ [18.0704192723605, 59.3471909392729],
+ [18.0703644341558, 59.3471908582067],
+ [18.0705172710271, 59.3472612178387]
+ ]
+ ]
+ },
+ "id": "3d897b24-2258-4265-ae48-65d5a219f342",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0704192723605, 59.3471909392729],
+ [18.070525695264, 59.3471223700664],
+ [18.0704984626785, 59.3471110308468],
+ [18.0703644341558, 59.3471908582067],
+ [18.0704192723605, 59.3471909392729]
+ ]
+ ]
+ },
+ "id": "634a9898-099d-4dff-9ea0-b44977da35b3",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0702818969734, 59.3473733193724],
+ [18.070225784199, 59.3473907802145],
+ [18.0703303660357, 59.3474597379816],
+ [18.070229126104, 59.3474949294918],
+ [18.0702774163296, 59.3475290960751],
+ [18.0704277095722, 59.3474733211873],
+ [18.0702818969734, 59.3473733193724]
+ ]
+ ]
+ },
+ "id": "667dd8d6-975e-4790-a2fd-f005264b326a",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0702774163296, 59.3475290960751],
+ [18.0704618862225, 59.3476591468337],
+ [18.0705576966544, 59.3476233644059],
+ [18.0704866146362, 59.3475721797243],
+ [18.0705422766142, 59.3475518940418],
+ [18.0705110310573, 59.3475304650815],
+ [18.0704563101688, 59.3475515795966],
+ [18.0704367806215, 59.347537846171],
+ [18.070490200686, 59.347516179108],
+ [18.0704277095722, 59.3474733211873],
+ [18.0702774163296, 59.3475290960751]
+ ]
+ ]
+ },
+ "id": "9a5866e8-e68b-4996-9828-19d2e4e008b9",
+ "properties": {}
+ }
+ ]
+}
diff --git a/src/app/student/map/data/nymble.plan2.routes.json b/src/app/student/map/data/nymble.plan2.routes.json
new file mode 100644
index 0000000..3065639
--- /dev/null
+++ b/src/app/student/map/data/nymble.plan2.routes.json
@@ -0,0 +1,209 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0711613641483, 59.3472824116004],
+ [18.0711126361945, 59.3473337435911],
+ [18.071067112854, 59.3473225812675],
+ [18.0709899339862, 59.3473020906811],
+ [18.0709555011568, 59.3472926771354],
+ [18.0709214134965, 59.3472830406577],
+ [18.0708905001274, 59.3472740395608],
+ [18.0708022800472, 59.3473281792267],
+ [18.0707776299242, 59.347341928974],
+ [18.0707199512311, 59.3473178031244],
+ [18.0706621847214, 59.3472952295766],
+ [18.0706375985209, 59.3473108217105],
+ [18.0705822843898, 59.3473432465831],
+ [18.0704994983329, 59.3473908361191],
+ [18.0703964640153, 59.347451892227],
+ [18.0703714600447, 59.3474611881188],
+ [18.0703933282037, 59.3474778465529],
+ [18.0702977607746, 59.3475125827149]
+ ]
+ },
+ "id": "704af829-677c-47a3-bbc3-af0492e923dd",
+ "properties": {
+ "lineType": "Route"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0706375985209, 59.3473108217105],
+ [18.0705831314167, 59.3472908505971],
+ [18.070563857661, 59.3472847882197],
+ [18.0705542207832, 59.347281757031],
+ [18.0705445839054, 59.3472787258424],
+ [18.0705060363941, 59.3472666010876],
+ [18.0703691720102, 59.3472042429081],
+ [18.0702823047917, 59.3472485307412],
+ [18.0701954375732, 59.3472928185744],
+ [18.0702798572654, 59.3473386559583],
+ [18.0703707806626, 59.3472932286464],
+ [18.0703047913742, 59.3472595120782],
+ [18.0702822702433, 59.3472484401217]
+ ]
+ },
+ "id": "84a8f014-635a-4dc4-97b0-00fbf8e4754c",
+ "properties": {
+ "lineType": "Route"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705542207832, 59.347281757031],
+ [18.0704168239234, 59.347351863255],
+ [18.0704994983329, 59.3473908361191]
+ ]
+ },
+ "id": "a839efd4-6108-42cc-9c72-f6e7fd5f356c",
+ "properties": {
+ "lineType": "Route"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0709214134965, 59.3472830406577],
+ [18.070958304417, 59.3472403602388]
+ ]
+ },
+ "id": "10b691c4-091e-44a0-a818-7c511474be98",
+ "properties": {
+ "lineType": "Route"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0708905001274, 59.3472740395608],
+ [18.070859652998, 59.3472673082633],
+ [18.0707794634471, 59.3472412949785],
+ [18.0708064744491, 59.3472164815362],
+ [18.0706498205578, 59.3471748363122],
+ [18.0706292027128, 59.3471946316598],
+ [18.0705975415829, 59.3472251310893],
+ [18.0707447397723, 59.3472701590469],
+ [18.0707795398074, 59.3472412763994]
+ ]
+ },
+ "id": "fa91aa6f-3c42-4295-a89b-b68360c697d3",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0706292027128, 59.3471946316598],
+ [18.07059398149, 59.347183781676],
+ [18.0705651483865, 59.3471745836581],
+ [18.0704421095631, 59.3472332332003]
+ ]
+ },
+ "id": "5440f489-46c0-4de2-b5bc-b2612f8b9793",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0707776299242, 59.347341928974],
+ [18.0708204975809, 59.3473734418044],
+ [18.0707360951309, 59.3474207759297],
+ [18.0705989411491, 59.3474950043112],
+ [18.0705704553227, 59.347484246583],
+ [18.0705419694962, 59.3474734888549],
+ [18.0706896737838, 59.347391729997],
+ [18.0707776299242, 59.347341928974]
+ ]
+ },
+ "id": "77ef8c5a-77ef-4c69-87a7-191552a8c2ce",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0706896737838, 59.347391729997],
+ [18.0707360951309, 59.3474207759297]
+ ]
+ },
+ "id": "9f3836b1-820a-4572-a094-9d5e082331dd",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705704553227, 59.347484246583],
+ [18.0705152934893, 59.3475125621405],
+ [18.0705446799934, 59.3475325382848],
+ [18.0705266538357, 59.3475411795617],
+ [18.0704333811688, 59.3475764784198]
+ ]
+ },
+ "id": "0b775a5f-bc21-4619-a28d-e992d92761d9",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0704856625293, 59.3476176274171],
+ [18.0704333811688, 59.3475764784198],
+ [18.0703560337194, 59.3475237980581],
+ [18.0704168472346, 59.347498504882],
+ [18.0704006015907, 59.3474826389246],
+ [18.0703933282037, 59.3474778465529]
+ ]
+ },
+ "id": "f9f0cd93-3d06-46dc-a0dd-e6f0e3a0c04c",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0711126361945, 59.3473337435911],
+ [18.0710698705253, 59.3473752647278]
+ ]
+ },
+ "id": "f3e48879-0adf-40c7-99e2-851de6daf055",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ }
+ ]
+}
diff --git a/src/app/student/map/data/nymble.plan3.json b/src/app/student/map/data/nymble.plan3.json
new file mode 100644
index 0000000..2559b91
--- /dev/null
+++ b/src/app/student/map/data/nymble.plan3.json
@@ -0,0 +1,487 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0711930067188, 59.347042747245],
+ [18.0713103533637, 59.3470697551376],
+ [18.0712675256898, 59.3471226837169],
+ [18.0713157587403, 59.347135634353],
+ [18.0713157587403, 59.347135634353],
+ [18.0713157587403, 59.347135634353],
+ [18.071128124413, 59.3473443546483],
+ [18.0710540250362, 59.3474100487968],
+ [18.0709420428093, 59.3473734688484],
+ [18.0705756002709, 59.3475741517368],
+ [18.070613957741, 59.3476014663604],
+ [18.0704606875707, 59.3476588360075],
+ [18.0702314249898, 59.3474958641892],
+ [18.0703322753922, 59.3474595193754],
+ [18.0702053455753, 59.3473770745996],
+ [18.0700304601452, 59.3474387506107],
+ [18.0699870392218, 59.3474156134931],
+ [18.069894289004, 59.3474599268669],
+ [18.0698044549962, 59.3474122915882],
+ [18.0697793407483, 59.347426470014],
+ [18.06972320068, 59.3473960307868],
+ [18.0697483087412, 59.3473825195389],
+ [18.0697146209883, 59.3473646563094],
+ [18.0699273089715, 59.347254886003],
+ [18.0699667968037, 59.3472763603672],
+ [18.0707474574257, 59.3468681244545],
+ [18.0707744471541, 59.346880260971],
+ [18.0708258721703, 59.346853779614],
+ [18.0708863201258, 59.346881457088],
+ [18.0708793002326, 59.3468993521665],
+ [18.0708712774982, 59.3469152020854],
+ [18.0708652604462, 59.3469279842724],
+ [18.0708572377118, 59.3469412777418],
+ [18.0708440788497, 59.346957546892],
+ [18.0708323441254, 59.346968618025],
+ [18.0708196071214, 59.3469778112096],
+ [18.0708013521149, 59.3469903001362],
+ [18.0707623479453, 59.3470152684079],
+ [18.0707428458604, 59.3470277525438],
+ [18.0707094283957, 59.3470480700969],
+ [18.070676010931, 59.3470683876499],
+ [18.0709837944158, 59.3471265058287],
+ [18.0711034509778, 59.3471502698067],
+ [18.0711930067188, 59.347042747245]
+ ]
+ ]
+ },
+ "id": "855a296f-4490-43f7-b194-951cc1032855",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0712095747477, 59.3480790852357],
+ [18.0712903958708, 59.347942776218],
+ [18.0709529378076, 59.3478899170815],
+ [18.0707573954904, 59.3482137559026],
+ [18.0710954693885, 59.3482671184499],
+ [18.0711285586667, 59.3482160406181],
+ [18.0711971389478, 59.3482076058431],
+ [18.0712144943881, 59.348245304258],
+ [18.0716148140838, 59.3481810345006],
+ [18.0716322484424, 59.3482165879985],
+ [18.0728254871594, 59.3482258471298],
+ [18.0728382276515, 59.3482521703616],
+ [18.073132274893, 59.3482075154664],
+ [18.0731175227447, 59.3481640991591],
+ [18.0732590092694, 59.3481350409696],
+ [18.0727304121318, 59.3475216689317],
+ [18.0725071182309, 59.3475732908663],
+ [18.0724910249768, 59.3475493601778],
+ [18.0723294218845, 59.3475886748713],
+ [18.0723817249602, 59.3476543132142],
+ [18.0716261869782, 59.3479209127282],
+ [18.0716753150026, 59.3479556879361],
+ [18.0714443551832, 59.3480402681832],
+ [18.0712095747477, 59.3480790852357]
+ ]
+ ]
+ },
+ "id": "018b7d37-760e-4817-b1d0-0c0148f30daa",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0703322753922, 59.3474595193754],
+ [18.0703948237239, 59.3474351586535],
+ [18.070438691685, 59.347419076346],
+ [18.0704735055337, 59.347445429803],
+ [18.070733018168, 59.3473107161555],
+ [18.0707805520807, 59.3473253854731],
+ [18.0707951891622, 59.3473297245481],
+ [18.0708098262436, 59.3473340636232],
+ [18.0708250545867, 59.3473383061768],
+ [18.0709420428093, 59.3473734688484]
+ ]
+ },
+ "id": "37736cf8-9615-409d-a0b6-651713201bf1",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705756002709, 59.3475741517368],
+ [18.0705530032025, 59.3475567776014],
+ [18.0705417046683, 59.3475480905337],
+ [18.0705150246083, 59.3475277852828],
+ [18.0704852119974, 59.3475046551952],
+ [18.07047222194, 59.3474947088761],
+ [18.0704592318825, 59.3474847625571],
+ [18.0704332517677, 59.347464869919],
+ [18.0704140377458, 59.3474500142862],
+ [18.0703948237239, 59.3474351586535]
+ ]
+ },
+ "id": "63d10e29-f982-49d5-b689-2b6453d42c3b",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0704332517677, 59.347464869919],
+ [18.0703932741115, 59.3474799212103],
+ [18.0703732852833, 59.3474874468559],
+ [18.0703532964552, 59.3474949725016],
+ [18.0702733411427, 59.3475250750842]
+ ]
+ },
+ "id": "13d532ec-e643-45ff-bbe5-4d6fe0967d80",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0703732852833, 59.3474874468559],
+ [18.07042835851, 59.3475277956827],
+ [18.0704852119974, 59.3475046551952]
+ ]
+ },
+ "id": "207ca416-9884-4f4f-899c-683405e79265",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0705150246083, 59.3475277852828],
+ [18.0704481606415, 59.3475531661175],
+ [18.070473686883, 59.3475743208826],
+ [18.0705417046683, 59.3475480905337]
+ ]
+ },
+ "id": "3172dbe6-3ddc-4c3b-ab20-6b84368a3909",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0712686443398, 59.3471226837169],
+ [18.0712887800369, 59.347127816664],
+ [18.0713157587403, 59.347135634353],
+ [18.071128124413, 59.3473443546483],
+ [18.0710910747246, 59.3473772017226],
+ [18.0710818123025, 59.3473854134911],
+ [18.0710725498804, 59.3473936252597],
+ [18.0710540250362, 59.3474100487968],
+ [18.0710540250362, 59.3474100487968],
+ [18.0710540250362, 59.3474100487968],
+ [18.0709980339228, 59.3473917588226],
+ [18.0709840361444, 59.3473871863291],
+ [18.0709770372552, 59.3473849000823],
+ [18.070970038366, 59.3473826138355],
+ [18.0709420428093, 59.3473734688484],
+ [18.0709420428093, 59.3473734688484],
+ [18.0708847861627, 59.3474048255497],
+ [18.0708561578394, 59.3474205039004],
+ [18.0708275295161, 59.347436182251],
+ [18.0708160781867, 59.3474424535913],
+ [18.0708046268574, 59.3474487249316],
+ [18.0707817241988, 59.3474612676121],
+ [18.0707588215401, 59.3474738102926],
+ [18.0706672109055, 59.3475239810147],
+ [18.0706443082468, 59.3475365236952],
+ [18.0706214055882, 59.3475490663758],
+ [18.0705756002709, 59.3475741517368],
+ [18.070613957741, 59.3476014663604],
+ [18.0704606875707, 59.3476588360075],
+ [18.0702314249898, 59.3474958641892],
+ [18.0703322753922, 59.3474595193754],
+ [18.0702053455753, 59.3473770745996],
+ [18.0700304601452, 59.3474387506107],
+ [18.0699870392218, 59.3474156134931],
+ [18.069894289004, 59.3474599268669],
+ [18.0698044549962, 59.3474122915882],
+ [18.0697793407483, 59.347426470014],
+ [18.06972320068, 59.3473960307868],
+ [18.0697483087412, 59.3473825195389],
+ [18.0697146209883, 59.3473646563094],
+ [18.0697146209883, 59.3473646563094],
+ [18.0699273089715, 59.347254886003],
+ [18.0699667968037, 59.3472763603672],
+ [18.0707474574257, 59.3468681244545],
+ [18.070767699722, 59.3468772268419],
+ [18.0707742211702, 59.3468802283964],
+ [18.0707744471541, 59.346880260971],
+ [18.0708258721703, 59.346853779614],
+ [18.0708863201258, 59.346881457088],
+ [18.0708793002326, 59.3468993521665],
+ [18.0708712774982, 59.3469152020854],
+ [18.0708652604462, 59.3469279842724],
+ [18.0708572377118, 59.3469412777418],
+ [18.0708440788497, 59.346957546892],
+ [18.0708394831696, 59.346962243108],
+ [18.0708323441254, 59.346968618025],
+ [18.0708068701174, 59.3469870043942],
+ [18.0707830971084, 59.3470027890628],
+ [18.0707593241004, 59.3470182918554],
+ [18.0707233437756, 59.3470402366796],
+ [18.070676010931, 59.3470683876499],
+ [18.0709837944158, 59.3471265058287],
+ [18.0710272868707, 59.3471356454142],
+ [18.0711034509778, 59.3471502698067],
+ [18.0711930067188, 59.347042747245],
+ [18.0713103533637, 59.3470697551376],
+ [18.0712775935388, 59.3471078551993],
+ [18.0712675256898, 59.3471226837169]
+ ]
+ },
+ "id": "bb6584d0-86aa-4f5a-a772-5300466d6014",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0706443082468, 59.3475365236952],
+ [18.0706031832127, 59.3475201312304],
+ [18.0705906766906, 59.3475131004722],
+ [18.0705840333011, 59.347506044227],
+ [18.070577943527, 59.3474981412306],
+ [18.0705746734681, 59.3474910057566],
+ [18.070570746522, 59.3474803594819],
+ [18.0705691088326, 59.3474722288718],
+ [18.0705719151139, 59.3474636445066],
+ [18.0705765097471, 59.3474548846553],
+ [18.0705831457983, 59.3474481181314],
+ [18.0705950906891, 59.3474399983013],
+ [18.0706136716312, 59.3474307507145],
+ [18.0706287133472, 59.3474242097367],
+ [18.0706437559199, 59.3474190057716],
+ [18.0706720326238, 59.3474109264896],
+ [18.0706893440628, 59.3474033406784],
+ [18.0708046268574, 59.3474487249316]
+ ]
+ },
+ "id": "f864824e-1fa7-46b1-81df-1d335d1fa07c",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0707646454258, 59.3473600425189],
+ [18.0708561578394, 59.3474205039004]
+ ]
+ },
+ "id": "7aab05ac-0233-423f-ab74-ccfbec72ebbc",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0706893440628, 59.3474033406784],
+ [18.0706968741991, 59.3473990108625],
+ [18.0707044043354, 59.3473946810465],
+ [18.070719464608, 59.3473860214146],
+ [18.0707495851532, 59.3473687021508],
+ [18.0707646454258, 59.3473600425189],
+ [18.070771987893, 59.3473560276727],
+ [18.0708098262436, 59.3473340636232]
+ ]
+ },
+ "id": "310839dc-54b8-41b3-b21c-b3a38ec7176f",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0707805520807, 59.3473253854731],
+ [18.070889566876, 59.3472452750055],
+ [18.070909167502, 59.3472211385076],
+ [18.0710849705957, 59.347262862983],
+ [18.0710723626077, 59.347276412947],
+ [18.0711283941859, 59.3472915140195],
+ [18.0710895068418, 59.3473327935858],
+ [18.0710846459238, 59.3473379535316],
+ [18.0710797850058, 59.3473431134774],
+ [18.0710700631698, 59.347353433369],
+ [18.0710506194978, 59.3473740731521],
+ [18.0710818123025, 59.3473854134911]
+ ]
+ },
+ "id": "a597be8f-32a9-4117-8235-a596516a65b6",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0709840361444, 59.3473871863291],
+ [18.0710155751816, 59.3473564739023],
+ [18.071036645337, 59.3473358118837],
+ [18.0710471142188, 59.3473257614754],
+ [18.0710846459238, 59.3473379535316]
+ ]
+ },
+ "id": "5caf92a8-4a2e-40be-a95c-45fd57f27e8c",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.071128124413, 59.3473443546483],
+ [18.0710895068418, 59.3473327935858]
+ ]
+ },
+ "id": "30ef2fe2-6d0d-4537-b603-e95fc9a913ff",
+ "properties": {
+ "lineType": "Boundary"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0710771505053, 59.3473680131871]
+ },
+ "id": "f750a076-b132-434f-bbbe-c17f578c54b8",
+ "properties": {
+ "pointType": "Exit"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.071036645337, 59.3473358118837]
+ },
+ "id": "7b153fa2-4f5d-49bc-a5e0-056612f63694",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0707951891622, 59.3473297245481]
+ },
+ "id": "48e1b3e0-e911-4f1f-9763-c4483c426093",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.070771987893, 59.3473560276727]
+ },
+ "id": "030fd4dd-628f-49b8-9a37-b3382bf402d9",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0706968741991, 59.3473990108625]
+ },
+ "id": "c4f24509-bfcc-4e48-909c-e67b949fa0cc",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0704969714348, 59.3475502694562]
+ },
+ "id": "0772709a-724b-4251-9c0b-81da16027bd5",
+ "properties": {
+ "pointType": "Disability"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0703947098073, 59.3474863399089]
+ },
+ "id": "7c824b2f-1b57-4fe1-8357-8474dbbb0e52",
+ "properties": {
+ "pointType": "WC"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.0704140377458, 59.3474500142862]
+ },
+ "id": "acc8e528-c9bd-4489-a309-c8614c436593",
+ "properties": {
+ "pointType": "Door"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Point",
+ "coordinates": [18.070298939919, 59.3474871097379]
+ },
+ "id": "64926d9e-3910-4e65-8467-1688aee46eb8",
+ "properties": {
+ "pointType": "Exit"
+ }
+ }
+ ]
+}
diff --git a/src/app/student/map/data/nymble.plan3.rooms.json b/src/app/student/map/data/nymble.plan3.rooms.json
new file mode 100644
index 0000000..cde84fb
--- /dev/null
+++ b/src/app/student/map/data/nymble.plan3.rooms.json
@@ -0,0 +1,137 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0710846459238, 59.3473379535316],
+ [18.0711283941859, 59.3472915140195],
+ [18.0710723626077, 59.347276412947],
+ [18.0710849705957, 59.347262862983],
+ [18.070909167502, 59.3472211385076],
+ [18.070889566876, 59.3472452750055],
+ [18.0707805520807, 59.3473253854731],
+ [18.0709840361444, 59.3473871863291],
+ [18.0710471142188, 59.3473257614754],
+ [18.0710846459238, 59.3473379535316]
+ ]
+ ]
+ },
+ "id": "c33f3384-e6bd-412e-96ee-4ad6c86700f1",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0707646454258, 59.3473600425189],
+ [18.0708561578394, 59.3474205039004],
+ [18.0709420428093, 59.3473734688484],
+ [18.0708098262436, 59.3473340636232],
+ [18.0707646454258, 59.3473600425189]
+ ]
+ ]
+ },
+ "id": "5ba628a6-f9d5-4085-ac46-acaa04a61c0f",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0706893440628, 59.3474033406784],
+ [18.0708046268574, 59.3474487249316],
+ [18.0708561578394, 59.3474205039004],
+ [18.0707646454258, 59.3473600425189],
+ [18.0706893440628, 59.3474033406784]
+ ]
+ ]
+ },
+ "id": "d75c8e9e-7490-46e9-9af5-5f842f5d3f59",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.070733018168, 59.3473107161555],
+ [18.0708098262436, 59.3473340636232],
+ [18.0706893440628, 59.3474033406784],
+ [18.0706720326238, 59.3474109264896],
+ [18.0706437559199, 59.3474190057716],
+ [18.0706287133472, 59.3474242097367],
+ [18.0706136716312, 59.3474307507145],
+ [18.0705950906891, 59.3474399983013],
+ [18.0705831457983, 59.3474481181314],
+ [18.0705765097471, 59.3474548846553],
+ [18.0705719151139, 59.3474636445066],
+ [18.0705691088326, 59.3474722288718],
+ [18.070570746522, 59.3474803594819],
+ [18.0705746734681, 59.3474910057566],
+ [18.070577943527, 59.3474981412306],
+ [18.0705840333011, 59.347506044227],
+ [18.0705906766906, 59.3475131004722],
+ [18.0706031832127, 59.3475201312304],
+ [18.0706443082468, 59.3475365236952],
+ [18.0705756002709, 59.3475741517368],
+ [18.0703948237239, 59.3474351586535],
+ [18.070438691685, 59.347419076346],
+ [18.0704735055337, 59.347445429803],
+ [18.070733018168, 59.3473107161555]
+ ]
+ ]
+ },
+ "id": "49588ad1-cc11-4293-aeaf-cbe3db6c31f1",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0702726206098, 59.3475251481878],
+ [18.0704606875707, 59.3476588360075],
+ [18.070613957741, 59.3476014663604],
+ [18.0705417046683, 59.3475480905337],
+ [18.070473686883, 59.3475743208826],
+ [18.0704481606415, 59.3475531661175],
+ [18.0705150246083, 59.3475277852828],
+ [18.0704852119974, 59.3475046551952],
+ [18.07042835851, 59.3475277956827],
+ [18.0703732852833, 59.3474874468559],
+ [18.0702726206098, 59.3475251481878]
+ ]
+ ]
+ },
+ "id": "3a6ce893-70da-4b6e-999a-e3f10c3889e1",
+ "properties": {}
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [18.0704332517677, 59.347464869919],
+ [18.0703948237239, 59.3474351586535],
+ [18.0702314249898, 59.3474958641892],
+ [18.0702726206098, 59.3475251481878],
+ [18.0704332517677, 59.347464869919]
+ ]
+ ]
+ },
+ "id": "6462f6b9-0793-4bb2-b748-db0f033562d8",
+ "properties": {}
+ }
+ ]
+}
diff --git a/src/app/student/map/data/nymble.plan3.routes.json b/src/app/student/map/data/nymble.plan3.routes.json
new file mode 100644
index 0000000..900fbe4
--- /dev/null
+++ b/src/app/student/map/data/nymble.plan3.routes.json
@@ -0,0 +1,75 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0710475772794, 59.3473392739253],
+ [18.0709089580462, 59.3473005337531],
+ [18.0708860071727, 59.3473218710646],
+ [18.0708327665601, 59.3473061232353],
+ [18.0707951891622, 59.3473297245481],
+ [18.0707586559314, 59.3473501048147],
+ [18.0707392254695, 59.3473613545766],
+ [18.0706832617768, 59.3473929846051],
+ [18.0706968741991, 59.3473990108625],
+ [18.0707481189712, 59.3474190364099],
+ [18.0707932785283, 59.3473981488803],
+ [18.0707393334065, 59.34736105064]
+ ]
+ },
+ "id": "a6a82e6c-bc14-4ee8-a974-c11c2be27bfc",
+ "properties": {
+ "lineType": "Route"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0706832617768, 59.3473929846051],
+ [18.0704942093057, 59.3474729649697],
+ [18.0705633455824, 59.3475293613531]
+ ]
+ },
+ "id": "69fd6e56-7dd2-4f15-b69f-ade9ff8dcf87",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0704942093057, 59.3474729649697],
+ [18.0704376432616, 59.3474428441357],
+ [18.0704140377458, 59.3474500142862],
+ [18.070298939919, 59.3474871097379]
+ ]
+ },
+ "id": "bdcd70fd-4587-4b3f-ba4f-06e57c65f3b7",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ },
+ {
+ "type": "Feature",
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [18.0707586559314, 59.3473501048147],
+ [18.070771987893, 59.3473560276727],
+ [18.0708406693166, 59.3473875395227]
+ ]
+ },
+ "id": "814ad897-37cf-4932-9964-9f77ff79a18a",
+ "properties": {
+ "lineType": "RouteHint"
+ }
+ }
+ ]
+}
diff --git a/src/app/student/map/editor/EditorMapComponent.tsx b/src/app/student/map/editor/EditorMapComponent.tsx
index e806c98..155b1f0 100644
--- a/src/app/student/map/editor/EditorMapComponent.tsx
+++ b/src/app/student/map/editor/EditorMapComponent.tsx
@@ -12,30 +12,29 @@ import {
geoJsonBuildingData,
makeBooth
} from "@/app/student/map/lib/booths"
+import {
+ backgroundLayerStyle,
+ buildingLayerStyle,
+ lineLayerStyle,
+ routeLayerStyle,
+ symbolLayerStyle
+} from "@/app/student/map/lib/config"
import { Location } from "@/app/student/map/lib/locations"
import { getPolygonCenter } from "@/app/student/map/lib/utils"
import { Exhibitor } from "@/components/shared/hooks/api/useExhibitors"
+import { useGeoJsonPlanData } from "@/components/shared/hooks/useGeoJsonPlanData"
import MapboxDraw, { DrawMode } from "@mapbox/mapbox-gl-draw"
import { Feature, Polygon } from "geojson"
import "maplibre-gl/dist/maplibre-gl.css"
import { useEffect, useMemo, useRef, useState } from "react"
import {
- BackgroundLayer,
Layer,
Map as MapboxMap,
MapRef,
- Popup
+ Popup,
+ Source
} from "react-map-gl/maplibre"
-const backgroundLayerStyle: BackgroundLayer = {
- id: "background",
- type: "background",
- paint: {
- "background-color": "#40d07e",
- "background-opacity": 0.2
- }
-}
-
export type FeatureMap = Map
export default function EditorMapComponent({
@@ -53,6 +52,9 @@ export default function EditorMapComponent({
const [showBuildings, setShowBuildings] = useState(false)
+ const [geoJsonPlanData, geoJsonNymblePlanRoutesData] =
+ useGeoJsonPlanData(location)
+
const geoJsonData = showBuildings ? geoJsonBuildingData : geoJsonBoothData
// this is the main data structure for storing the editable features
@@ -213,6 +215,39 @@ export default function EditorMapComponent({
mapStyle="https://api.maptiler.com/maps/977e9770-60b4-4b8a-94e9-a9fa8db4c68d/style.json?key=57xj41WPFBbOEWiVSSwL">
+ {/** Order sensitive! */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{mapLoaded && !showBuildings && markers}
{mapLoaded && activeFeatureId != null && (
diff --git a/src/app/student/map/lib/booths.ts b/src/app/student/map/lib/booths.ts
index 911e6fa..d61e044 100644
--- a/src/app/student/map/lib/booths.ts
+++ b/src/app/student/map/lib/booths.ts
@@ -3,11 +3,11 @@ import {
locations,
validLocationId
} from "@/app/student/map/lib/locations"
+import { getPolygonCenter } from "@/app/student/map/lib/utils"
import type { Exhibitor } from "@/components/shared/hooks/api/useExhibitors"
import type { Feature, FeatureCollection, Polygon, Position } from "geojson"
import boothDataRaw from "../data/booths.json"
import buildingsDataRaw from "../data/buildings.json"
-import { getPolygonCenter } from "@/app/student/map/lib/utils"
export type BoothID = number
diff --git a/src/app/student/map/lib/config.ts b/src/app/student/map/lib/config.ts
index af1432c..8da7e36 100644
--- a/src/app/student/map/lib/config.ts
+++ b/src/app/student/map/lib/config.ts
@@ -1,4 +1,35 @@
-import { FillLayer, LineLayer, BackgroundLayer } from "react-map-gl/maplibre"
+import { FeatureCollection, LineString, Point, Polygon } from "geojson"
+import { MutableRefObject } from "react"
+import {
+ BackgroundLayer,
+ FillLayer,
+ LineLayer,
+ MapRef,
+ SymbolLayer
+} from "react-map-gl/maplibre"
+
+// Geojson data for floor structure, routes and exhibitor room
+import nymblePlan2DataRaw from "../data/nymble.plan2.json"
+import nymblePlan2RoomsDataRaw from "../data/nymble.plan2.rooms.json"
+import nymblePlan2RoutesDataRaw from "../data/nymble.plan2.routes.json"
+import nymblePlan3DataRaw from "../data/nymble.plan3.json"
+import nymblePlan3RoomsDataRaw from "../data/nymble.plan3.rooms.json"
+import nymblePlan3RoutesDataRaw from "../data/nymble.plan3.routes.json"
+
+export type GeoJsonPlanData = FeatureCollection
+export type GeoJsonLinesData = FeatureCollection
+
+export const geoJsonNymblePlan2Data = nymblePlan2DataRaw as GeoJsonPlanData
+export const geoJsonNymblePlan2RoutesData =
+ nymblePlan2RoutesDataRaw as GeoJsonLinesData
+export const geoJsonNymblePlan2RoomsData =
+ nymblePlan2RoomsDataRaw as GeoJsonPlanData
+
+export const geoJsonNymblePlan3Data = nymblePlan3DataRaw as GeoJsonPlanData
+export const geoJsonNymblePlan3RoutesData =
+ nymblePlan3RoutesDataRaw as GeoJsonLinesData
+export const geoJsonNymblePlan3RoomsData =
+ nymblePlan3RoomsDataRaw as GeoJsonPlanData
const style = {
boothFillColor: "#89bc82",
@@ -8,13 +39,66 @@ const style = {
boothHoveredFillColor: "#a0df98",
boothNotFilteredOpacity: 0.4,
+ buildingBackgroundColor: "#1A201C",
buildingOutlineColor: "#ff0000",
buildingOutlineWidth: 2,
+ buildingStructureColor: "#17845A",
+ buildingStructureWidth: 3,
+
+ routeColor: "#F3ECC3",
+ routeWidth: 2,
+
+ routeHintColor: "#F3E592",
+ routeHintWidth: 1,
+
+ roomBackgroundColor: "#1f2b24",
+
backgroundColor: "#40d07e",
backgroundOpacity: 0.2
} as const
+export enum LineType {
+ Boundary = "Boundary",
+ Route = "Route",
+ RouteHint = "RouteHint"
+}
+
+export enum PointType {
+ Exit = "Exit",
+ Door = "Door",
+ WC = "WC",
+ Stair = "Stair",
+ Disability = "Disability"
+}
+
+// Function to add icon assets after map is loaded
+export async function addMapIconAssets(
+ mapRef: MutableRefObject
+) {
+ const map = mapRef.current?.getMap()
+ if (!map) return
+ const loadImage = async (url: string) => {
+ const response = await fetch(url)
+ const blob = await response.blob()
+ return await createImageBitmap(blob)
+ }
+ try {
+ const exitIcon = await loadImage("/map_icons/exit.png")
+ const doorIcon = await loadImage("/map_icons/door.png")
+ const wcIcon = await loadImage("/map_icons/wc.png")
+ const stairIcon = await loadImage("/map_icons/stair.png")
+ const disabilityIcon = await loadImage("/map_icons/disability.png")
+
+ map.addImage("exit-icon", exitIcon)
+ map.addImage("door-icon", doorIcon)
+ map.addImage("wc-icon", wcIcon)
+ map.addImage("stair-icon", stairIcon)
+ map.addImage("disability-icon", disabilityIcon)
+ } catch (error) {
+ console.error("Error loading icons:", error)
+ }
+}
// features can be styled based on properties or feature state using a weird expression language, see:
// https://docs.mapbox.com/style-spec/reference/expressions/#data-expressions for reference
@@ -41,13 +125,23 @@ export const boothLayerStyle: FillLayer = {
}
}
-export const buildingLayerStyle: LineLayer = {
+export const buildingLayerStyle: FillLayer = {
source: "buildings",
id: "buildings",
- type: "line",
+ type: "fill",
+ filter: ["==", "$type", "Polygon"],
+ paint: {
+ "fill-color": style.buildingBackgroundColor
+ }
+}
+
+export const roomLayerStyle: FillLayer = {
+ source: "rooms",
+ id: "rooms",
+ type: "fill",
+ filter: ["==", "$type", "Polygon"],
paint: {
- "line-color": style.buildingOutlineColor,
- "line-width": style.buildingOutlineWidth
+ "fill-color": style.roomBackgroundColor
}
}
@@ -59,3 +153,67 @@ export const backgroundLayerStyle: BackgroundLayer = {
"background-opacity": style.backgroundOpacity
}
}
+
+export const lineLayerStyle: LineLayer = {
+ source: "lines",
+ id: "lines",
+ type: "line",
+ filter: ["==", "$type", "LineString"],
+ paint: {
+ "line-color": style.buildingStructureColor,
+ "line-width": style.buildingStructureWidth
+ }
+}
+
+export const routeLayerStyle: LineLayer = {
+ source: "routes",
+ id: "routes",
+ type: "line",
+ filter: ["==", "$type", "LineString"],
+ paint: {
+ "line-color": [
+ "case",
+ ["==", ["get", "lineType"], LineType.Route],
+ style.routeColor,
+ ["==", ["get", "lineType"], LineType.RouteHint],
+ style.routeHintColor,
+ style.buildingStructureColor
+ ],
+ "line-width": [
+ "case",
+ ["==", ["get", "lineType"], LineType.Route],
+ style.routeWidth,
+ ["==", ["get", "lineType"], LineType.RouteHint],
+ style.routeHintWidth,
+ style.buildingStructureWidth
+ ],
+ // Apply dash pattern for Route lines
+ "line-dasharray": ["literal", [2, 2]]
+ }
+}
+
+export const symbolLayerStyle: SymbolLayer = {
+ source: "points",
+ id: "points",
+ type: "symbol",
+ filter: ["==", "$type", "Point"],
+ layout: {
+ // Specify which image to use for each PointType
+ "icon-image": [
+ "case",
+ ["==", ["get", "pointType"], PointType.Exit],
+ "exit-icon",
+ ["==", ["get", "pointType"], PointType.Door],
+ "door-icon",
+ ["==", ["get", "pointType"], PointType.WC],
+ "wc-icon",
+ ["==", ["get", "pointType"], PointType.Stair],
+ "stair-icon",
+ ["==", ["get", "pointType"], PointType.Disability],
+ "disability-icon",
+ "default" // fallback icon
+ ],
+ "icon-size": 0.6, // Adjust icon size
+ "icon-allow-overlap": true // Allow icons to overlap
+ }
+}
diff --git a/src/app/student/map/lib/locations.ts b/src/app/student/map/lib/locations.ts
index e0bbbf2..951ff3e 100644
--- a/src/app/student/map/lib/locations.ts
+++ b/src/app/student/map/lib/locations.ts
@@ -1,4 +1,4 @@
-export type LocationId = "nymble/1" | "nymble/2" | "nymble/3" | "library"
+export type LocationId = "nymble/2" | "nymble/3" | "library" //Removed nymble/1, we only show plan 2, 3 and library
export type Location = {
id: LocationId
@@ -9,21 +9,16 @@ export type Location = {
const nymbleCenter = {
longitude: 18.070408551823675,
latitude: 59.34726434961294,
- zoom: 18
+ zoom: 19
}
const libraryCenter = {
longitude: 18.072008997107673,
latitude: 59.347931139608846,
- zoom: 18
+ zoom: 19
}
export const locations: Location[] = [
- {
- id: "nymble/1",
- label: "Nymble - floor 1",
- center: nymbleCenter
- },
{
id: "nymble/2",
label: "Nymble - floor 2",
diff --git a/src/app/student/map/lib/survey.ts b/src/app/student/map/lib/survey.ts
new file mode 100644
index 0000000..b5b590f
--- /dev/null
+++ b/src/app/student/map/lib/survey.ts
@@ -0,0 +1,62 @@
+export const LOCAL_STORAGE_KEY = "survey_data"
+
+export interface SurveyData {
+ Programme: string
+ JobType?: string[]
+ IndustryType?: string[]
+}
+
+export const programmeList = [
+ "Architecture",
+ "Biotechnology",
+ "Building Engineering",
+ "Chemical Engineering",
+ "Computer Science",
+ "Electrical Engineering",
+ "Engineering and Education",
+ "Environmental & Sustainability Engineering",
+ "Industrial Engineering",
+ "Industrial Economics",
+ "Information Technology",
+ "Technical Mathematics",
+ "Material design",
+ "Mechanical Engineering",
+ "Media Technology",
+ "Medical Engineering",
+ "Material & Product Design",
+ "Physics",
+ "Vehicle Engineering",
+ "Urban Management Engineering",
+ "Open",
+ "Other"
+]
+
+export const jobTypeList = [
+ "Full-time",
+ "Internship",
+ "Part-time",
+ "Trainee",
+ "Summer job",
+ "Bachelor thesis",
+ "Master thesis"
+]
+
+export const industryTypeList = [
+ "Architecture",
+ "Biotechnology",
+ "Chemical Science and Engineering",
+ "Computer Science and Engineering",
+ "Electrical Engineering",
+ "Engineering Physics",
+ "Environmental Engineering",
+ "Industrial Management",
+ "Information and Communication Technology",
+ "Material Science and Engineering",
+ "Mathematics",
+ "Medical Engineering",
+ "Technology and Economics",
+ "Technology and Health",
+ "Technology and Learning",
+ "Technology and Management",
+ "The Built Environment"
+]
diff --git a/src/app/student/map/survey/_components/IndustryTypeSelection.tsx b/src/app/student/map/survey/_components/IndustryTypeSelection.tsx
new file mode 100644
index 0000000..f3d5de2
--- /dev/null
+++ b/src/app/student/map/survey/_components/IndustryTypeSelection.tsx
@@ -0,0 +1,50 @@
+"use client"
+
+import { industryTypeList } from "@/app/student/map/lib/survey"
+import { SelectionItem } from "@/app/student/map/survey/_components/SelectionItem"
+import { useState } from "react"
+
+export default function IndustryTypeSelection({
+ industryTypeSelection,
+ onIndustryTypeSelect
+}: {
+ industryTypeSelection: string[]
+ onIndustryTypeSelect: (industryType: string) => void
+}) {
+ const [showAll, setShowAll] = useState(false)
+ const initialVisibleCount = 5
+
+ const handleLoadMoreClick = () => {
+ setShowAll(prev => !prev)
+ }
+ const industryTypeItems = showAll
+ ? industryTypeList
+ : industryTypeList.slice(0, initialVisibleCount)
+
+ return (
+
+
+
Industries:
+
+ {industryTypeItems.map(industryType => (
+
+ onIndustryTypeSelect(industryType)}
+ />
+
+ ))}
+ {/* Show "Load More" or "Show Less" based on the current state */}
+ {industryTypeList.length > initialVisibleCount && (
+
+ )}
+
+
+
+ )
+}
diff --git a/src/app/student/map/survey/_components/JobTypeSelection.tsx b/src/app/student/map/survey/_components/JobTypeSelection.tsx
new file mode 100644
index 0000000..6ab30aa
--- /dev/null
+++ b/src/app/student/map/survey/_components/JobTypeSelection.tsx
@@ -0,0 +1,31 @@
+"use client"
+
+import { jobTypeList } from "@/app/student/map/lib/survey"
+import { SelectionItem } from "@/app/student/map/survey/_components/SelectionItem"
+
+export default function JobTypeSelection({
+ jobTypeSelection,
+ onJobTypeSelect
+}: {
+ jobTypeSelection: string[]
+ onJobTypeSelect: (jobType: string) => void
+}) {
+ return (
+
+
+
Employments:
+
+ {jobTypeList.map(jobType => (
+
+ onJobTypeSelect(jobType)}
+ />
+
+ ))}
+
+
+
+ )
+}
diff --git a/src/app/student/map/survey/_components/ProgrammeSelection.tsx b/src/app/student/map/survey/_components/ProgrammeSelection.tsx
new file mode 100644
index 0000000..ee5342a
--- /dev/null
+++ b/src/app/student/map/survey/_components/ProgrammeSelection.tsx
@@ -0,0 +1,121 @@
+"use client"
+
+import { programmeList } from "@/app/student/map/lib/survey"
+import { Input } from "@/components/ui/input"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger
+} from "@/components/ui/popover"
+import { ScrollArea } from "@radix-ui/react-scroll-area"
+import { ChevronDown } from "lucide-react"
+import { useRef, useState } from "react"
+
+export default function ProgrammeSelection({
+ programme,
+ onProgrammeSelectChange
+}: {
+ programme: string
+ onProgrammeSelectChange: (programme: string) => void
+}) {
+ return (
+
+ )
+}
+
+function ProgrammeSelector({
+ programme,
+ onProgrammeSelectChange
+}: {
+ programme: string
+ onProgrammeSelectChange: (programme: string) => void
+}) {
+ const [searchText, setSearchText] = useState("")
+ const [open, setOpen] = useState(false)
+ const [programmes, setProgrammes] = useState(programmeList)
+
+ const inputRef = useRef(null)
+ const scrollAreaRef = useRef(null)
+
+ function filterBySearch(text: string) {
+ setSearchText(text)
+ setProgrammes(
+ programmeList.filter(programme =>
+ programme.toLowerCase().includes(text.toLowerCase())
+ )
+ )
+ }
+
+ // Fix can't scroll when form is in Modal
+ function handleWheelScroll(event: React.WheelEvent) {
+ if (scrollAreaRef.current) {
+ scrollAreaRef.current.scrollTop += event.deltaY
+ event.preventDefault()
+ }
+ }
+
+ return (
+
+ !open && setTimeout(() => filterBySearch(""), 300) && setOpen(false)
+ }>
+ setOpen(!open)}>
+
+ {programme}
+
+
+
+ {
+ e.preventDefault()
+ }}>
+
+
filterBySearch(e.target.value)}>
+
+
+ {programmes.map(programme => (
+
+ ))}
+
+
+
+
+
+ )
+}
diff --git a/src/app/student/map/survey/_components/SelectionItem.tsx b/src/app/student/map/survey/_components/SelectionItem.tsx
new file mode 100644
index 0000000..5b6659c
--- /dev/null
+++ b/src/app/student/map/survey/_components/SelectionItem.tsx
@@ -0,0 +1,21 @@
+export function SelectionItem({
+ name,
+ isSelected,
+ onClick
+}: {
+ name: string
+ isSelected: boolean
+ onClick: () => void
+}) {
+ return (
+
+ {name}
+
+ )
+}
diff --git a/src/app/student/map/survey/page.tsx b/src/app/student/map/survey/page.tsx
new file mode 100644
index 0000000..e75975e
--- /dev/null
+++ b/src/app/student/map/survey/page.tsx
@@ -0,0 +1,10 @@
+import { QuestionnaireForm } from "@/app/student/map/_components/QuestionnaireForm"
+import { Page } from "@/components/shared/Page"
+
+export default async function SurveyPage() {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/shared/hooks/useFeatureState.tsx b/src/components/shared/hooks/useFeatureState.tsx
new file mode 100644
index 0000000..8ba93dc
--- /dev/null
+++ b/src/components/shared/hooks/useFeatureState.tsx
@@ -0,0 +1,33 @@
+// Keep mapbox feature state in sync with component state
+
+import { BoothID } from "@/app/student/map/lib/booths"
+import { MutableRefObject, useEffect } from "react"
+import { MapRef } from "react-map-gl/dist/esm/exports-maplibre"
+
+// to allow for styling of the features
+export function useFeatureState(
+ mapRef: MutableRefObject,
+ boothIds: BoothID[],
+ stateKey: "active" | "hover" | "filtered"
+) {
+ useEffect(() => {
+ const map = mapRef.current
+ if (map == null || boothIds.length === 0 || !map.isStyleLoaded()) return
+
+ for (const boothId of boothIds) {
+ map.setFeatureState(
+ { source: "booths", id: boothId },
+ { [stateKey]: true }
+ )
+ }
+
+ return () => {
+ for (const boothId of boothIds) {
+ map.setFeatureState(
+ { source: "booths", id: boothId },
+ { [stateKey]: false }
+ )
+ }
+ }
+ }, [boothIds, stateKey])
+}
diff --git a/src/components/shared/hooks/useGeoJsonPlanData.tsx b/src/components/shared/hooks/useGeoJsonPlanData.tsx
new file mode 100644
index 0000000..f82885e
--- /dev/null
+++ b/src/components/shared/hooks/useGeoJsonPlanData.tsx
@@ -0,0 +1,44 @@
+"use client"
+
+import {
+ geoJsonNymblePlan2Data,
+ geoJsonNymblePlan2RoomsData,
+ geoJsonNymblePlan2RoutesData,
+ geoJsonNymblePlan3Data,
+ geoJsonNymblePlan3RoomsData,
+ geoJsonNymblePlan3RoutesData
+} from "@/app/student/map/lib/config"
+import { Location } from "@/app/student/map/lib/locations"
+import { useEffect, useState } from "react"
+
+//Change layer style data source based on selected location
+export function useGeoJsonPlanData(location: Location) {
+ const [geoJsonPlanData, setGeoJsonPlanData] = useState(geoJsonNymblePlan2Data)
+ const [geoJsonPlanRoutesData, setGeoJsonPlanRoutesData] = useState(
+ geoJsonNymblePlan2RoutesData
+ )
+ const [geoJsonPlanRoomsData, setGeoJsonPlanRoomsData] = useState(
+ geoJsonNymblePlan2RoomsData
+ )
+
+ useEffect(() => {
+ switch (location.id) {
+ case "nymble/2": {
+ setGeoJsonPlanData(geoJsonNymblePlan2Data)
+ setGeoJsonPlanRoutesData(geoJsonNymblePlan2RoutesData)
+ setGeoJsonPlanRoomsData(geoJsonNymblePlan2RoomsData)
+ break
+ }
+ case "nymble/3": {
+ setGeoJsonPlanData(geoJsonNymblePlan3Data)
+ setGeoJsonPlanRoutesData(geoJsonNymblePlan3RoutesData)
+ setGeoJsonPlanRoomsData(geoJsonNymblePlan3RoomsData)
+ break
+ }
+ case "library":
+ //TODO: library plan data
+ break
+ }
+ }, [location])
+ return [geoJsonPlanData, geoJsonPlanRoutesData, geoJsonPlanRoomsData]
+}
diff --git a/src/components/shared/hooks/useSurveyData.tsx b/src/components/shared/hooks/useSurveyData.tsx
new file mode 100644
index 0000000..041b942
--- /dev/null
+++ b/src/components/shared/hooks/useSurveyData.tsx
@@ -0,0 +1,20 @@
+"use client"
+
+import { LOCAL_STORAGE_KEY, SurveyData } from "@/app/student/map/lib/survey"
+import { useEffect, useState } from "react"
+
+export function useSurveyData() {
+ const [surveyData, setSurveyData] = useState(null)
+ const [isSurveyDataLoaded, setIsSurveyDataLoaded] = useState(false)
+
+ useEffect(() => {
+ const rawStoredData = localStorage.getItem(LOCAL_STORAGE_KEY)
+
+ const storedData = rawStoredData
+ ? (JSON.parse(rawStoredData) as SurveyData)
+ : null
+ setSurveyData(storedData)
+ setIsSurveyDataLoaded(true) // Mark data fetching as done
+ }, [])
+ return { surveyData, isSurveyDataLoaded }
+}