fix: 🐛 fixed issue in both back and frontend that would prevent geojson data from beeing loaded

This commit is contained in:
steev 2025-01-09 01:15:20 +01:00
parent 77cf71e288
commit c97499196c
12 changed files with 6308 additions and 187 deletions

52
app.py
View File

@ -7,7 +7,7 @@ from sqlalchemy.orm import sessionmaker, Session
from modules.driverHandler import DriverHandler from modules.driverHandler import DriverHandler
from modules.gpxInterpreter import GPXHandler from modules.gpxInterpreter import GPXHandler
from modules.vehicleHandler import VehicleHandler from modules.vehicleHandler import VehicleHandler
from modules.geoObjects import create_table, db_connect from modules.geoObjects import Waypoint, create_table, db_connect, Driver, Vehicle
from flask_cors import CORS, cross_origin from flask_cors import CORS, cross_origin
root = logging.getLogger() root = logging.getLogger()
@ -52,7 +52,9 @@ def serve_vue_app():
@cross_origin() @cross_origin()
def getTrack(): def getTrack():
if "start" in request.args and "end" in request.args or "track" in request.args: app.logger.debug(f"found arguments {request.args}")
if ("start" in request.args and "end" in request.args) or ("id" in request.args):
if "start" in request.args and "end" in request.args: if "start" in request.args and "end" in request.args:
# get tracks by filter # get tracks by filter
start = request.args["start"] start = request.args["start"]
@ -60,21 +62,23 @@ def getTrack():
try: try:
return gpxHandler.getTracksInTime(start, request.args["end"]), 200 return gpxHandler.getTracksInTime(start, request.args["end"]), 200
except Exception as e: except Exception as e:
app.logger.debug(f"failed to search tracks error { app.logger.debug(f"failed to search tracks error {e} values: start={start}, end={end}")
e} values: start={start}, end={end}")
return f"error {e}", 500 return f"error {e}", 500
elif "track" in request.args: elif "id" in request.args:
# get track by id # get track by id
track = int(request.args["track"]) trackID = int(request.args["id"])
try: try:
return gpxHandler.getTrack(track), 200 app.logger.debug(f"Request args: {request.args}")
app.logger.debug(f"track id {trackID}")
track = gpxHandler.getTrack(trackID)
app.logger.debug(f"returned track {track}")
return jsonify(track), 200
except Exception as e: except Exception as e:
app.logger.debug(f"fetching track { app.logger.debug(f"fetching track failed with error {e}")
track} failed with error {e}")
return f"error {e}", 500 return f"error {e}", 500
pass
else: else:
try: try:
# gets all tracks as list # gets all tracks as list
@ -181,18 +185,32 @@ def uploadFile():
app.logger.debug("no file was found in clients request") app.logger.debug("no file was found in clients request")
return "no file provided", 400 return "no file provided", 400
if request.args["routeName"] == '':
app.logger.debug("client did not provide any name for uploaded route")
return "no route name provided", 400
file = request.files['file'] file = request.files['file']
if file.filename == '': if file.filename == '':
app.logger.debug("filename was found empty") app.logger.debug("filename was found empty")
return "no file selected", 400 return "no file selected", 400
try: try:
app.logger.debug(f"attempting to parse file: {file.name}")
gpxHandler.parse(file, request.args["routeName"]) app.logger.debug(f"Received file: {file.filename}, size: {len(file.read())} bytes")
file.seek(0) # Setzt den Datei-Zeiger zurück, nachdem die Größe abgerufen wurde.
file_path = f'./uploads/{file.filename}'
with open(file_path, 'wb') as f:
f.write(file.read())
driver = driverHandler.getDriver(1)
vehicle = vehicleHandler.getVehicle(1)
app.logger.debug(f"driver {driver.id}")
app.logger.debug(f"vehicle {vehicle.id}")
if not driver or not vehicle:
raise ValueError("Driver or vehicle not found")
app.logger.debug(f"attempting to parse file: {file.filename}")
gpxHandler.parse(file.filename, driver, vehicle)
return "file stored succesfull", 200 return "file stored succesfull", 200
except Exception as e: except Exception as e:
app.logger.debug(f"storing gpx file failed with error {e}") app.logger.debug(f"storing gpx file failed with error {e}")

