UNPKG

transitive-js

Version:

A tool for generating dynamic stylized transit maps that are easy to understand.

130 lines (111 loc) 4.26 kB
import { forEach } from 'lodash' import TurnPoint from '../point/turn' import PathSegment from './pathsegment' import NetworkPath from './path' /** * Journey */ export default class Journey { constructor(data, network) { this.network = network for (const key in data) { this[key] = data[key] } this.path = new NetworkPath(this) forEach(this.segments, (segmentInfo) => { const pathSegment = new PathSegment(segmentInfo.type, this.path) pathSegment.journeySegment = segmentInfo if (segmentInfo.type === 'TRANSIT') { if (segmentInfo.patterns) { forEach(segmentInfo.patterns, (patternInfo) => { pathSegment.addPattern( network.patterns[patternInfo.pattern_id], patternInfo.from_stop_index, patternInfo.to_stop_index ) }) } else if (segmentInfo.pattern_id) { // legacy support for single-pattern journey segments pathSegment.addPattern( network.patterns[segmentInfo.pattern_id], segmentInfo.from_stop_index, segmentInfo.to_stop_index ) } } else { // non-transit segment const streetEdges = [] // screen out degenerate transfer segments if ( segmentInfo.from.type === 'STOP' && segmentInfo.to.type === 'STOP' && segmentInfo.from.stop_id === segmentInfo.to.stop_id ) return pathSegment.points.push(getEndPoint(segmentInfo.from, network)) if (segmentInfo.streetEdges && segmentInfo.streetEdges.length > 0) { let lastTurnPoint = null for (let i = 0; i < segmentInfo.streetEdges.length; i++) { const streetEdgeId = segmentInfo.streetEdges[i] const streetEdge = network.streetEdges[streetEdgeId] streetEdge.id = streetEdgeId streetEdges.push(streetEdge) if (i >= segmentInfo.streetEdges.length - 1) continue if (lastTurnPoint) streetEdge.fromTurnPoint = lastTurnPoint const lastIndex = streetEdge.length - 1 // screen out degenerate edges if ( streetEdge.latLons[0][0] === streetEdge.latLons[lastIndex][0] && streetEdge.latLons[0][1] === streetEdge.latLons[lastIndex][1] ) { continue } // create a TurnPoint for the 'from' point of this edge const turnPoint = getTurnPoint( { lat: streetEdge.latLons[lastIndex][0], lon: streetEdge.latLons[lastIndex][1], worldX: streetEdge.worldCoords[lastIndex][0], worldY: streetEdge.worldCoords[lastIndex][1] }, network ) // compute the angle represented by this turn point /* turnPoint.turnAngle = Util.angleFromThreePoints( streetEdge.worldCoords[0][0], streetEdge.worldCoords[0][1], streetEdge.worldCoords[lastIndex][0], streetEdge.worldCoords[lastIndex][1], nextEdge.worldCoords[nextEdge.length-1][0], nextEdge.worldCoords[nextEdge.length-1][1] ); */ pathSegment.points.push(turnPoint) lastTurnPoint = streetEdge.toTurnPoint = turnPoint } pathSegment.streetEdges = streetEdges } pathSegment.points.push(getEndPoint(segmentInfo.to, network)) } this.path.addSegment(pathSegment) }) } getElementId() { return 'journey-' + this.journey_id } } function getEndPoint(pointInfo, network) { if (pointInfo.type === 'PLACE') { return network.places[pointInfo.place_id] } else if (pointInfo.type === 'STOP') { return network.stops[pointInfo.stop_id] } } /* utility function for creating non-duplicative TurnPoints */ function getTurnPoint(turnPointInfo, network) { const key = turnPointInfo.lat + '_' + turnPointInfo.lon if (key in network.turnPoints) return network.turnPoints[key] const turnPoint = new TurnPoint(turnPointInfo, key) network.turnPoints[key] = turnPoint // network.addVertexPoint(turnPoint); return turnPoint }