diff --git a/application/src/ext-test/java/org/opentripplanner/ext/flex/trip/ScheduledDeviatedTripIntegrationTest.java b/application/src/ext-test/java/org/opentripplanner/ext/flex/trip/ScheduledDeviatedTripIntegrationTest.java index de8a19b646c..2a6b6783fee 100644 --- a/application/src/ext-test/java/org/opentripplanner/ext/flex/trip/ScheduledDeviatedTripIntegrationTest.java +++ b/application/src/ext-test/java/org/opentripplanner/ext/flex/trip/ScheduledDeviatedTripIntegrationTest.java @@ -125,7 +125,7 @@ void flexTripInTransitMode() { EncodedPolyline legGeometry = EncodedPolyline.of(leg.legGeometry()); assertThatPolylinesAreEqual( legGeometry.points(), - "kfsmEjojcOa@eBRKfBfHR|ALjBBhVArMG|OCrEGx@OhAKj@a@tAe@hA]l@MPgAnAgw@nr@cDxCm@t@c@t@c@x@_@~@]pAyAdIoAhG}@lE{AzHWhAtt@t~Aj@tAb@~AXdBHn@FlBC`CKnA_@nC{CjOa@dCOlAEz@E|BRtUCbCQ~CWjD??????qBvXBl@kBvWOzAc@dDOx@sHv]aIG?q@@c@ZaB\\mA" + "kfsmEjojcOa@eBRKfBfHR|ALjBBhVArMG|OCrEGx@OhAKj@a@tAe@hA]l@MPgAnAgw@nr@cDxCm@t@c@t@c@x@_@~@]pAyAdIoAhG}@lE{AzHWhAtt@t~Aj@tAb@~AXdBHn@FlBC`CKnA_@nC{CjOa@dCOlAEz@E|BRtUCbCQ~CWjD??qBvXBl@kBvWOzAc@dDOx@sHv]aIG?q@@c@ZaB\\mA" ); } diff --git a/application/src/ext/java/org/opentripplanner/ext/transferanalyzer/annotations/TransferCouldNotBeRouted.java b/application/src/ext/java/org/opentripplanner/ext/transferanalyzer/annotations/TransferCouldNotBeRouted.java index 454ed9edff2..3bd79384925 100644 --- a/application/src/ext/java/org/opentripplanner/ext/transferanalyzer/annotations/TransferCouldNotBeRouted.java +++ b/application/src/ext/java/org/opentripplanner/ext/transferanalyzer/annotations/TransferCouldNotBeRouted.java @@ -1,6 +1,5 @@ package org.opentripplanner.ext.transferanalyzer.annotations; -import java.util.List; import org.locationtech.jts.geom.Geometry; import org.opentripplanner.graph_builder.issue.api.DataImportIssue; import org.opentripplanner.street.geometry.GeometryUtils; @@ -63,11 +62,6 @@ public int getPriority() { @Override public Geometry getGeometry() { - return GeometryUtils.makeLineString( - List.of( - origin.getCoordinate().asJtsCoordinate(), - destination.getCoordinate().asJtsCoordinate() - ) - ); + return GeometryUtils.makeLineString(origin.getCoordinate(), destination.getCoordinate()); } } diff --git a/application/src/main/java/org/opentripplanner/model/plan/leg/LegConstructionSupport.java b/application/src/main/java/org/opentripplanner/model/plan/leg/LegConstructionSupport.java index 65acd86c99b..097526eefca 100644 --- a/application/src/main/java/org/opentripplanner/model/plan/leg/LegConstructionSupport.java +++ b/application/src/main/java/org/opentripplanner/model/plan/leg/LegConstructionSupport.java @@ -1,9 +1,8 @@ package org.opentripplanner.model.plan.leg; import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.LineString; +import org.opentripplanner.street.geometry.GeometryUtils; import org.opentripplanner.transit.model.network.TripPattern; /** @@ -15,19 +14,15 @@ public class LegConstructionSupport { * Given a pattern, board and alight stop index compute the list of coordinates that this * segment of the pattern visits. */ - public static List extractTransitLegCoordinates( + public static LineString extractSubGeometry( TripPattern tripPattern, int boardStopIndexInPattern, int alightStopIndexInPattern ) { - List transitLegCoordinates = new ArrayList<>(); - + var lineStrings = new ArrayList(); for (int i = boardStopIndexInPattern + 1; i <= alightStopIndexInPattern; i++) { - transitLegCoordinates.addAll( - Arrays.asList(tripPattern.getHopGeometry(i - 1).getCoordinates()) - ); + lineStrings.add(tripPattern.getHopGeometry(i - 1)); } - - return transitLegCoordinates; + return GeometryUtils.concatenateLineStrings(lineStrings); } } diff --git a/application/src/main/java/org/opentripplanner/model/plan/leg/ScheduledTransitLeg.java b/application/src/main/java/org/opentripplanner/model/plan/leg/ScheduledTransitLeg.java index 857eccb6d65..a34a64c1d06 100644 --- a/application/src/main/java/org/opentripplanner/model/plan/leg/ScheduledTransitLeg.java +++ b/application/src/main/java/org/opentripplanner/model/plan/leg/ScheduledTransitLeg.java @@ -10,7 +10,6 @@ import java.util.Objects; import java.util.Set; import javax.annotation.Nullable; -import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.LineString; import org.opentripplanner.core.model.accessibility.Accessibility; import org.opentripplanner.core.model.basic.Cost; @@ -120,15 +119,15 @@ protected ScheduledTransitLeg(ScheduledTransitLegBuilder builder) { this.generalizedCost = builder.generalizedCost(); - List transitLegCoordinates = LegConstructionSupport.extractTransitLegCoordinates( + LineString transitLegCoordinates = LegConstructionSupport.extractSubGeometry( tripPattern, boardStopPosInPattern, alightStopPosInPattern ); - this.legGeometry = GeometryUtils.makeLineString(transitLegCoordinates); + this.legGeometry = transitLegCoordinates; this.distanceMeters = DoubleUtils.roundTo2Decimals( - GeometryUtils.sumDistances(transitLegCoordinates) + GeometryUtils.sumDistances(transitLegCoordinates.getCoordinateSequence()) ); this.transitAlerts = Set.copyOf(builder.alerts()); this.fromViaLocationType = builder.fromViaLocationType(); diff --git a/application/src/main/java/org/opentripplanner/routing/algorithm/mapping/RaptorPathToItineraryMapper.java b/application/src/main/java/org/opentripplanner/routing/algorithm/mapping/RaptorPathToItineraryMapper.java index a3fab9204ad..b98e80168f7 100644 --- a/application/src/main/java/org/opentripplanner/routing/algorithm/mapping/RaptorPathToItineraryMapper.java +++ b/application/src/main/java/org/opentripplanner/routing/algorithm/mapping/RaptorPathToItineraryMapper.java @@ -399,7 +399,7 @@ private List mapTransferLeg( .withTo(to) .withDistanceMeters(transfer.getDistanceMeters()) .withGeneralizedCost(toOtpDomainCost(pathLeg.c1())) - .withGeometry(GeometryUtils.makeLineString(transfer.getCoordinates())) + .withGeometry(transfer.getGeometry()) .withWalkSteps(List.of()) .build() ); diff --git a/application/src/main/java/org/opentripplanner/transfer/regular/model/Transfer.java b/application/src/main/java/org/opentripplanner/transfer/regular/model/Transfer.java index d4f5a62df01..fd8d03966f8 100644 --- a/application/src/main/java/org/opentripplanner/transfer/regular/model/Transfer.java +++ b/application/src/main/java/org/opentripplanner/transfer/regular/model/Transfer.java @@ -1,12 +1,11 @@ package org.opentripplanner.transfer.regular.model; -import java.util.ArrayList; -import java.util.Arrays; import java.util.EnumSet; import java.util.List; import java.util.Optional; -import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.LineString; import org.opentripplanner.raptor.spi.RaptorCostConverter; +import org.opentripplanner.street.geometry.GeometryUtils; import org.opentripplanner.street.model.StreetMode; import org.opentripplanner.street.model.edge.Edge; import org.opentripplanner.street.search.request.StreetSearchRequest; @@ -49,17 +48,12 @@ public Transfer(int toStopIndex, int distanceMeters, EnumSet modes) this(toStopIndex, distanceMeters, modes, null); } - public List getCoordinates() { - List coordinates = new ArrayList<>(); + public LineString getGeometry() { if (edges == null) { - return coordinates; - } - for (Edge edge : edges) { - if (edge.getGeometry() != null) { - coordinates.addAll((Arrays.asList(edge.getGeometry().getCoordinates()))); - } + return GeometryUtils.getGeometryFactory().createLineString(); + } else { + return GeometryUtils.concatenateLineStrings(edges, Edge::getGeometry); } - return coordinates; } public int getToStop() { diff --git a/application/src/test/resources/org/opentripplanner/apis/gtfs/expectations/planConnection-tutorial.json b/application/src/test/resources/org/opentripplanner/apis/gtfs/expectations/planConnection-tutorial.json index caafc57375d..f36f188de19 100644 --- a/application/src/test/resources/org/opentripplanner/apis/gtfs/expectations/planConnection-tutorial.json +++ b/application/src/test/resources/org/opentripplanner/apis/gtfs/expectations/planConnection-tutorial.json @@ -62,7 +62,7 @@ "shortName": "RBUS" }, "legGeometry": { - "points": "_{rc@_d{r@????_ibE_t`B" + "points": "_{rc@_d{r@??_ibE_t`B" } }, { @@ -97,7 +97,7 @@ "shortName": "R2" }, "legGeometry": { - "points": "_evi@_y|u@????_ibE_t`B" + "points": "_evi@_y|u@??_ibE_t`B" } }, { diff --git a/street/src/main/java/org/opentripplanner/street/geometry/GeometryUtils.java b/street/src/main/java/org/opentripplanner/street/geometry/GeometryUtils.java index 45b9c1a950d..f64db2fcb6d 100644 --- a/street/src/main/java/org/opentripplanner/street/geometry/GeometryUtils.java +++ b/street/src/main/java/org/opentripplanner/street/geometry/GeometryUtils.java @@ -15,7 +15,6 @@ import org.locationtech.jts.algorithm.ConvexHull; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.CoordinateSequence; -import org.locationtech.jts.geom.CoordinateSequenceFactory; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryCollection; @@ -31,7 +30,7 @@ public class GeometryUtils { - private static final CoordinateSequenceFactory CSF = new PackedCoordinateSequenceFactory(); + private static final PackedCoordinateSequenceFactory CSF = new PackedCoordinateSequenceFactory(); private static final GeometryFactory GF = new GeometryFactory(CSF); public static Geometry makeConvexHull( @@ -50,12 +49,8 @@ public static Geometry makeConvexHull( } public static LineString makeLineString(double... coords) { - GeometryFactory factory = getGeometryFactory(); - Coordinate[] coordinates = new Coordinate[coords.length / 2]; - for (int i = 0; i < coords.length; i += 2) { - coordinates[i / 2] = new Coordinate(coords[i], coords[i + 1]); - } - return factory.createLineString(coordinates); + var seq = CSF.create(coords, 2); + return GF.createLineString(seq); } public static LineString makeLineString(List coordinates) { @@ -294,17 +289,6 @@ public static Stream toEnvelopes(LineString ls) { return Arrays.stream(envelopes); } - /** - * Returns the sum of the distances in between the pairs of coordinates in meters. - */ - public static double sumDistances(List coordinates) { - double distance = 0; - for (int i = 1; i < coordinates.size(); i++) { - distance += SphericalDistanceLibrary.distance(coordinates.get(i - 1), coordinates.get(i)); - } - return distance; - } - /// Returns the sum of the distances in between the pairs of coordinates in meters. /// If the number of coordinates is empty or just one(a point), then `0` is returned. public static double sumDistances(Coordinate[] coordinates) { diff --git a/street/src/main/java/org/opentripplanner/street/model/edge/BoardingLocationToStopLink.java b/street/src/main/java/org/opentripplanner/street/model/edge/BoardingLocationToStopLink.java index f682b0865dc..46144c31052 100644 --- a/street/src/main/java/org/opentripplanner/street/model/edge/BoardingLocationToStopLink.java +++ b/street/src/main/java/org/opentripplanner/street/model/edge/BoardingLocationToStopLink.java @@ -1,6 +1,5 @@ package org.opentripplanner.street.model.edge; -import java.util.List; import org.locationtech.jts.geom.LineString; import org.opentripplanner.street.geometry.GeometryUtils; import org.opentripplanner.street.model.vertex.StreetVertex; @@ -40,7 +39,7 @@ protected int getStreetToStopTime() { @Override public LineString getGeometry() { - return GeometryUtils.makeLineString(List.of(fromv.getCoordinate(), tov.getCoordinate())); + return GeometryUtils.makeLineString(fromv.getX(), fromv.getY(), tov.getX(), tov.getY()); } @Override diff --git a/street/src/main/java/org/opentripplanner/street/model/edge/ElevatorBoardEdge.java b/street/src/main/java/org/opentripplanner/street/model/edge/ElevatorBoardEdge.java index 060cf1e4c97..122d7354d6b 100644 --- a/street/src/main/java/org/opentripplanner/street/model/edge/ElevatorBoardEdge.java +++ b/street/src/main/java/org/opentripplanner/street/model/edge/ElevatorBoardEdge.java @@ -1,7 +1,5 @@ package org.opentripplanner.street.model.edge; -import java.util.List; -import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.LineString; import org.opentripplanner.core.model.i18n.I18NString; import org.opentripplanner.core.model.i18n.NonLocalizedString; @@ -26,9 +24,7 @@ public class ElevatorBoardEdge extends Edge implements BikeWalkableEdge, Elevato private ElevatorBoardEdge(Vertex from, ElevatorHopVertex to) { super(from, to); - geometry = GeometryUtils.makeLineString( - List.of(new Coordinate(from.getX(), from.getY()), new Coordinate(to.getX(), to.getY())) - ); + geometry = GeometryUtils.makeLineString(from.getX(), from.getY(), to.getX(), to.getY()); } public static ElevatorBoardEdge createElevatorBoardEdge(Vertex from, ElevatorHopVertex to) { diff --git a/street/src/test/java/org/opentripplanner/street/geometry/GeometryUtilsTest.java b/street/src/test/java/org/opentripplanner/street/geometry/GeometryUtilsTest.java index d13374a2194..ba8ac2a5ebd 100644 --- a/street/src/test/java/org/opentripplanner/street/geometry/GeometryUtilsTest.java +++ b/street/src/test/java/org/opentripplanner/street/geometry/GeometryUtilsTest.java @@ -271,8 +271,7 @@ void toEnvelopes() { @Test void sumDistances() { - var coordinates = List.of(BERLIN, HAMBURG); - var meters = GeometryUtils.sumDistances(coordinates); + var meters = GeometryUtils.sumDistances(new Coordinate[] { BERLIN, HAMBURG }); assertEquals(255_384.0, meters, 0.5); }