feat: ✨ added broken map for supporting multiple tracks (will likely get removed) and added colorless rendering for tracks in point cloud
Some checks failed
Build and Push Docker Image / build-and-push (push) Failing after 47s
Some checks failed
Build and Push Docker Image / build-and-push (push) Failing after 47s
This commit is contained in:
@ -6,7 +6,6 @@ from sqlalchemy.exc import OperationalError
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
# TODO: build license plate into car api construct and rebuild api to fit new data
|
||||
# Funktion zur Herstellung einer Verbindung zur Datenbank
|
||||
def db_connect():
|
||||
try:
|
||||
@ -30,20 +29,23 @@ def create_table(engine):
|
||||
except Exception as e:
|
||||
print(f"Fehler bei der Tabellenerstellung: {e}")
|
||||
|
||||
# Track-Tabelle
|
||||
class Track(Base):
|
||||
__tablename__ = 'track'
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
trackName = Column(String(200), nullable=True)
|
||||
vehicle_id = Column(Integer, ForeignKey('vehicle.id'), nullable=False, default=1)
|
||||
driver_id = Column(Integer, ForeignKey('driver.id'), nullable=False, default=1)
|
||||
vehicle_id = Column(Integer, ForeignKey('vehicle.id'), nullable=False)
|
||||
driver_id = Column(Integer, ForeignKey('driver.id'), nullable=False)
|
||||
date = Column(Date, nullable=True)
|
||||
distance = Column(Float, nullable=False, default=0)
|
||||
speed = Column(Float, nullable=False, default=0)
|
||||
|
||||
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)
|
||||
distance = Column(Float, nullable=False, default=0.0)
|
||||
speed = Column(Float, nullable=False, default=0.0)
|
||||
|
||||
# Beziehungen
|
||||
driver = relationship("Driver", back_populates="tracks", foreign_keys=[driver_id])
|
||||
vehicle = relationship("Vehicle", back_populates="tracks", foreign_keys=[vehicle_id])
|
||||
waypoints = relationship('Waypoint', back_populates='track', lazy=True)
|
||||
|
||||
# Waypoint-Tabelle
|
||||
class Waypoint(Base):
|
||||
__tablename__ = 'waypoint'
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
@ -54,16 +56,24 @@ class Waypoint(Base):
|
||||
time = Column(DateTime, nullable=True)
|
||||
track_id = Column(Integer, ForeignKey('track.id'), nullable=False)
|
||||
|
||||
# Beziehung zu Track
|
||||
track = relationship("Track", back_populates="waypoints")
|
||||
|
||||
# Driver-Tabelle
|
||||
class Driver(Base):
|
||||
__tablename__ = 'driver'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String, nullable=False)
|
||||
tracks = relationship("Track", back_populates="driver") # Beziehung von Track -> Driver
|
||||
|
||||
# Beziehung zu Tracks
|
||||
tracks = relationship("Track", back_populates="driver", overlaps="vehicle_tracks")
|
||||
|
||||
# Vehicle-Tabelle
|
||||
class Vehicle(Base):
|
||||
__tablename__ = 'vehicle'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String, nullable=False)
|
||||
tracks = relationship("Track", back_populates="vehicle") # Beziehung von Track -> Vehicle
|
||||
licenseplate = Column(String, nullable=True)
|
||||
|
||||
# Beziehung zu Tracks
|
||||
tracks = relationship("Track", back_populates="vehicle", overlaps="driver_tracks")
|
||||
|
@ -2,7 +2,7 @@ import datetime
|
||||
import gpxpy
|
||||
import gpxpy.gpx
|
||||
from sqlalchemy.orm import Session
|
||||
from geojson import Feature, LineString
|
||||
from geojson import Feature, LineString, FeatureCollection
|
||||
from geopy.distance import geodesic
|
||||
|
||||
from errors.NotFoundException import NotFoundError
|
||||
@ -92,6 +92,31 @@ class GPXHandler:
|
||||
feature = Feature(geometry=LineString(coordinates))
|
||||
return feature
|
||||
|
||||
# handles getting all infos of a track from the database
|
||||
def getTrackMeta(self, trackID):
|
||||
track = self.__dbSession.query(Track).filter_by(id=trackID).first()
|
||||
if not track:
|
||||
raise NotFoundError(f"track with id {trackID} not found", errors=[])
|
||||
|
||||
trackObject = {
|
||||
"id": track.id,
|
||||
"name": track.trackName,
|
||||
"driver": {
|
||||
"id": track.driver.id,
|
||||
"name": track.driver.name
|
||||
} if track.driver else None,
|
||||
"vehicle": {
|
||||
"id": track.vehicle.id,
|
||||
"name": track.vehicle.name,
|
||||
"licenseplate": track.vehicle.licenseplate
|
||||
} if track.vehicle else None,
|
||||
"distance": track.distance,
|
||||
"time": track.date,
|
||||
}
|
||||
|
||||
return trackObject
|
||||
|
||||
|
||||
# grabs only the tracks from the database and returns them as json object
|
||||
def getTracks(self):
|
||||
tracks = self.__dbSession.query(Track).all()
|
||||
@ -100,23 +125,39 @@ class GPXHandler:
|
||||
{
|
||||
"id": track.id,
|
||||
"name": track.trackName,
|
||||
# "driver": {
|
||||
# "id": track.driver.id,
|
||||
# "name": track.driver.name
|
||||
# } if track.driver else None,
|
||||
# "vehicle": {
|
||||
# "id": track.vehicle.id,
|
||||
# "name": track.vehicle.name
|
||||
# } if track.vehicle else None,
|
||||
# "distance": track.distance,
|
||||
# "startTime": track.start.isoformat() if track.start else None,
|
||||
# "endTime": track.end.isoformat() if track.end else None,
|
||||
"time": track.date,
|
||||
}
|
||||
for track in tracks # iterates all tracks and appends them to the list
|
||||
]
|
||||
|
||||
return track_list
|
||||
|
||||
def getTracksInTimeWithGeoData(self, start, end):
|
||||
# Alle Tracks in der Zeitspanne abfragen
|
||||
tracks = self.__dbSession.query(Track).filter(Track.date.between(start, end)).all()
|
||||
|
||||
# Eine Liste von GeoJSON-Features für alle Tracks
|
||||
features = []
|
||||
|
||||
# Für jedes Track-Objekt die Waypoints abfragen und die GeoJSON-Daten generieren
|
||||
for track in tracks:
|
||||
# Waypoints für das Track laden
|
||||
waypoints = track.waypoints # track.waypoints ist bereits korrekt verknüpft
|
||||
|
||||
# Waypoints in GeoJSON-kompatible Koordinaten umwandeln
|
||||
coordinates = [(wp.lon, wp.lat) for wp in waypoints]
|
||||
|
||||
# LineString Feature für das Track erstellen
|
||||
feature = Feature(geometry=LineString(coordinates))
|
||||
features.append(feature)
|
||||
|
||||
# Ein FeatureCollection erstellen, das alle Track-Features enthält
|
||||
feature_collection = FeatureCollection(features)
|
||||
|
||||
# GeoJSON zurückgeben, das von Leaflet verarbeitet werden kann
|
||||
return feature_collection
|
||||
|
||||
|
||||
|
||||
def getTracksInTime(self, start, end):
|
||||
tracks = self.__dbSession.query(Track).filter(Track.date.between(start, end)).all()
|
||||
@ -134,10 +175,9 @@ class GPXHandler:
|
||||
"name": track.vehicle.name
|
||||
} if track.vehicle else None,
|
||||
"distance": track.distance,
|
||||
"startTime": track.start.isoformat() if track.start else None,
|
||||
"end_time": track.end.isoformat() if track.end else None,
|
||||
"time": track.date,
|
||||
}
|
||||
for track in tracks # iterates all tracks and appends them to the list
|
||||
]
|
||||
|
||||
return track_list
|
||||
return track_list
|
@ -10,11 +10,11 @@ class VehicleHandler:
|
||||
pass
|
||||
|
||||
# handles creating a vehicle and storing it in the database
|
||||
def createVehicle(self, name:str) -> Vehicle:
|
||||
def createVehicle(self, name:str, licenseplate:str) -> Vehicle:
|
||||
if not name:
|
||||
raise ValueError("name is empty")
|
||||
|
||||
vehicle = Vehicle(name=name)
|
||||
vehicle = Vehicle(name=name, licenseplate=licenseplate)
|
||||
|
||||
self.dbSession.add(vehicle)
|
||||
self.dbSession.commit()
|
||||
@ -34,7 +34,8 @@ class VehicleHandler:
|
||||
driverList = [
|
||||
{
|
||||
"id": vehicle.id,
|
||||
"name": vehicle.name
|
||||
"name": vehicle.name,
|
||||
"licensePlate": vehicle.licenseplate
|
||||
}
|
||||
# iterates all drivers and appends them to the list
|
||||
for vehicle in vehicles
|
||||
|
Reference in New Issue
Block a user