direction/map/frontrunner

This commit is contained in:
2025-07-14 11:42:42 -04:00
parent 9add3cf25c
commit 2fb324c240
4 changed files with 105 additions and 11 deletions
+19 -7
View File
@@ -7,6 +7,7 @@ import (
"net/http"
"os"
"slices"
"strconv"
pb "github.com/cjdenio/uta-trax-api/proto"
"google.golang.org/protobuf/proto"
@@ -41,7 +42,7 @@ func getVehicles() ([]*pb.VehiclePosition, error) {
type TripInfo struct {
Line pb.VehicleFeed_Line
Direction int
Direction int32
}
var trips = make(map[string]*TripInfo)
@@ -61,12 +62,17 @@ func loadTrips() error {
route_id := slices.Index(header, "route_id")
trip_id := slices.Index(header, "trip_id")
// direction_id := slices.Index(header, "direction_id")
direction_id := slices.Index(header, "direction_id")
for {
if record, err := r.Read(); err == nil {
trip_info := new(TripInfo)
direction, err := strconv.ParseInt(record[direction_id], 10, 32)
if err == nil {
trip_info.Direction = int32(direction)
}
switch record[route_id] {
case "8246":
trip_info.Line = pb.VehicleFeed_RED
@@ -80,6 +86,9 @@ func loadTrips() error {
case "45389":
trip_info.Line = pb.VehicleFeed_STREETCAR
trips[record[trip_id]] = trip_info
case "41065":
trip_info.Line = pb.VehicleFeed_FRONTRUNNER
trips[record[trip_id]] = trip_info
}
} else {
break
@@ -90,7 +99,6 @@ func loadTrips() error {
}
func feedifyVehicles(vehicles []*pb.VehiclePosition) pb.VehicleFeed {
vehicle_feed := make([]*pb.VehicleFeed_Vehicle, 0, len(vehicles))
for _, vehicle := range vehicles {
@@ -100,9 +108,11 @@ func feedifyVehicles(vehicles []*pb.VehiclePosition) pb.VehicleFeed {
}
vehicle_feed = append(vehicle_feed, &pb.VehicleFeed_Vehicle{
Lat: *vehicle.Position.Latitude,
Lon: *vehicle.Position.Longitude,
Line: trip.Line,
Lat: *vehicle.Position.Latitude,
Lon: *vehicle.Position.Longitude,
Line: trip.Line,
Id: *vehicle.Vehicle.Id,
Direction: trip.Direction,
})
}
@@ -116,7 +126,9 @@ func main() {
log.Fatalln(err)
}
http.DefaultServeMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
vehicles, err := getVehicles()
if err != nil {
log.Fatalln(err)
+17 -4
View File
@@ -29,6 +29,7 @@ const (
VehicleFeed_RED VehicleFeed_Line = 2
VehicleFeed_BLUE VehicleFeed_Line = 3
VehicleFeed_STREETCAR VehicleFeed_Line = 4
VehicleFeed_FRONTRUNNER VehicleFeed_Line = 5
)
// Enum value maps for VehicleFeed_Line.
@@ -39,6 +40,7 @@ var (
2: "RED",
3: "BLUE",
4: "STREETCAR",
5: "FRONTRUNNER",
}
VehicleFeed_Line_value = map[string]int32{
"LINE_UNSPECIFIED": 0,
@@ -46,6 +48,7 @@ var (
"RED": 2,
"BLUE": 3,
"STREETCAR": 4,
"FRONTRUNNER": 5,
}
)
@@ -126,6 +129,7 @@ type VehicleFeed_Vehicle struct {
Lon float32 `protobuf:"fixed32,2,opt,name=lon,proto3" json:"lon,omitempty"`
Line VehicleFeed_Line `protobuf:"varint,3,opt,name=line,proto3,enum=VehicleFeed_Line" json:"line,omitempty"`
Direction int32 `protobuf:"varint,4,opt,name=direction,proto3" json:"direction,omitempty"`
Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -188,24 +192,33 @@ func (x *VehicleFeed_Vehicle) GetDirection() int32 {
return 0
}
func (x *VehicleFeed_Vehicle) GetId() string {
if x != nil {
return x.Id
}
return ""
}
var File_proto_schema_proto protoreflect.FileDescriptor
const file_proto_schema_proto_rawDesc = "" +
"\n" +
"\x12proto/schema.proto\"\xfe\x01\n" +
"\x12proto/schema.proto\"\xa0\x02\n" +
"\vVehicleFeed\x120\n" +
"\bvehicles\x18\x01 \x03(\v2\x14.VehicleFeed.VehicleR\bvehicles\x1ar\n" +
"\bvehicles\x18\x01 \x03(\v2\x14.VehicleFeed.VehicleR\bvehicles\x1a\x82\x01\n" +
"\aVehicle\x12\x10\n" +
"\x03lat\x18\x01 \x01(\x02R\x03lat\x12\x10\n" +
"\x03lon\x18\x02 \x01(\x02R\x03lon\x12%\n" +
"\x04line\x18\x03 \x01(\x0e2\x11.VehicleFeed.LineR\x04line\x12\x1c\n" +
"\tdirection\x18\x04 \x01(\x05R\tdirection\"I\n" +
"\tdirection\x18\x04 \x01(\x05R\tdirection\x12\x0e\n" +
"\x02id\x18\x05 \x01(\tR\x02id\"Z\n" +
"\x04Line\x12\x14\n" +
"\x10LINE_UNSPECIFIED\x10\x00\x12\t\n" +
"\x05GREEN\x10\x01\x12\a\n" +
"\x03RED\x10\x02\x12\b\n" +
"\x04BLUE\x10\x03\x12\r\n" +
"\tSTREETCAR\x10\x04B'Z%github.com/cjdenio/uta-trax-api/protob\x06proto3"
"\tSTREETCAR\x10\x04\x12\x0f\n" +
"\vFRONTRUNNER\x10\x05B'Z%github.com/cjdenio/uta-trax-api/protob\x06proto3"
var (
file_proto_schema_proto_rawDescOnce sync.Once
+2
View File
@@ -8,6 +8,7 @@ message VehicleFeed {
RED = 2;
BLUE = 3;
STREETCAR = 4;
FRONTRUNNER = 5;
}
message Vehicle {
@@ -15,6 +16,7 @@ message VehicleFeed {
float lon = 2;
Line line = 3;
int32 direction = 4;
string id = 5;
}
repeated Vehicle vehicles = 1;
+67
View File
@@ -0,0 +1,67 @@
<!DOCTYPE html>
<html>
<head>
<link
rel="stylesheet"
href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin=""
/>
<style>
html,
body {
margin: 0;
}
</style>
</head>
<body>
<div id="map" style="height: 100vh"></div>
<script src="//cdn.jsdelivr.net/npm/protobufjs@7.X.X/dist/protobuf.min.js"></script>
<script
src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
crossorigin=""
></script>
<script>
const COLORS = {
1: "#2eb566",
2: "#be2036",
3: "#004a97",
4: "#77777a",
5: "#c227b9",
};
var map = L.map("map").setView([40.656734, -111.890818], 12);
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19,
attribution:
'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
}).addTo(map);
protobuf
.load(
"https://raw.githubusercontent.com/cjdenio/uta-trax-api/refs/heads/main/proto/schema.proto"
)
.then(async (root) => {
const bin = await fetch("/api").then((r) => r.arrayBuffer());
const { vehicles } = root
.lookupType("VehicleFeed")
.decode(new Uint8Array(bin));
vehicles.forEach((vehicle) => {
L.circle([vehicle.lat, vehicle.lon], {
fillColor: COLORS[vehicle.line],
color: COLORS[vehicle.line],
fillOpacity: 0.5,
radius: 200,
}).addTo(map);
});
});
</script>
</body>
</html>