View File

@ -1,5 +1,6 @@
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from errors.NotFoundException import NotFoundError
from modules.geoObjects import Driver from modules.geoObjects import Driver
@ -27,14 +28,13 @@ class DriverHandler:
raise RuntimeError(f"failed to create driver with errors{e}") raise RuntimeError(f"failed to create driver with errors{e}")
# handles getting a driver by its id from the database # handles getting a driver by its id from the database
def getDriver(self, driverID: int): def getDriver(self, driverID: int) -> Driver:
try: try:
driver = self.dbSession.query(Driver).filter_by(id=driverID).first() driver = self.dbSession.query(Driver).filter_by(id=driverID).first()
if driver:
return { return driver
"id": driver.id, else:
"name": driver.name raise NotFoundError(f"Driver with ID {driverID} not found", errors=[])
}
except Exception as e: except Exception as e:
raise RuntimeError(f"failed to get driver with errors{e}") raise RuntimeError(f"failed to get driver with errors{e}")

View File

@ -1,7 +1,7 @@
from sqlalchemy import create_engine, Column, Table, ForeignKey, Index, UniqueConstraint, MetaData, SmallInteger, Integer, String, Date, DateTime, Float, Boolean, Text, Numeric, DateTime from sqlalchemy import create_engine, Column, ForeignKey, Integer, String, Date, Float, DateTime
from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.pool import NullPool from sqlalchemy.pool import NullPool
from sqlalchemy.exc import OperationalError from sqlalchemy.exc import OperationalError
Base = declarative_base() Base = declarative_base()
@ -28,7 +28,7 @@ def create_table(engine):
print("Keine Verbindung zur Datenbank verfügbar.") print("Keine Verbindung zur Datenbank verfügbar.")
except Exception as e: except Exception as e:
print(f"Fehler bei der Tabellenerstellung: {e}") print(f"Fehler bei der Tabellenerstellung: {e}")
class Track(Base): class Track(Base):
__tablename__ = 'track' __tablename__ = 'track'
id = Column(Integer, primary_key=True, autoincrement=True) id = Column(Integer, primary_key=True, autoincrement=True)
@ -38,14 +38,10 @@ class Track(Base):
date = Column(Date, nullable=True) date = Column(Date, nullable=True)
distance = Column(Float, nullable=False, default=0) distance = Column(Float, nullable=False, default=0)
speed = Column(Float, nullable=False, default=0) speed = Column(Float, nullable=False, default=0)
start = Column(DateTime, nullable=False)
end = Column(DateTime, nullable=False)
# Beziehungen zu anderen Tabellen driver = relationship("Driver", backref="vehicle_tracks") # 'vehicle_tracks' als backref
vehicle = relationship("Vehicle", backref="driver_tracks") # 'driver_tracks' als backref
waypoints = relationship('Waypoint', backref='track', lazy=True) waypoints = relationship('Waypoint', backref='track', lazy=True)
driver = relationship('Driver', back_populates='tracks')
vehicle = relationship('Vehicle', back_populates='tracks')
class Waypoint(Base): class Waypoint(Base):
__tablename__ = 'waypoint' __tablename__ = 'waypoint'
@ -57,20 +53,16 @@ class Waypoint(Base):
time = Column(DateTime, nullable=True) time = Column(DateTime, nullable=True)
track_id = Column(Integer, ForeignKey('track.id'), nullable=False) track_id = Column(Integer, ForeignKey('track.id'), nullable=False)
class Driver(Base): class Driver(Base):
__tablename__ = 'driver' __tablename__ = 'driver'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, nullable=False)
# Beziehung zu Track, zurück über 'tracks' auf Track-Seite
tracks = relationship("Track", back_populates='driver')
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
tracks = relationship("Track", back_populates="driver") # Beziehung von Track -> Driver
class Vehicle(Base): class Vehicle(Base):
__tablename__ = 'vehicle' __tablename__ = 'vehicle'
id = Column(Integer, primary_key=True, autoincrement=True)
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False) name = Column(String, nullable=False)
tracks = relationship("Track", back_populates="vehicle") # Beziehung von Track -> Vehicle
# Beziehung zu Track, zurück über 'tracks' auf Track-Seite
tracks = relationship('Track', back_populates='vehicle')

