diff --git a/webapp/src/components/LeafletMap.vue b/webapp/src/components/LeafletMap.vue index f644f45..2730ed8 100644 --- a/webapp/src/components/LeafletMap.vue +++ b/webapp/src/components/LeafletMap.vue @@ -130,7 +130,7 @@ let currentLocationLayer: FeatureGroup; function createSVGMarkers(alpr: ALPR): string { const orientationValues = (alpr.tags['camera:direction'] || alpr.tags.direction || '') .split(';') - .map(val => /^\d+$/.test(val) ? parseInt(val) : cardinalToDegrees(val.trim())); + .map(val => parseDirectionValue(val.trim())); const fovPath = ` @@ -152,6 +152,56 @@ function createSVGMarkers(alpr: ALPR): string { `; } +function parseDirectionValue(value: string): number { + if (!value) return 0; + + // Check if it's a range (contains '-' but not at the start) + if (value.includes('-') && value.indexOf('-') > 0) { + const parts = value.split('-'); + if (parts.length === 2) { + const start = parseDirectionSingle(parts[0].trim()); + const end = parseDirectionSingle(parts[1].trim()); + return calculateMidpointAngle(start, end); + } + } + + // Single value + return parseDirectionSingle(value); +} + +function parseDirectionSingle(value: string): number { + // Try parsing as number first + if (/^\d+(\.\d+)?$/.test(value)) { + return parseFloat(value); + } + + // Try cardinal direction + return cardinalToDegrees(value); +} + +function calculateMidpointAngle(start: number, end: number): number { + // Normalize angles to 0-360 range + start = ((start % 360) + 360) % 360; + end = ((end % 360) + 360) % 360; + + // Calculate the difference and handle wrap-around + let diff = end - start; + if (diff < 0) { + diff += 360; + } + + // If the difference is greater than 180, go the other way around + if (diff > 180) { + diff = diff - 360; + } + + // Calculate midpoint + let midpoint = start + diff / 2; + + // Normalize result to 0-360 range + return ((midpoint % 360) + 360) % 360; +} + function cardinalToDegrees(cardinal: string): number { const cardinalMap: Record = { N: 0, @@ -160,7 +210,7 @@ function cardinalToDegrees(cardinal: string): number { ENE: 67.5, E: 90, ESE: 112.5, - SE: 135.5, + SE: 135, SSE: 157.5, S: 180, SSW: 202.5, @@ -171,7 +221,9 @@ function cardinalToDegrees(cardinal: string): number { NW: 315, NNW: 337.5 }; - return cardinalMap[cardinal] ?? cardinal; + + const upperCardinal = cardinal.toUpperCase(); + return cardinalMap[upperCardinal] ?? parseFloat(cardinal) ?? 0; } function createMarker(alpr: ALPR): Marker | CircleMarker {