feat: display messages using marker

This commit is contained in:
dancingCycle 2022-09-19 15:06:31 +02:00
parent c4839326a6
commit 0f32a6f090
10 changed files with 1010 additions and 11 deletions

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 172.83 143.31" style="enable-background:new 0 0 172.83 143.31;" xml:space="preserve">
<style type="text/css">
.st0{fill:#4E4697;}
</style>
<path class="st0" d="M159.98,95.78c-1.95-4.54-5.55-8.69-10.82-12.47c-1.88-1.34-4.64-2.92-8.28-4.8c4.58-2.89,7.92-5.35,9.99-7.37
c3.94-3.77,6.51-7.74,7.72-11.91c1.23-4.21,1.18-8.44-0.14-12.8c-0.73-2.39-1.8-4.62-3.2-6.65l-1.6-2.07
c-1.01-1.21-2.16-2.31-3.45-3.37c-4.04-3.29-9.07-5.2-15.09-5.73c-5.9-0.51-12.07,0.17-18.51,2.07c-0.05,0-0.06,0.02-0.11,0.02
c-0.06,0.03-0.14,0.05-0.2,0.07c-3.81,1.17-7.61,2.64-11.07,4.39c-3.05,1.55-5.86,3.26-8.13,5.11l0.02,0.07h-0.02v82.31
c5.55,3.8,12.43,7.3,21.44,9.12c7.12,1.45,13.78,1.5,19.98,0.13c5.33-1.17,9.82-3.27,13.48-6.35c0.62-0.48,1.22-1.03,1.79-1.58
c3.28-3.24,5.55-6.89,6.83-10.96c0.29-0.86,0.52-1.73,0.71-2.64C162.38,105.2,161.92,100.33,159.98,95.78z M109.63,45.63
c1.82-0.9,3.78-1.7,5.75-2.42c0.04-0.02,0.08-0.04,0.12-0.04l3.6-1.2c0.07-0.03,0.13-0.05,0.19-0.05
c7.71-2.32,13.73-2.64,18.11-0.97c2.76,1.06,4.87,2.56,6.37,4.48c0.9,1.15,1.56,2.46,2,3.93c1.05,3.39,0.61,6.56-1.23,9.51
c-0.5,0.81-1.4,2.15-2.13,2.93c-1.7,2.07-5.03,4.64-8.28,6.65c-2.34,1.45-4.91,2.64-7.57,3.36c-0.01,0.01-1.41,0.34-1.41,0.34
c-2.18,0.63-8.53,0.69-15.52,0.66V45.63z M148.38,108.82c-0.55,2.75-1.87,5.12-3.93,7.13c-0.19,0.2-0.39,0.39-0.59,0.57
c-2.38,2.15-5.67,3.56-9.81,4.23c-4.15,0.66-8.75,0.48-13.78-0.55c-2.7-0.55-6.72-2.19-10.64-4.08V83.79
c3.96-0.09,7.5-0.15,10.71,0.1h0.07c0.39,0,0.77,0.01,1.16,0.04c2.67,0.17,5.38,0.86,7.98,1.89c0.01-0.01,0.02,0,0.04,0.01
c4.37,1.72,8.56,4.3,11.54,7c2.27,1.97,4.48,4.53,5.78,6.81c0.15,0.23,0.28,0.46,0.4,0.7C148.65,102.96,149.01,105.81,148.38,108.82
z"/>
<ellipse transform="matrix(0.9347 -0.3553 0.3553 0.9347 0.6343 30.8075)" class="st0" cx="84.18" cy="13.68" rx="8.33" ry="8.33"/>
<path class="st0" d="M91.15,38.16v84.61c0,5.54-3.12,10.04-6.97,10.04s-6.97-4.5-6.97-10.04V38.16c0-5.54,3.12-10.04,6.97-10.04
S91.15,32.62,91.15,38.16z"/>
<path class="st0" d="M23.43,49.65c-1.03,3.43-0.62,6.63,1.24,9.61c1.82,2.96,7.61,7.21,17.38,12.72
c9.78,5.51,16.35,9.73,19.72,12.66c4.9,4.28,8.11,8.8,9.63,13.55c1.52,4.75,1.52,9.68-0.02,14.8c-1.52,5.08-4.44,9.41-8.75,13
c-4.32,3.59-9.63,5.77-15.93,6.58c-6.3,0.81-12.93,0.14-19.88-1.98c-8.31-2.53-14.39-6.55-19.42-10.64
c-0.05-0.04-0.1-0.08-0.15-0.12c-0.25-0.2-0.5-0.4-0.74-0.6c-3.26-2.86-4.49-6.86-2.71-9.32c1.93-2.67,6.77-2.28,10.6,0.38
c0.38,0.3,1.87,1.47,2.52,1.94c3.71,2.71,8.45,5.56,12.7,6.85c4.91,1.5,9.47,2.11,13.66,1.82c4.19-0.29,7.58-1.4,10.17-3.34
c2.58-1.93,4.32-4.37,5.2-7.33c0.9-2.99,0.8-5.87-0.3-8.66c-1.1-2.77-3.46-5.54-7.07-8.3c-2.32-1.79-7.63-5.1-15.94-9.93
c-8.31-4.84-13.98-8.73-17-11.69c-3.93-3.8-6.51-7.82-7.73-12.05c-1.22-4.23-1.17-8.54,0.15-12.92c1.44-4.82,4.19-8.89,8.23-12.23
c4.05-3.34,9.07-5.27,15.08-5.8c6.01-0.54,12.4-0.16,18.84,2.19c4.28,1.56,6.41,2.42,8.33,3.25c1.12,0.48,3.12,1.27,4.82,1.98
c0.22,0.09,0.98,0.41,1.06,0.45c4.23,1.95,6.71,5.58,5.59,8.25c-1.09,2.57-5.18,3.34-9.37,1.83c-0.05-0.02-0.11-0.04-0.17-0.06
c-3.65-1.15-5.71-2.17-13.07-4.42c-7.79-2.37-13.89-2.7-18.29-0.99C27.41,42.87,24.61,45.7,23.43,49.65z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,9 +1,13 @@
import React from 'react';
import PropTypes from 'prop-types';
import {MapContainer,TileLayer} from 'react-leaflet';
/*JS module import (vs cdn or style link)*/
import 'leaflet/dist/leaflet.css'
import './map.css';
export default function Map() {
import MsgMarker from './marker-msg';
export default function Map({messages}) {
const position = [53.2206976, 7.7585528]
return (
<>
@ -14,7 +18,16 @@ export default function Map() {
attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
{
messages.map(function(value,key) {
//console.log(`key: ${key}, value: ${value}`);
return <MsgMarker key={key} index={key} location={value}/>;
})
}
</MapContainer>
</>
);
}
Map.propTypes = {
messages: PropTypes.array
};

View File

@ -0,0 +1,32 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Marker,Popup} from 'react-leaflet';
import bfly from '../../assets/Logo_SIB_electricindigo.svg';
const MarkerMsg = ({ index,location }) => {
const iconBfly = new L.Icon({
iconUrl: bfly,
iconRetinaUrl: bfly,
popupAnchor: [-0, -0],
iconSize: [32,45],
});
return(
<>
<Marker
index={index}
position={[location.lat,location.lon]}
icon={iconBfly}
>
<Popup>
Popup
</Popup>
</Marker>
</>
);
}
export default MarkerMsg;
MarkerMsg.propTypes = {
index: PropTypes.number,
location: PropTypes.object
};

View File

@ -1,9 +1,11 @@
import React, {useEffect} from 'react';
import React, {useEffect,useState} from 'react';
import axios from 'axios';
import Map from '../components/map/map';
import parseMessages from '../utils/gtfs-rt-utils';
export default function MapPage() {
/*storage*/
const [vehPos, setVehPos] = useState([]);
const getData= async ()=>{
console.log('getData() start...');
try {
@ -17,18 +19,22 @@ export default function MapPage() {
});
//TODO remove debugging
if(res.data){
console.log('getVehPos() res available');
//console.log('getVehPos() res available');
/*parse messages*/
const messages = parseMessages(res.data);
console.log('getVehPos() messages.length: '+messages.length);
/*set state*/
setVehPos(messages);
}else{
console.log('getVehPos() res NOT available');
console.error('getVehPos() res NOT available');
}
} catch (err) {
console.error('err.message: ' + err.message);
}
console.log('getData() done.');
//console.log('getData() done.');
};
useEffect(()=>{
const intervalCall=setInterval(()=>{
console.log('Map: get data');
getData();
}, 5000);
return ()=>{
@ -40,7 +46,7 @@ export default function MapPage() {
<>
{/*TODO remove debugging*/}
<h1>MapPage</h1>
<Map />
<Map messages={vehPos}/>
</>
);
}

View File

@ -0,0 +1,80 @@
import Pbf from 'pbf';
import { FeedMessage } from './gtfs-rt.js';
import charIntoString from './string';
export default function parseMessages(buffer){
console.log('parseMessages() start...');
const messages = [];
const pbf = new Pbf(buffer);
const feed = FeedMessage.read(pbf);
let gtfs_realtime_version, incrementality, timestamp = null;
if (feed.header) {
//console.log('getVehPos() header available');
gtfs_realtime_version=feed.header.gtfs_realtime_version;
incrementality=feed.header.incrementality;
timestamp=feed.header.timestamp;
if(gtfs_realtime_version && incrementality, timestamp){
//console.log(`getVehPos() gtfs_realtime_version: ${gtfs_realtime_version}, incrementaltiy: ${incrementality}, timestamp: ${timestamp} available`);
}
}else{
console.error('getVehPos() header NOT available');
}
feed.entity.forEach(entity => {
const vehiclePos = entity.vehicle;
if (vehiclePos) {
//console.log('getVehPos() vehiclePos available');
const { trip, position, vehicle } = vehiclePos;
if (trip && position && vehicle) {
const {trip_id, route_id, direction_id, start_time, start_date, schedule_relationship}=trip;
if(trip_id){
//console.log(`getVehPos() trip_id:${trip_id} available`);
}else{
console.log(`getVehPos() trip_id NOT available`);
}
if(route_id){
//console.log(`getVehPos() route_id:${route_id} available`);
}else{
console.log(`getVehPos() route_id NOT available`);
}
if(direction_id){
//console.log(`getVehPos() direction_id:${direction_id} available`);
}else{
console.log(`getVehPos() direction_id NOT available`);
}
const {latitude, longitude, bearing, odometer, speed}=position;
if(latitude){
//console.log(`getVehPos() latitude:${latitude} available`);
}
if(longitude){
//console.log(`getVehPos() longitude:${longitude} available`);
}
//remove tailing dot
//match a dot when it is followed by a whitespace or the end of the string
/*TODO Is this precaution required?*/
let latFormed = latitude.toString().replace(/\.+$/, "");
//console.log(`getVehPos() latFormed:${latFormed}`);
latFormed=charIntoString(latFormed,latFormed.length - 7,'.');
//console.log(`getVehPos() latFormed:${latFormed}`);
let lonFormed = longitude.toString().replace(/\.+$/, "");
lonFormed=charIntoString(lonFormed,lonFormed.length - 7,'.');
//console.log(`getVehPos() lonFormed:${lonFormed}`);
const message={
headerGtfsRealtimeVersion: gtfs_realtime_version === undefined ? -1 : parseInt(gtfs_realtime_version,10) || -2,
headerIncrementality: incrementality === undefined ? -1 : parseInt(incrementality,10) || -2,
headerTimestamp : timestamp === undefined ? -1 : parseInt(timestamp,10) || -2,
routeId: route_id === undefined ? -1 : parseInt(route_id,10) || -2,
lat: latFormed === undefined ? -360 : latFormed,
lon: lonFormed === undefined ? -720 : lonFormed,
};
messages.push(message);
} else {
console.error('getVehPos() trip, position & vehicle NOT unavailable ');
}
} else {
console.error('getVehPos() vehiclePos NOT available');
}
});
console.log('parseMessages() done.');
return messages;
};

688
app/utils/gtfs-rt.js Normal file
View File

@ -0,0 +1,688 @@
'use strict'; // code generated by pbf v3.2.1
// FeedMessage ========================================
var FeedMessage = exports.FeedMessage = {};
FeedMessage.read = function (pbf, end) {
return pbf.readFields(FeedMessage._readField, {header: null, entity: []}, end);
};
FeedMessage._readField = function (tag, obj, pbf) {
if (tag === 1) obj.header = FeedHeader.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 2) obj.entity.push(FeedEntity.read(pbf, pbf.readVarint() + pbf.pos));
};
FeedMessage.write = function (obj, pbf) {
if (obj.header) pbf.writeMessage(1, FeedHeader.write, obj.header);
if (obj.entity) for (var i = 0; i < obj.entity.length; i++) pbf.writeMessage(2, FeedEntity.write, obj.entity[i]);
};
// FeedHeader ========================================
var FeedHeader = exports.FeedHeader = {};
FeedHeader.read = function (pbf, end) {
return pbf.readFields(FeedHeader._readField, {gtfs_realtime_version: "", incrementality: {"value":0,"options":{}}, timestamp: 0}, end);
};
FeedHeader._readField = function (tag, obj, pbf) {
if (tag === 1) obj.gtfs_realtime_version = pbf.readString();
else if (tag === 2) obj.incrementality = pbf.readVarint();
else if (tag === 3) obj.timestamp = pbf.readVarint();
};
FeedHeader.write = function (obj, pbf) {
if (obj.gtfs_realtime_version) pbf.writeStringField(1, obj.gtfs_realtime_version);
if (obj.incrementality != undefined && obj.incrementality !== {"value":0,"options":{}}) pbf.writeVarintField(2, obj.incrementality);
if (obj.timestamp) pbf.writeVarintField(3, obj.timestamp);
};
FeedHeader.Incrementality = {
"FULL_DATASET": {
"value": 0,
"options": {}
},
"DIFFERENTIAL": {
"value": 1,
"options": {}
}
};
// FeedEntity ========================================
var FeedEntity = exports.FeedEntity = {};
FeedEntity.read = function (pbf, end) {
return pbf.readFields(FeedEntity._readField, {id: "", is_deleted: false, trip_update: null, vehicle: null, alert: null, shape: null}, end);
};
FeedEntity._readField = function (tag, obj, pbf) {
if (tag === 1) obj.id = pbf.readString();
else if (tag === 2) obj.is_deleted = pbf.readBoolean();
else if (tag === 3) obj.trip_update = TripUpdate.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 4) obj.vehicle = VehiclePosition.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 5) obj.alert = Alert.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 6) obj.shape = Shape.read(pbf, pbf.readVarint() + pbf.pos);
};
FeedEntity.write = function (obj, pbf) {
if (obj.id) pbf.writeStringField(1, obj.id);
if (obj.is_deleted) pbf.writeBooleanField(2, obj.is_deleted);
if (obj.trip_update) pbf.writeMessage(3, TripUpdate.write, obj.trip_update);
if (obj.vehicle) pbf.writeMessage(4, VehiclePosition.write, obj.vehicle);
if (obj.alert) pbf.writeMessage(5, Alert.write, obj.alert);
if (obj.shape) pbf.writeMessage(6, Shape.write, obj.shape);
};
// TripUpdate ========================================
var TripUpdate = exports.TripUpdate = {};
TripUpdate.read = function (pbf, end) {
return pbf.readFields(TripUpdate._readField, {trip: null, vehicle: null, stop_time_update: [], timestamp: 0, delay: 0, trip_properties: null}, end);
};
TripUpdate._readField = function (tag, obj, pbf) {
if (tag === 1) obj.trip = TripDescriptor.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 3) obj.vehicle = VehicleDescriptor.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 2) obj.stop_time_update.push(TripUpdate.StopTimeUpdate.read(pbf, pbf.readVarint() + pbf.pos));
else if (tag === 4) obj.timestamp = pbf.readVarint();
else if (tag === 5) obj.delay = pbf.readVarint(true);
else if (tag === 6) obj.trip_properties = TripUpdate.TripProperties.read(pbf, pbf.readVarint() + pbf.pos);
};
TripUpdate.write = function (obj, pbf) {
if (obj.trip) pbf.writeMessage(1, TripDescriptor.write, obj.trip);
if (obj.vehicle) pbf.writeMessage(3, VehicleDescriptor.write, obj.vehicle);
if (obj.stop_time_update) for (var i = 0; i < obj.stop_time_update.length; i++) pbf.writeMessage(2, TripUpdate.StopTimeUpdate.write, obj.stop_time_update[i]);
if (obj.timestamp) pbf.writeVarintField(4, obj.timestamp);
if (obj.delay) pbf.writeVarintField(5, obj.delay);
if (obj.trip_properties) pbf.writeMessage(6, TripUpdate.TripProperties.write, obj.trip_properties);
};
// TripUpdate.StopTimeEvent ========================================
TripUpdate.StopTimeEvent = {};
TripUpdate.StopTimeEvent.read = function (pbf, end) {
return pbf.readFields(TripUpdate.StopTimeEvent._readField, {delay: 0, time: 0, uncertainty: 0}, end);
};
TripUpdate.StopTimeEvent._readField = function (tag, obj, pbf) {
if (tag === 1) obj.delay = pbf.readVarint(true);
else if (tag === 2) obj.time = pbf.readVarint(true);
else if (tag === 3) obj.uncertainty = pbf.readVarint(true);
};
TripUpdate.StopTimeEvent.write = function (obj, pbf) {
if (obj.delay) pbf.writeVarintField(1, obj.delay);
if (obj.time) pbf.writeVarintField(2, obj.time);
if (obj.uncertainty) pbf.writeVarintField(3, obj.uncertainty);
};
// TripUpdate.StopTimeUpdate ========================================
TripUpdate.StopTimeUpdate = {};
TripUpdate.StopTimeUpdate.read = function (pbf, end) {
return pbf.readFields(TripUpdate.StopTimeUpdate._readField, {stop_sequence: 0, stop_id: "", arrival: null, departure: null, departure_occupancy_status: 0, schedule_relationship: {"value":0,"options":{}}, stop_time_properties: null}, end);
};
TripUpdate.StopTimeUpdate._readField = function (tag, obj, pbf) {
if (tag === 1) obj.stop_sequence = pbf.readVarint();
else if (tag === 4) obj.stop_id = pbf.readString();
else if (tag === 2) obj.arrival = TripUpdate.StopTimeEvent.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 3) obj.departure = TripUpdate.StopTimeEvent.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 7) obj.departure_occupancy_status = pbf.readVarint();
else if (tag === 5) obj.schedule_relationship = pbf.readVarint();
else if (tag === 6) obj.stop_time_properties = TripUpdate.StopTimeUpdate.StopTimeProperties.read(pbf, pbf.readVarint() + pbf.pos);
};
TripUpdate.StopTimeUpdate.write = function (obj, pbf) {
if (obj.stop_sequence) pbf.writeVarintField(1, obj.stop_sequence);
if (obj.stop_id) pbf.writeStringField(4, obj.stop_id);
if (obj.arrival) pbf.writeMessage(2, TripUpdate.StopTimeEvent.write, obj.arrival);
if (obj.departure) pbf.writeMessage(3, TripUpdate.StopTimeEvent.write, obj.departure);
if (obj.departure_occupancy_status) pbf.writeVarintField(7, obj.departure_occupancy_status);
if (obj.schedule_relationship != undefined && obj.schedule_relationship !== {"value":0,"options":{}}) pbf.writeVarintField(5, obj.schedule_relationship);
if (obj.stop_time_properties) pbf.writeMessage(6, TripUpdate.StopTimeUpdate.StopTimeProperties.write, obj.stop_time_properties);
};
TripUpdate.StopTimeUpdate.ScheduleRelationship = {
"SCHEDULED": {
"value": 0,
"options": {}
},
"SKIPPED": {
"value": 1,
"options": {}
},
"NO_DATA": {
"value": 2,
"options": {}
},
"UNSCHEDULED": {
"value": 3,
"options": {}
}
};
// TripUpdate.StopTimeUpdate.StopTimeProperties ========================================
TripUpdate.StopTimeUpdate.StopTimeProperties = {};
TripUpdate.StopTimeUpdate.StopTimeProperties.read = function (pbf, end) {
return pbf.readFields(TripUpdate.StopTimeUpdate.StopTimeProperties._readField, {assigned_stop_id: ""}, end);
};
TripUpdate.StopTimeUpdate.StopTimeProperties._readField = function (tag, obj, pbf) {
if (tag === 1) obj.assigned_stop_id = pbf.readString();
};
TripUpdate.StopTimeUpdate.StopTimeProperties.write = function (obj, pbf) {
if (obj.assigned_stop_id) pbf.writeStringField(1, obj.assigned_stop_id);
};
// TripUpdate.TripProperties ========================================
TripUpdate.TripProperties = {};
TripUpdate.TripProperties.read = function (pbf, end) {
return pbf.readFields(TripUpdate.TripProperties._readField, {trip_id: "", start_date: "", start_time: "", shape_id: ""}, end);
};
TripUpdate.TripProperties._readField = function (tag, obj, pbf) {
if (tag === 1) obj.trip_id = pbf.readString();
else if (tag === 2) obj.start_date = pbf.readString();
else if (tag === 3) obj.start_time = pbf.readString();
else if (tag === 4) obj.shape_id = pbf.readString();
};
TripUpdate.TripProperties.write = function (obj, pbf) {
if (obj.trip_id) pbf.writeStringField(1, obj.trip_id);
if (obj.start_date) pbf.writeStringField(2, obj.start_date);
if (obj.start_time) pbf.writeStringField(3, obj.start_time);
if (obj.shape_id) pbf.writeStringField(4, obj.shape_id);
};
// VehiclePosition ========================================
var VehiclePosition = exports.VehiclePosition = {};
VehiclePosition.read = function (pbf, end) {
return pbf.readFields(VehiclePosition._readField, {trip: null, vehicle: null, position: null, current_stop_sequence: 0, stop_id: "", current_status: {"value":2,"options":{}}, timestamp: 0, congestion_level: 0, occupancy_status: 0, occupancy_percentage: 0, multi_carriage_details: []}, end);
};
VehiclePosition._readField = function (tag, obj, pbf) {
if (tag === 1) obj.trip = TripDescriptor.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 8) obj.vehicle = VehicleDescriptor.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 2) obj.position = Position.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 3) obj.current_stop_sequence = pbf.readVarint();
else if (tag === 7) obj.stop_id = pbf.readString();
else if (tag === 4) obj.current_status = pbf.readVarint();
else if (tag === 5) obj.timestamp = pbf.readVarint();
else if (tag === 6) obj.congestion_level = pbf.readVarint();
else if (tag === 9) obj.occupancy_status = pbf.readVarint();
else if (tag === 10) obj.occupancy_percentage = pbf.readVarint();
else if (tag === 11) obj.multi_carriage_details.push(VehiclePosition.CarriageDetails.read(pbf, pbf.readVarint() + pbf.pos));
};
VehiclePosition.write = function (obj, pbf) {
if (obj.trip) pbf.writeMessage(1, TripDescriptor.write, obj.trip);
if (obj.vehicle) pbf.writeMessage(8, VehicleDescriptor.write, obj.vehicle);
if (obj.position) pbf.writeMessage(2, Position.write, obj.position);
if (obj.current_stop_sequence) pbf.writeVarintField(3, obj.current_stop_sequence);
if (obj.stop_id) pbf.writeStringField(7, obj.stop_id);
if (obj.current_status != undefined && obj.current_status !== {"value":2,"options":{}}) pbf.writeVarintField(4, obj.current_status);
if (obj.timestamp) pbf.writeVarintField(5, obj.timestamp);
if (obj.congestion_level) pbf.writeVarintField(6, obj.congestion_level);
if (obj.occupancy_status) pbf.writeVarintField(9, obj.occupancy_status);
if (obj.occupancy_percentage) pbf.writeVarintField(10, obj.occupancy_percentage);
if (obj.multi_carriage_details) for (var i = 0; i < obj.multi_carriage_details.length; i++) pbf.writeMessage(11, VehiclePosition.CarriageDetails.write, obj.multi_carriage_details[i]);
};
VehiclePosition.VehicleStopStatus = {
"INCOMING_AT": {
"value": 0,
"options": {}
},
"STOPPED_AT": {
"value": 1,
"options": {}
},
"IN_TRANSIT_TO": {
"value": 2,
"options": {}
}
};
VehiclePosition.CongestionLevel = {
"UNKNOWN_CONGESTION_LEVEL": {
"value": 0,
"options": {}
},
"RUNNING_SMOOTHLY": {
"value": 1,
"options": {}
},
"STOP_AND_GO": {
"value": 2,
"options": {}
},
"CONGESTION": {
"value": 3,
"options": {}
},
"SEVERE_CONGESTION": {
"value": 4,
"options": {}
}
};
VehiclePosition.OccupancyStatus = {
"EMPTY": {
"value": 0,
"options": {}
},
"MANY_SEATS_AVAILABLE": {
"value": 1,
"options": {}
},
"FEW_SEATS_AVAILABLE": {
"value": 2,
"options": {}
},
"STANDING_ROOM_ONLY": {
"value": 3,
"options": {}
},
"CRUSHED_STANDING_ROOM_ONLY": {
"value": 4,
"options": {}
},
"FULL": {
"value": 5,
"options": {}
},
"NOT_ACCEPTING_PASSENGERS": {
"value": 6,
"options": {}
},
"NO_DATA_AVAILABLE": {
"value": 7,
"options": {}
},
"NOT_BOARDABLE": {
"value": 8,
"options": {}
}
};
// VehiclePosition.CarriageDetails ========================================
VehiclePosition.CarriageDetails = {};
VehiclePosition.CarriageDetails.read = function (pbf, end) {
return pbf.readFields(VehiclePosition.CarriageDetails._readField, {id: "", label: "", occupancy_status: {"value":7,"options":{}}, occupancy_percentage: -1, carriage_sequence: 0}, end);
};
VehiclePosition.CarriageDetails._readField = function (tag, obj, pbf) {
if (tag === 1) obj.id = pbf.readString();
else if (tag === 2) obj.label = pbf.readString();
else if (tag === 3) obj.occupancy_status = pbf.readVarint();
else if (tag === 4) obj.occupancy_percentage = pbf.readVarint(true);
else if (tag === 5) obj.carriage_sequence = pbf.readVarint();
};
VehiclePosition.CarriageDetails.write = function (obj, pbf) {
if (obj.id) pbf.writeStringField(1, obj.id);
if (obj.label) pbf.writeStringField(2, obj.label);
if (obj.occupancy_status != undefined && obj.occupancy_status !== {"value":7,"options":{}}) pbf.writeVarintField(3, obj.occupancy_status);
if (obj.occupancy_percentage != undefined && obj.occupancy_percentage !== -1) pbf.writeVarintField(4, obj.occupancy_percentage);
if (obj.carriage_sequence) pbf.writeVarintField(5, obj.carriage_sequence);
};
// Alert ========================================
var Alert = exports.Alert = {};
Alert.read = function (pbf, end) {
return pbf.readFields(Alert._readField, {active_period: [], informed_entity: [], cause: {"value":1,"options":{}}, effect: {"value":8,"options":{}}, url: null, header_text: null, description_text: null, tts_header_text: null, tts_description_text: null, severity_level: {"value":1,"options":{}}, image: null, image_alternative_text: null}, end);
};
Alert._readField = function (tag, obj, pbf) {
if (tag === 1) obj.active_period.push(TimeRange.read(pbf, pbf.readVarint() + pbf.pos));
else if (tag === 5) obj.informed_entity.push(EntitySelector.read(pbf, pbf.readVarint() + pbf.pos));
else if (tag === 6) obj.cause = pbf.readVarint();
else if (tag === 7) obj.effect = pbf.readVarint();
else if (tag === 8) obj.url = TranslatedString.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 10) obj.header_text = TranslatedString.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 11) obj.description_text = TranslatedString.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 12) obj.tts_header_text = TranslatedString.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 13) obj.tts_description_text = TranslatedString.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 14) obj.severity_level = pbf.readVarint();
else if (tag === 15) obj.image = TranslatedImage.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 16) obj.image_alternative_text = TranslatedString.read(pbf, pbf.readVarint() + pbf.pos);
};
Alert.write = function (obj, pbf) {
if (obj.active_period) for (var i = 0; i < obj.active_period.length; i++) pbf.writeMessage(1, TimeRange.write, obj.active_period[i]);
if (obj.informed_entity) for (i = 0; i < obj.informed_entity.length; i++) pbf.writeMessage(5, EntitySelector.write, obj.informed_entity[i]);
if (obj.cause != undefined && obj.cause !== {"value":1,"options":{}}) pbf.writeVarintField(6, obj.cause);
if (obj.effect != undefined && obj.effect !== {"value":8,"options":{}}) pbf.writeVarintField(7, obj.effect);
if (obj.url) pbf.writeMessage(8, TranslatedString.write, obj.url);
if (obj.header_text) pbf.writeMessage(10, TranslatedString.write, obj.header_text);
if (obj.description_text) pbf.writeMessage(11, TranslatedString.write, obj.description_text);
if (obj.tts_header_text) pbf.writeMessage(12, TranslatedString.write, obj.tts_header_text);
if (obj.tts_description_text) pbf.writeMessage(13, TranslatedString.write, obj.tts_description_text);
if (obj.severity_level != undefined && obj.severity_level !== {"value":1,"options":{}}) pbf.writeVarintField(14, obj.severity_level);
if (obj.image) pbf.writeMessage(15, TranslatedImage.write, obj.image);
if (obj.image_alternative_text) pbf.writeMessage(16, TranslatedString.write, obj.image_alternative_text);
};
Alert.Cause = {
"UNKNOWN_CAUSE": {
"value": 1,
"options": {}
},
"OTHER_CAUSE": {
"value": 2,
"options": {}
},
"TECHNICAL_PROBLEM": {
"value": 3,
"options": {}
},
"STRIKE": {
"value": 4,
"options": {}
},
"DEMONSTRATION": {
"value": 5,
"options": {}
},
"ACCIDENT": {
"value": 6,
"options": {}
},
"HOLIDAY": {
"value": 7,
"options": {}
},
"WEATHER": {
"value": 8,
"options": {}
},
"MAINTENANCE": {
"value": 9,
"options": {}
},
"CONSTRUCTION": {
"value": 10,
"options": {}
},
"POLICE_ACTIVITY": {
"value": 11,
"options": {}
},
"MEDICAL_EMERGENCY": {
"value": 12,
"options": {}
}
};
Alert.Effect = {
"NO_SERVICE": {
"value": 1,
"options": {}
},
"REDUCED_SERVICE": {
"value": 2,
"options": {}
},
"SIGNIFICANT_DELAYS": {
"value": 3,
"options": {}
},
"DETOUR": {
"value": 4,
"options": {}
},
"ADDITIONAL_SERVICE": {
"value": 5,
"options": {}
},
"MODIFIED_SERVICE": {
"value": 6,
"options": {}
},
"OTHER_EFFECT": {
"value": 7,
"options": {}
},
"UNKNOWN_EFFECT": {
"value": 8,
"options": {}
},
"STOP_MOVED": {
"value": 9,
"options": {}
},
"NO_EFFECT": {
"value": 10,
"options": {}
},
"ACCESSIBILITY_ISSUE": {
"value": 11,
"options": {}
}
};
Alert.SeverityLevel = {
"UNKNOWN_SEVERITY": {
"value": 1,
"options": {}
},
"INFO": {
"value": 2,
"options": {}
},
"WARNING": {
"value": 3,
"options": {}
},
"SEVERE": {
"value": 4,
"options": {}
}
};
// TimeRange ========================================
var TimeRange = exports.TimeRange = {};
TimeRange.read = function (pbf, end) {
return pbf.readFields(TimeRange._readField, {start: 0, end: 0}, end);
};
TimeRange._readField = function (tag, obj, pbf) {
if (tag === 1) obj.start = pbf.readVarint();
else if (tag === 2) obj.end = pbf.readVarint();
};
TimeRange.write = function (obj, pbf) {
if (obj.start) pbf.writeVarintField(1, obj.start);
if (obj.end) pbf.writeVarintField(2, obj.end);
};
// Position ========================================
var Position = exports.Position = {};
Position.read = function (pbf, end) {
return pbf.readFields(Position._readField, {latitude: 0, longitude: 0, bearing: 0, odometer: 0, speed: 0}, end);
};
Position._readField = function (tag, obj, pbf) {
if (tag === 1) obj.latitude = pbf.readFloat();
else if (tag === 2) obj.longitude = pbf.readFloat();
else if (tag === 3) obj.bearing = pbf.readFloat();
else if (tag === 4) obj.odometer = pbf.readDouble();
else if (tag === 5) obj.speed = pbf.readFloat();
};
Position.write = function (obj, pbf) {
if (obj.latitude) pbf.writeFloatField(1, obj.latitude);
if (obj.longitude) pbf.writeFloatField(2, obj.longitude);
if (obj.bearing) pbf.writeFloatField(3, obj.bearing);
if (obj.odometer) pbf.writeDoubleField(4, obj.odometer);
if (obj.speed) pbf.writeFloatField(5, obj.speed);
};
// TripDescriptor ========================================
var TripDescriptor = exports.TripDescriptor = {};
TripDescriptor.read = function (pbf, end) {
return pbf.readFields(TripDescriptor._readField, {trip_id: "", route_id: "", direction_id: 0, start_time: "", start_date: "", schedule_relationship: 0}, end);
};
TripDescriptor._readField = function (tag, obj, pbf) {
if (tag === 1) obj.trip_id = pbf.readString();
else if (tag === 5) obj.route_id = pbf.readString();
else if (tag === 6) obj.direction_id = pbf.readVarint();
else if (tag === 2) obj.start_time = pbf.readString();
else if (tag === 3) obj.start_date = pbf.readString();
else if (tag === 4) obj.schedule_relationship = pbf.readVarint();
};
TripDescriptor.write = function (obj, pbf) {
if (obj.trip_id) pbf.writeStringField(1, obj.trip_id);
if (obj.route_id) pbf.writeStringField(5, obj.route_id);
if (obj.direction_id) pbf.writeVarintField(6, obj.direction_id);
if (obj.start_time) pbf.writeStringField(2, obj.start_time);
if (obj.start_date) pbf.writeStringField(3, obj.start_date);
if (obj.schedule_relationship) pbf.writeVarintField(4, obj.schedule_relationship);
};
TripDescriptor.ScheduleRelationship = {
"SCHEDULED": {
"value": 0,
"options": {}
},
"ADDED": {
"value": 1,
"options": {}
},
"UNSCHEDULED": {
"value": 2,
"options": {}
},
"CANCELED": {
"value": 3,
"options": {}
},
"REPLACEMENT": {
"value": 5,
"options": {
"deprecated": "true"
}
},
"DUPLICATED": {
"value": 6,
"options": {}
}
};
// VehicleDescriptor ========================================
var VehicleDescriptor = exports.VehicleDescriptor = {};
VehicleDescriptor.read = function (pbf, end) {
return pbf.readFields(VehicleDescriptor._readField, {id: "", label: "", license_plate: ""}, end);
};
VehicleDescriptor._readField = function (tag, obj, pbf) {
if (tag === 1) obj.id = pbf.readString();
else if (tag === 2) obj.label = pbf.readString();
else if (tag === 3) obj.license_plate = pbf.readString();
};
VehicleDescriptor.write = function (obj, pbf) {
if (obj.id) pbf.writeStringField(1, obj.id);
if (obj.label) pbf.writeStringField(2, obj.label);
if (obj.license_plate) pbf.writeStringField(3, obj.license_plate);
};
// EntitySelector ========================================
var EntitySelector = exports.EntitySelector = {};
EntitySelector.read = function (pbf, end) {
return pbf.readFields(EntitySelector._readField, {agency_id: "", route_id: "", route_type: 0, trip: null, stop_id: "", direction_id: 0}, end);
};
EntitySelector._readField = function (tag, obj, pbf) {
if (tag === 1) obj.agency_id = pbf.readString();
else if (tag === 2) obj.route_id = pbf.readString();
else if (tag === 3) obj.route_type = pbf.readVarint(true);
else if (tag === 4) obj.trip = TripDescriptor.read(pbf, pbf.readVarint() + pbf.pos);
else if (tag === 5) obj.stop_id = pbf.readString();
else if (tag === 6) obj.direction_id = pbf.readVarint();
};
EntitySelector.write = function (obj, pbf) {
if (obj.agency_id) pbf.writeStringField(1, obj.agency_id);
if (obj.route_id) pbf.writeStringField(2, obj.route_id);
if (obj.route_type) pbf.writeVarintField(3, obj.route_type);
if (obj.trip) pbf.writeMessage(4, TripDescriptor.write, obj.trip);
if (obj.stop_id) pbf.writeStringField(5, obj.stop_id);
if (obj.direction_id) pbf.writeVarintField(6, obj.direction_id);
};
// TranslatedString ========================================
var TranslatedString = exports.TranslatedString = {};
TranslatedString.read = function (pbf, end) {
return pbf.readFields(TranslatedString._readField, {translation: []}, end);
};
TranslatedString._readField = function (tag, obj, pbf) {
if (tag === 1) obj.translation.push(TranslatedString.Translation.read(pbf, pbf.readVarint() + pbf.pos));
};
TranslatedString.write = function (obj, pbf) {
if (obj.translation) for (var i = 0; i < obj.translation.length; i++) pbf.writeMessage(1, TranslatedString.Translation.write, obj.translation[i]);
};
// TranslatedString.Translation ========================================
TranslatedString.Translation = {};
TranslatedString.Translation.read = function (pbf, end) {
return pbf.readFields(TranslatedString.Translation._readField, {text: "", language: ""}, end);
};
TranslatedString.Translation._readField = function (tag, obj, pbf) {
if (tag === 1) obj.text = pbf.readString();
else if (tag === 2) obj.language = pbf.readString();
};
TranslatedString.Translation.write = function (obj, pbf) {
if (obj.text) pbf.writeStringField(1, obj.text);
if (obj.language) pbf.writeStringField(2, obj.language);
};
// TranslatedImage ========================================
var TranslatedImage = exports.TranslatedImage = {};
TranslatedImage.read = function (pbf, end) {
return pbf.readFields(TranslatedImage._readField, {localized_image: []}, end);
};
TranslatedImage._readField = function (tag, obj, pbf) {
if (tag === 1) obj.localized_image.push(TranslatedImage.LocalizedImage.read(pbf, pbf.readVarint() + pbf.pos));
};
TranslatedImage.write = function (obj, pbf) {
if (obj.localized_image) for (var i = 0; i < obj.localized_image.length; i++) pbf.writeMessage(1, TranslatedImage.LocalizedImage.write, obj.localized_image[i]);
};
// TranslatedImage.LocalizedImage ========================================
TranslatedImage.LocalizedImage = {};
TranslatedImage.LocalizedImage.read = function (pbf, end) {
return pbf.readFields(TranslatedImage.LocalizedImage._readField, {url: "", media_type: "", language: ""}, end);
};
TranslatedImage.LocalizedImage._readField = function (tag, obj, pbf) {
if (tag === 1) obj.url = pbf.readString();
else if (tag === 2) obj.media_type = pbf.readString();
else if (tag === 3) obj.language = pbf.readString();
};
TranslatedImage.LocalizedImage.write = function (obj, pbf) {
if (obj.url) pbf.writeStringField(1, obj.url);
if (obj.media_type) pbf.writeStringField(2, obj.media_type);
if (obj.language) pbf.writeStringField(3, obj.language);
};
// Shape ========================================
var Shape = exports.Shape = {};
Shape.read = function (pbf, end) {
return pbf.readFields(Shape._readField, {shape_id: "", encoded_polyline: ""}, end);
};
Shape._readField = function (tag, obj, pbf) {
if (tag === 1) obj.shape_id = pbf.readString();
else if (tag === 2) obj.encoded_polyline = pbf.readString();
};
Shape.write = function (obj, pbf) {
if (obj.shape_id) pbf.writeStringField(1, obj.shape_id);
if (obj.encoded_polyline) pbf.writeStringField(2, obj.encoded_polyline);
};