View File

@ -6,7 +6,7 @@ from geojson import Feature, LineString
from geopy.distance import geodesic from geopy.distance import geodesic
from errors.NotFoundException import NotFoundError from errors.NotFoundException import NotFoundError
from modules.geoObjects import Track, Waypoint from modules.geoObjects import Driver, Track, Vehicle, Waypoint
class GPXHandler: class GPXHandler:
__dbSession: Session __dbSession: Session
@ -16,8 +16,9 @@ class GPXHandler:
pass pass
# handles converting a gpx file into usable data # handles converting a gpx file into usable data
def parse(self, file, driver, vehicle): def parse(self, file, driver:Driver, vehicle:Vehicle):
self.__gpx = gpxpy.parse(file) print(f"filename: {file}")
self.__gpx = gpxpy.parse(open(f"./uploads/{file}"))
if not driver: if not driver:
raise ValueError("no driver found") raise ValueError("no driver found")
@ -34,47 +35,45 @@ class GPXHandler:
trackName = track.name or f"Track-{datetime.now().isoformat()}" # todo using time.now might end up being misleading and to be reworked trackName = track.name or f"Track-{datetime.now().isoformat()}" # todo using time.now might end up being misleading and to be reworked
# initializes track values # initializes track values
self.__startTime, self.startTime = None
self.__endTime, self.endTime = None
self.__trackDistance, self.trackDistance = 0
self.__waypoints = None, None, 0, [] self.waypoints = []
# grab all waypoints from a track # grab all waypoints from a track
for segment in track.segments: for segment in track.segments:
for point in segment.points: for point in segment.points:
self.__waypoints.append(point) self.waypoints.append(point)
if start_time is None or point.time < start_time: if self.startTime is None or point.time < self.startTime:
start_time = point.time self.startTime = point.time
if end_time is None or point.time > end_time: if self.endTime is None or point.time > self.endTime:
end_time = point.time self.endTime = point.time
# calculate distance between 2 waypoints # calculate distance between 2 waypoints
for i in range(1, len(self.__waypoints)): for i in range(1, len(self.waypoints)):
total_distance += self.__waypoints[i - 1].distance_3d(self.__waypoints[i]) self.trackDistance += self.waypoints[i - 1].distance_3d(self.waypoints[i])
# push values to the database # push values to the database
track = Track( track = Track(
trackName=trackName, trackName=trackName,
vehicle=vehicle.id, vehicle=vehicle,
driver=driver.id, driver=driver,
date=start_time.date() if start_time else None, date=self.startTime.date() if self.startTime else None,
distance=total_distance, distance=self.trackDistance,
speed=0, speed=0,
start=start_time,
end=end_time
) )
self.__dbSession.add(track) self.__dbSession.add(track)
self.__dbSession.commit() self.__dbSession.commit()
for point in self.__waypoints: for point in self.waypoints:
waypoint = Waypoint( waypoint = Waypoint(
lat=point.latitude, lat=point.latitude,
lon=point.longitude, lon=point.longitude,
ele=point.elevation, ele=point.elevation,
speed=None, speed=None,
time=point.time, time=point.time,
track=track.id track=track
) )
self.__dbSession.add(waypoint) self.__dbSession.add(waypoint)
@ -84,10 +83,11 @@ class GPXHandler:
def getTrack(self, trackID): def getTrack(self, trackID):
track = self.__dbSession.query(Track).filter_by(id=trackID).first() track = self.__dbSession.query(Track).filter_by(id=trackID).first()
if not track: if not track:
raise NotFoundError(f"track with id {trackID} not found") raise NotFoundError(f"track with id {trackID} not found", errors=[])
# fetches waypoints for a given track and converts them into geoJSON # fetches waypoints for a given track and converts them into geoJSON
waypoints = self.__dbSession.query(Waypoint).filter_by(track=track.id).all() waypoints = track.waypoints
coordinates = [(wp.lon, wp.lat) for wp in waypoints] coordinates = [(wp.lon, wp.lat) for wp in waypoints]
feature = Feature(geometry=LineString(coordinates)) feature = Feature(geometry=LineString(coordinates))
return feature return feature
@ -109,8 +109,8 @@ class GPXHandler:
# "name": track.vehicle.name # "name": track.vehicle.name
# } if track.vehicle else None, # } if track.vehicle else None,
# "distance": track.distance, # "distance": track.distance,
# "start_time": track.start.isoformat() if track.start else None, # "startTime": track.start.isoformat() if track.start else None,
# "end_time": track.end.isoformat() if track.end else None, # "endTime": track.end.isoformat() if track.end else None,
} }
for track in tracks # iterates all tracks and appends them to the list for track in tracks # iterates all tracks and appends them to the list
] ]
@ -134,7 +134,7 @@ class GPXHandler:
"name": track.vehicle.name "name": track.vehicle.name
} if track.vehicle else None, } if track.vehicle else None,
"distance": track.distance, "distance": track.distance,
"start_time": track.start.isoformat() if track.start else None, "startTime": track.start.isoformat() if track.start else None,
"end_time": track.end.isoformat() if track.end else None, "end_time": track.end.isoformat() if track.end else None,
} }
for track in tracks # iterates all tracks and appends them to the list for track in tracks # iterates all tracks and appends them to the list

