some custom stuff

This commit is contained in:
2025-11-15 00:23:48 +01:00
parent 4dbbd30d4d
commit c189e3f59a
19 changed files with 1116 additions and 831 deletions

View File

@@ -95,7 +95,7 @@ func ParseCalendarDates(r io.Reader, callback func(types.CalendarDate)) error {
return nil
}
func ParseFeedInfos(r io.Reader, callback func(types.FeedInfo)) error {
func ParseFeedInfos(r io.Reader, callback func(id string, data types.FeedInfo)) error {
reader := csv.NewReader(r)
if _, err := reader.Read(); err != nil {
return err
@@ -109,13 +109,13 @@ func ParseFeedInfos(r io.Reader, callback func(types.FeedInfo)) error {
return err
}
feedInfo := types.FeedInfo{
FeedID: record[0],
FeedPublisherName: record[1],
FeedPublisherURL: record[2],
FeedLang: record[3],
FeedVersion: record[4],
//FeedID: record[0],
PublisherName: record[1],
PublisherURL: record[2],
Language: record[3],
Version: record[4],
}
callback(feedInfo)
callback(record[0], feedInfo)
}
return nil
}
@@ -135,6 +135,7 @@ func ParseRoutes(r io.Reader, callback func(types.Route)) error {
}
routeType, _ := strconv.Atoi(record[4])
route := types.Route{
Trips: make([]*types.Trip, 0),
RouteID: record[0],
AgencyID: record[1],
RouteShortName: record[2],
@@ -147,7 +148,7 @@ func ParseRoutes(r io.Reader, callback func(types.Route)) error {
return nil
}
func ParseStopTimes(r io.Reader, callback func(types.StopTime)) error {
func ParseStopTimes(r io.Reader, callback func(data types.StopTime)) error {
reader := csv.NewReader(r)
if _, err := reader.Read(); err != nil {
return err
@@ -164,10 +165,10 @@ func ParseStopTimes(r io.Reader, callback func(types.StopTime)) error {
pickupType, _ := strconv.Atoi(record[5])
dropOffType, _ := strconv.Atoi(record[6])
stopTime := types.StopTime{
TripID: record[0],
ArrivalTime: record[1],
DepartureTime: record[2],
StopID: record[3],
TripId: record[0],
ArrivalTime: types.ParseTimeString(record[1]),
DepartureTime: types.ParseTimeString(record[2]),
StopId: record[3],
StopSequence: stopSequence,
PickupType: pickupType,
DropOffType: dropOffType,
@@ -194,7 +195,9 @@ func ParseStops(r io.Reader, callback func(types.Stop)) error {
stopLon, _ := strconv.ParseFloat(record[3], 64)
locationType, _ := strconv.Atoi(record[4])
stop := types.Stop{
StopID: record[0],
Trips: make(map[string]*types.Trip),
Transfers: make([]*types.Transfer, 0),
StopId: record[0],
StopName: record[1],
StopLat: stopLat,
StopLon: stopLon,
@@ -221,12 +224,12 @@ func ParseTransfers(r io.Reader, callback func(types.Transfer)) error {
transferType, _ := strconv.Atoi(record[2])
minTransferTime, _ := strconv.Atoi(record[3])
transfer := types.Transfer{
FromStopID: record[0],
ToStopID: record[1],
FromStopId: record[0],
ToStopId: record[1],
TransferType: transferType,
MinTransferTime: minTransferTime,
FromTripID: record[4],
ToTripID: record[5],
FromTripId: record[4],
ToTripId: record[5],
}
callback(transfer)
}
@@ -247,9 +250,9 @@ func ParseTrips(r io.Reader, callback func(types.Trip)) error {
return err
}
trip := types.Trip{
RouteID: record[0],
ServiceID: record[1],
TripID: record[2],
RouteId: record[0],
ServiceId: record[1],
TripId: record[2],
TripHeadsign: record[3],
TripShortName: record[4],
}

103
pkg/reader/loader.go Normal file
View File

@@ -0,0 +1,103 @@
package reader
import (
"log"
"os"
"path/filepath"
"git.tornberg.me/go-gtfs/pkg/types"
)
type TripData struct {
Stops map[string]*types.Stop
Trips map[string]*types.Trip
Routes map[string]*types.Route
Agencies map[string]*types.Agency
}
func LoadTripData(path string) (*TripData, error) {
tp := &TripData{
Stops: make(map[string]*types.Stop),
Trips: make(map[string]*types.Trip),
Routes: make(map[string]*types.Route),
Agencies: make(map[string]*types.Agency),
}
files := []string{"agency", "routes", "stops", "trips", "stop_times", "transfers"}
for _, file := range files {
f, err := os.Open(filepath.Join(path, file+".txt"))
if err != nil {
log.Fatalf("failed to open %s: %v", file, err)
}
defer f.Close()
switch file {
case "agency":
err = ParseAgencies(f, func(a types.Agency) {
tp.Agencies[a.AgencyID] = &a
})
case "routes":
err = ParseRoutes(f, func(r types.Route) {
tp.Routes[r.RouteID] = &r
if ag, ok := tp.Agencies[r.AgencyID]; ok {
r.Agency = ag
ag.AddRoute(&r)
}
})
case "stops":
err = ParseStops(f, func(s types.Stop) {
tp.Stops[s.StopId] = &s
})
case "trips":
err = ParseTrips(f, func(t types.Trip) {
trip := t
if route, ok := tp.Routes[trip.RouteId]; ok {
trip.SetRoute(route)
route.AddTrip(&trip)
} else {
log.Printf("route %s not found", trip.RouteId)
}
if agency, ok := tp.Agencies[trip.AgencyID]; ok {
trip.Agency = agency
} else {
log.Printf("agency %s not found", trip.AgencyID)
}
tp.Trips[trip.TripId] = &trip
})
case "stop_times":
err = ParseStopTimes(f, func(st types.StopTime) {
stop, ok := tp.Stops[st.StopId]
if ok {
st.SetStop(stop)
} else {
log.Printf("stop %s not found", st.StopId)
}
trp, ok := tp.Trips[st.TripId]
if !ok {
log.Printf("trip %s not found", st.TripId)
} else {
stop.AddTrip(trp)
trp.AddStopTime(&st)
}
})
case "transfers":
err = ParseTransfers(f, func(tr types.Transfer) {
//transfers = append(transfers, tr)
stop, ok := tp.Stops[tr.FromStopId]
if ok {
stop.AddTransfer(&tr)
} else {
log.Printf("stop %s not found for transfer", tr.FromStopId)
}
})
}
if err != nil {
return tp, err
}
}
return tp, nil
}