4
app/utils/string.js Normal file
View File

@ -0,0 +1,4 @@
/*TODO add description*/
export default function insertCharIntoString(str,indexPos,char){
return str.substring(0, indexPos) + char + str.substring(indexPos);
};

View File

@ -26,6 +26,18 @@ module.exports = {
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
{
//test all *.svg using svg-loader
test: /\.svg$/,
use: [
{
loader: 'svg-url-loader',
options: {
limit: 10000,
},
},
],
},
]
},
resolve: {

133
package-lock.json generated
View File

@ -9,13 +9,14 @@
"version": "0.1.0",
"license": "GPL-3.0-or-later",
"dependencies": {
"axios": "^0.27.2",
"axios": "0.27.2",
"bootstrap": "5.2.1",
"leaflet": "^1.8.0",
"leaflet": "1.8.0",
"pbf": "^3.2.1",
"react": "18.2.0",
"react-bootstrap": "2.5.0",
"react-dom": "18.2.0",
"react-leaflet": "^4.0.2",
"react-leaflet": "4.0.2",
"react-router-bootstrap": "0.26.2"
},
"devDependencies": {
@ -26,6 +27,7 @@
"css-loader": "6.7.1",
"html-webpack-plugin": "5.5.0",
"style-loader": "3.3.1",
"svg-url-loader": "^8.0.0",
"webpack": "5.74.0",
"webpack-cli": "4.10.0",
"webpack-dev-server": "4.11.0",
@ -3627,6 +3629,26 @@
"node": ">=0.8.0"
}
},
"node_modules/file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
"integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
"dev": true,
"dependencies": {
"loader-utils": "^2.0.0",
"schema-utils": "^3.0.0"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.0.0 || ^5.0.0"
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@ -4136,6 +4158,25 @@
"postcss": "^8.1.0"
}
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/import-local": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
@ -4944,6 +4985,18 @@
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"dev": true
},
"node_modules/pbf": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
"integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
"dependencies": {
"ieee754": "^1.1.12",
"resolve-protobuf-schema": "^2.1.0"
},
"bin": {
"pbf": "bin/pbf"
}
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@ -5114,6 +5167,11 @@
"react": ">=0.14.0"
}
},
"node_modules/protocol-buffers-schema": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
"integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
},
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@ -5524,6 +5582,14 @@
"node": ">=8"
}
},
"node_modules/resolve-protobuf-schema": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
"dependencies": {
"protocol-buffers-schema": "^3.3.1"
}
},
"node_modules/retry": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
@ -6000,6 +6066,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/svg-url-loader": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-8.0.0.tgz",
"integrity": "sha512-5doSXvl18hY1fGsRLdhWAU5jgzgxJ06/gc/26cpuDnN0xOz1HmmfhkpL29SSrdIvhtxQ1UwGzmk7wTT/l48mKw==",
"dev": true,
"dependencies": {
"file-loader": "~6.2.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
"webpack": "^5.0.0"
}
},
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@ -9372,6 +9453,16 @@
"websocket-driver": ">=0.5.1"
}
},
"file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
"integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
"dev": true,
"requires": {
"loader-utils": "^2.0.0",
"schema-utils": "^3.0.0"
}
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@ -9744,6 +9835,11 @@
"dev": true,
"requires": {}
},
"ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"import-local": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
@ -10339,6 +10435,15 @@
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"dev": true
},
"pbf": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
"integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
"requires": {
"ieee754": "^1.1.12",
"resolve-protobuf-schema": "^2.1.0"
}
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@ -10458,6 +10563,11 @@
"warning": "^4.0.0"
}
},
"protocol-buffers-schema": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
"integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
},
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@ -10769,6 +10879,14 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
"resolve-protobuf-schema": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
"requires": {
"protocol-buffers-schema": "^3.3.1"
}
},
"retry": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
@ -11132,6 +11250,15 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"svg-url-loader": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-8.0.0.tgz",
"integrity": "sha512-5doSXvl18hY1fGsRLdhWAU5jgzgxJ06/gc/26cpuDnN0xOz1HmmfhkpL29SSrdIvhtxQ1UwGzmk7wTT/l48mKw==",
"dev": true,
"requires": {
"file-loader": "~6.2.0"
}
},
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",

View File

@ -32,6 +32,7 @@
"css-loader": "6.7.1",
"html-webpack-plugin": "5.5.0",
"style-loader": "3.3.1",
"svg-url-loader": "8.0.0",
"webpack": "5.74.0",
"webpack-cli": "4.10.0",
"webpack-dev-server": "4.11.0",
@ -41,6 +42,7 @@
"axios": "0.27.2",
"bootstrap": "5.2.1",
"leaflet": "1.8.0",
"pbf": "^3.2.1",
"react": "18.2.0",
"react-bootstrap": "2.5.0",
"react-dom": "18.2.0",