View File

@ -22,13 +22,10 @@ class VehicleHandler:
return vehicle return vehicle
# handles getting a vehicle identified with its id from the database # handles getting a vehicle identified with its id from the database
def getVehicle(self, vehicleID:int): def getVehicle(self, vehicleID:int) -> Vehicle:
vehicle = self.dbSession.query(Vehicle).filter_by(id=vehicleID).first() vehicle = self.dbSession.query(Vehicle).filter_by(id=vehicleID).first()
return { return vehicle
"id": vehicle.id,
"name": vehicle.name
}
# handles getting all vehicles from database # handles getting all vehicles from database
def getVehicles(self): def getVehicles(self):

6099
uploads/AA_WITAA000_001.gpx Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +0,0 @@
enum SettingNodes {
allowDateCollect,
theme,
language,
}
/**
* class which handles reading and writing settings
*/
var SettingsHandler = class SettingsHandler implements ISettings{
settings:Map<SettingNodes, any>
constructor() {
this.settings = new Map<SettingNodes, any>();
// TODO: load settings from localstorage if any present
}
/**
* writes settings to the localstorage and handles errors
* @param name the settings name
* @param value
*/
WriteSetting(name:SettingNodes, value:any):boolean {
return false
}
/**
* fetches settings from the localstorage and handles errors
* @param name the requested setting
*/
FetchSetting(name:SettingNodes):any {
return ""
}
}
export {SettingsHandler, SettingNodes};

View File

@ -33,6 +33,7 @@ export default defineComponent({
const target = $event.target as HTMLInputElement; const target = $event.target as HTMLInputElement;
if (target && target.files) { if (target && target.files) {
file.value = target.files[0]; file.value = target.files[0];
console.log(`selected file: ${file.value}`);
} }
} }
@ -45,10 +46,13 @@ export default defineComponent({
const formData = new FormData(); const formData = new FormData();
formData.append("file", file.value); formData.append("file", file.value);
formData.append("driverId", selectedDriver.value.toString()); formData.append("driverId", selectedDriver.value.toString());
try { try {
const response = await fetch('http://localhost:5000/track', {
console.log('Request Body:', formData);
const response = await fetch('http://localhost:5000/upload', {
method: 'POST', method: 'POST',
body: formData, body: formData,
}); });

View File

@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, onMounted, ref } from 'vue'; import { defineComponent, onMounted, PropType, ref, watch } from 'vue';
import "leaflet/dist/leaflet.css"; import "leaflet/dist/leaflet.css";
import L from "leaflet"; import L from "leaflet";
@ -7,28 +7,45 @@ export default defineComponent({
name: 'Map', name: 'Map',
props: { props: {
geoJsonData: { geoJsonData: {
type: Object, type: Object as PropType<any>,
required: false, required: true
default: null, }
},
}, },
setup(props) { setup(props) {
const mapDiv = ref<HTMLElement | null>(null); // ref to map container element const mapDiv = ref<HTMLElement | null>(null); // ref to map container element
const mapInstance = ref<any>(null); // reference for the Leaflet map
onMounted(() => { const initializeMap = () => {
if (mapDiv.value) { if (mapDiv.value) {
const map = L.map(mapDiv.value, { mapInstance.value = L.map(mapDiv.value, {
center: [51.4819, 7.2162], // Beispielkoordinaten, setze deine eigenen center: [51.4819, 7.2162], // Beispielkoordinaten
zoom: 13, zoom: 13,
}); });
// Hinzufügen der GeoJSON-Daten zur Karte
if (props.geoJsonData) {
L.geoJSON(props.geoJsonData).addTo(map);
}
// Hinzufügen von OpenStreetMap-Kacheln // Hinzufügen von OpenStreetMap-Kacheln
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {}).addTo(map); L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {}).addTo(mapInstance.value);
}
};
onMounted(() => {
console.log(props.geoJsonData)
initializeMap();
});
// Beobachte geoJsonData und füge sie der Karte hinzu, wenn sie sich ändert
watch(() => props.geoJsonData, (newData) => {
if (newData) {
console.log("Neue GeoJSON-Daten erhalten:", newData);
// Stelle sicher, dass die Karte initialisiert wurde
if (mapInstance.value) {
const geoJsonLayer = L.geoJSON(newData).addTo(mapInstance.value);
const bounds = geoJsonLayer.getBounds();
mapInstance.value.fitBounds(bounds);
} else {
console.error("Die Karte oder GeoJSON-Daten sind nicht verfügbar.");
}
} }
}); });

View File

@ -1,4 +0,0 @@
interface ISettings {
WriteSetting: (name:SettingNodes, value:any) => boolean;
FetchSetting: (name:SettingNodes) => any;
}

View File

@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import {defineComponent, ref, Ref, SetupContext} from 'vue'; import { defineComponent, ref, Ref, SetupContext } from 'vue';
import PointCloud from '../components/pointcloud.vue'; import PointCloud from '../components/pointcloud.vue';
import VueDatePicker from '@vuepic/vue-datepicker'; import VueDatePicker from '@vuepic/vue-datepicker';
import '@vuepic/vue-datepicker/dist/main.css' import '@vuepic/vue-datepicker/dist/main.css'
@ -7,105 +7,131 @@ import Map from '../components/map.vue';
import FileUpload from '../components/fileUpload.vue'; import FileUpload from '../components/fileUpload.vue';
type DriverType = { type DriverType = {
id:number id: number
name:string name: string
} }
type track = { type track = {
id:number id: number
name:string name: string
driver: DriverType driver: DriverType
} }
type GeoJSONFeature = {
type: "Feature";
geometry: {
type: "LineString";
coordinates: number[][];
};
properties: {
name: string;
driver: string;
};
};
type GeoJSON = {
type: "FeatureCollection";
features: GeoJSONFeature[];
};
export default defineComponent({ export default defineComponent({
name: 'map', name: 'map',
components: {PointCloud, VueDatePicker, Map, FileUpload}, components: { PointCloud, VueDatePicker, Map, FileUpload },
setup(_, { emit }: SetupContext) { setup(_, { emit }: SetupContext) {
const showMap:Ref<boolean> = ref(false); const showMap: Ref<boolean> = ref(false);
const showCloud:Ref<boolean> = ref(false); const showCloud: Ref<boolean> = ref(false);
const search:Ref<boolean> = ref(false); const search: Ref<boolean> = ref(false);
const showUpload:Ref<boolean> = ref(false); const showUpload: Ref<boolean> = ref(false);
const tracks:Ref<track[]> = ref([]) const tracks: Ref<track[]> = ref([])
const startSearchDate = ref(); const startSearchDate = ref();
const endSearchDate = ref(); const endSearchDate = ref();
const mapData = ref(null); const mapData: Ref<GeoJSON | null> = ref(null);
const loadTrack = async (id:number) => { const loadTrack = async (id: number) => {
showMap.value = true; showMap.value = true;
showCloud.value = false; showCloud.value = false;
search.value = false; search.value = false;
showUpload.value = false; showUpload.value = false;
const headers: Headers = new Headers() const headers: Headers = new Headers();
headers.set('Content-Type', 'application/json') headers.set('Content-Type', 'application/json');
headers.set('Accept', 'application/json') headers.set('Accept', 'application/json');
const request: RequestInfo = new Request("http://localhost:5000/track?id=" + id, { const request: RequestInfo = new Request("http://localhost:5000/track?id=" + id, {
method:"GET", method: "GET",
headers:headers headers: headers
}) });
var response = await fetch(request) try {
var response = await fetch(request);
// make sure the request was successfull
if (response.ok){ if (response.ok) {
// convert vehicles from json response to processable data // Wenn die Antwort OK ist, die Daten verarbeiten
mapData.value = await response.json() mapData.value = await response.json();
} else {
console.log(await response.text()) // Überprüfe, ob die Antwort die richtigen Daten enthält
if (mapData.value && mapData.value.features && mapData.value.features.length > 0) {
console.log("GeoJSON-Daten erfolgreich geladen", mapData.value);
} else {
console.log("Keine GeoJSON-Daten in der Antwort.");
}
} else {
console.log(await response.text());
}
} catch (error) {
console.error("Fehler beim Laden der Track-Daten:", error);
} }
};
}
const getTracks = async() => { const getTracks = async () => {
const headers: Headers = new Headers() const headers: Headers = new Headers()
headers.set('Content-Type', 'application/json') headers.set('Content-Type', 'application/json')
headers.set('Accept', 'application/json') headers.set('Accept', 'application/json')
const request: RequestInfo = new Request("http://localhost:5000/track", { const request: RequestInfo = new Request("http://localhost:5000/track", {
method:"GET", method: "GET",
headers:headers headers: headers
}) })
var response = await fetch(request) var response = await fetch(request)
// make sure the request was successfull // make sure the request was successfull
if (response.ok){ if (response.ok) {
var jsonBody = await response.json() var jsonBody = await response.json()
// convert vehicles from json response to processable data // convert vehicles from json response to processable data
for(let i = 0; i < jsonBody.length; i++) { for (let i = 0; i < jsonBody.length; i++) {
tracks.value.push({id: jsonBody[i]["id"], name: jsonBody[i]["name"], driver: { tracks.value.push({ id: jsonBody[i]["id"], name: jsonBody[i]["name"], driver: { name: "", id: 0 } })
id: jsonBody[i]["driver"]["id"], name: jsonBody[i]["driver"]["name"]
}})
} }
} else { } else {
console.log(await response.text()) console.log(await response.text())
} }
} }
const searchTracks = async() => { const searchTracks = async () => {
const headers: Headers = new Headers() const headers: Headers = new Headers()
headers.set('Content-Type', 'application/json') headers.set('Content-Type', 'application/json')
headers.set('Accept', 'application/json') headers.set('Accept', 'application/json')
const request: RequestInfo = new Request("http://localhost:5000/track?start="+startSearchDate.value+"&end="+endSearchDate.value, { const request: RequestInfo = new Request("http://localhost:5000/track?start=" + startSearchDate.value + "&end=" + endSearchDate.value, {
method:"GET", method: "GET",
headers:headers headers: headers
}) })
var response = await fetch(request) var response = await fetch(request)
// make sure the request was successfull // make sure the request was successfull
if (response.ok){ if (response.ok) {
var jsonBody = await response.json() var jsonBody = await response.json()
console.log(jsonBody)
// convert vehicles from json response to processable data // convert vehicles from json response to processable data
for(let i = 0; i < jsonBody.length; i++) { for (let i = 0; i < jsonBody.length; i++) {
tracks.value.push({ tracks.value.push({
id: jsonBody[i]["id"], id: jsonBody[i]["id"],
name: jsonBody[i]["name"], name: jsonBody[i]["name"],
driver:{ driver: {
name:jsonBody[i]["driver"]["name"], name: jsonBody[i]["driver"]["name"],
id:jsonBody[i]["driver"]["id"] id: jsonBody[i]["driver"]["id"]
} }
}) })
} }
@ -114,7 +140,9 @@ export default defineComponent({
} }
} }
return { getTracks()
return {
showMap, showMap,
showCloud, showCloud,
search, search,
@ -133,13 +161,18 @@ export default defineComponent({
<template> <template>
<FileUpload v-if="showUpload" @close="showUpload=false;" :drivers="[]" style="position:absolute; top: 30VH; width: 80%;"></FileUpload> <FileUpload v-if="showUpload" @close="showUpload = false;" :drivers="[]"
style="position:absolute; top: 30VH; width: 80%;"></FileUpload>
<div class="grid grid-flow-col auto-cols-max gap-4"> <div class="grid grid-flow-col auto-cols-max gap-4">
<div> <div>
<ul class="menu menu-xs bg-base-200 rounded-lg w-full max-w-xs overscroll-auto"> <ul class="menu menu-xs bg-base-200 rounded-lg w-full max-w-xs overscroll-auto">
<li> <a v-on:click="showUpload=true; showMap=false;showCloud=false;search=false;"> upload file </a> </li> <li> <a v-on:click="showUpload = true; showMap = false; showCloud = false; search = false;"> upload file </a>
<li> <a v-on:click="search=true;showMap=false;showCloud=false;showUpload=false;"> filter track </a> </li> </li>
<li><div class="divider"></div></li> <li> <a v-on:click="search = true; showMap = false; showCloud = false; showUpload = false;"> filter track </a>
</li>
<li>
<div class="divider"></div>
</li>
<li v-for="track in tracks"> <a v-on:click="loadTrack(track.id)"> {{ track.name }} </a> </li> <li v-for="track in tracks"> <a v-on:click="loadTrack(track.id)"> {{ track.name }} </a> </li>
</ul> </ul>
</div> </div>
@ -158,10 +191,10 @@ export default defineComponent({
<button class="btn btn-success" v-on:click="" style="margin-left: 5%; height:60px; width:120px;">Search</button> <button class="btn btn-success" v-on:click="" style="margin-left: 5%; height:60px; width:120px;">Search</button>
</div> </div>
<div v-if="showMap && !search && !showCloud"> <div v-if="showMap && !search && !showCloud">
<Map style="width: 68VW; margin-left: 10%; border-radius: 10px; border: 1px solid #95a5a6;"></Map> <Map :geoJsonData="mapData"
style="width: 68vw; margin-left: 10%; border-radius: 10px; border: 1px solid #95a5a6;"></Map>
</div> </div>
</div> </div>
</template> </template>
<style scoped> <style scoped></style>
</style>

1
web/tsconfig.tsbuildinfo Normal file
View File

@ -0,0 +1 @@
{"root":["./theme-manager.config.ts","./vite.config.ts","./src/app.vue","./src/leatflet.d.ts","./src/main.ts","./src/vite-env.d.ts","./src/classes/debugger.ts","./src/classes/language.ts","./src/components/settings.vue","./src/components/cookieprompt.vue","./src/components/fileupload.vue","./src/components/map.vue","./src/components/navbar.vue","./src/components/pointcloud.vue","./src/views/driver.vue","./src/views/home.vue","./src/views/login.vue","./src/views/register.vue","./src/views/route.vue","./src/views/settings.vue","./src/views/vehicle.vue"],"version":"5.6.2"}