Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
import org.opentripplanner.TestOtpModel;
import org.opentripplanner.TestServerContext;
import org.opentripplanner._support.time.ZoneIds;
import org.opentripplanner.api.model.geometry.EncodedPolyline;
import org.opentripplanner.ext.fares.impl.gtfs.DefaultFareService;
import org.opentripplanner.ext.flex.FlexIntegrationTestData;
import org.opentripplanner.framework.geometry.EncodedPolyline;
import org.opentripplanner.graph_builder.module.ValidateAndInterpolateStopTimesForEachTrip;
import org.opentripplanner.model.GenericLocation;
import org.opentripplanner.model.StopTime;
Expand Down Expand Up @@ -116,7 +116,7 @@ void flexTripInTransitMode() {
assertEquals(2, intermediateStops.size());
assertEquals("zone_1", intermediateStops.get(0).place.stop.getId().getId());

EncodedPolyline legGeometry = EncodedPolyline.encode(leg.legGeometry());
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"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package org.opentripplanner.api.model.geometry;

import java.util.Objects;
import org.locationtech.jts.geom.Geometry;
import org.opentripplanner.framework.geometry.GeometryUtils;
import org.opentripplanner.framework.geometry.PolylineEncoder;
import org.opentripplanner.utils.tostring.ToStringBuilder;

/**
* A list of coordinates encoded as a string, the length (number of coordinates) and the distance.
* <p>
* See <a href="http://code.google.com/apis/maps/documentation/polylinealgorithm.html">Encoded
* polyline algorithm format</a>
*
* The attributes are lazy initialized to avoid unnecessary computation in case only the
* line-string or the distance is requested, or none.
*
* THIS CLASS IS NOT THREAD-SAFE.
*/
public final class EncodedPolyline {

private static final int NOT_SET = -1;
private final Geometry geometry;

private String points = null;
private int length = NOT_SET;
private int distance_m = NOT_SET;

private EncodedPolyline(Geometry geometry) {
this.geometry = geometry;
}

public static EncodedPolyline of(Geometry geometry) {
return new EncodedPolyline(geometry);
}

public String points() {
calculateLineString();
return points;
}

public int length() {
calculateLineString();
return length;
}

public int distanceInMeters() {
calculateDistance();
return distance_m;
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
EncodedPolyline that = (EncodedPolyline) o;
return length() == that.length() && Objects.equals(points(), that.points());
}

@Override
public int hashCode() {
return Objects.hash(points(), length());
}

@Override
public String toString() {
return ToStringBuilder.of("EncodedPolyline")
.addNum("length", length())
.addObj("points", points())
.toString();
}

private void calculateLineString() {
if (length == NOT_SET) {
var line = PolylineEncoder.encodeGeometry(geometry);
this.points = line.points();
this.length = line.length();
}
}

private void calculateDistance() {
if (distance_m == NOT_SET) {
distance_m = (int) GeometryUtils.sumDistances(geometry.getCoordinates());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import org.locationtech.jts.geom.Geometry;
import org.opentripplanner.api.model.geometry.EncodedPolyline;
import org.opentripplanner.apis.gtfs.generated.GraphQLDataFetchers;
import org.opentripplanner.framework.geometry.EncodedPolyline;

public class GeometryImpl implements GraphQLDataFetchers.GraphQLGeometry {

Expand All @@ -19,6 +19,6 @@ public DataFetcher<String> points() {
}

private EncodedPolyline getSource(DataFetchingEnvironment environment) {
return EncodedPolyline.encode((Geometry) environment.getSource());
return EncodedPolyline.of((Geometry) environment.getSource());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import java.util.ArrayList;
import java.util.List;
import org.opentripplanner.api.model.geometry.EncodedPolyline;
import org.opentripplanner.apis.transmodel.model.framework.EncodedPolylineBeanWithStops;
import org.opentripplanner.framework.geometry.EncodedPolyline;
import org.opentripplanner.transit.model.network.TripPattern;

public class GeometryMapper {
Expand All @@ -19,7 +19,7 @@ public static List<EncodedPolylineBeanWithStops> mapStopToStopGeometries(
for (int i = 0; i < tripPattern.numberOfStops() - 1; i++) {
var startLocation = tripPattern.getStop(i);
var endLocation = tripPattern.getStop(i + 1);
var geometry = EncodedPolyline.encode(tripPattern.getHopGeometry(i));
var geometry = EncodedPolyline.of(tripPattern.getHopGeometry(i));

var stopToStopGeometry = new EncodedPolylineBeanWithStops(
startLocation,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.opentripplanner.apis.transmodel.model.framework;

import org.opentripplanner.framework.geometry.EncodedPolyline;
import org.opentripplanner.api.model.geometry.EncodedPolyline;
import org.opentripplanner.transit.model.site.StopLocation;

public record EncodedPolylineBeanWithStops(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package org.opentripplanner.apis.transmodel.model.framework;

import graphql.Scalars;
import graphql.schema.DataFetchingEnvironment;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLObjectType;
import org.opentripplanner.framework.geometry.EncodedPolyline;
import org.opentripplanner.api.model.geometry.EncodedPolyline;

public class PointsOnLinkType {

Expand All @@ -18,7 +19,7 @@ public static GraphQLObjectType create() {
.name("length")
.description("The number of points in the string")
.type(Scalars.GraphQLInt)
.dataFetcher(environment -> ((EncodedPolyline) environment.getSource()).length())
.dataFetcher(env -> encodedPolyline(env).length())
.build()
)
.field(
Expand All @@ -29,9 +30,21 @@ public static GraphQLObjectType create() {
"(https://www.freeformatter.com/javascript-escape.html)"
)
.type(Scalars.GraphQLString)
.dataFetcher(environment -> ((EncodedPolyline) environment.getSource()).points())
.dataFetcher(env -> encodedPolyline(env).points())
.build()
)
.field(
GraphQLFieldDefinition.newFieldDefinition()
.name("distance")
.description("The distance in meters.")
.type(Scalars.GraphQLInt)
.dataFetcher(env -> encodedPolyline(env).distanceInMeters())
.build()
)
.build();
}

private static EncodedPolyline encodedPolyline(DataFetchingEnvironment environment) {
return environment.getSource();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@
import java.util.Optional;
import java.util.stream.Collectors;
import org.locationtech.jts.geom.LineString;
import org.opentripplanner.api.model.geometry.EncodedPolyline;
import org.opentripplanner.api.model.transit.FeedScopedIdMapper;
import org.opentripplanner.apis.transmodel.mapping.GeometryMapper;
import org.opentripplanner.apis.transmodel.model.EnumTypes;
import org.opentripplanner.apis.transmodel.model.framework.TransmodelDirectives;
import org.opentripplanner.apis.transmodel.model.framework.TransmodelScalars;
import org.opentripplanner.apis.transmodel.support.GqlUtil;
import org.opentripplanner.framework.geometry.EncodedPolyline;
import org.opentripplanner.transit.model.network.TripPattern;
import org.opentripplanner.transit.model.timetable.TripTimes;

Expand Down Expand Up @@ -120,7 +120,7 @@ public GraphQLObjectType create(
if (geometry == null) {
return null;
} else {
return EncodedPolyline.encode(geometry);
return EncodedPolyline.of(geometry);
}
})
.build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.opentripplanner.api.model.geometry.EncodedPolyline;
import org.opentripplanner.apis.transmodel.model.EnumTypes;
import org.opentripplanner.apis.transmodel.model.TransmodelTransportSubmode;
import org.opentripplanner.apis.transmodel.model.TripTimeOnDateHelper;
import org.opentripplanner.apis.transmodel.model.framework.TransmodelDirectives;
import org.opentripplanner.apis.transmodel.model.framework.TransmodelScalars;
import org.opentripplanner.apis.transmodel.support.GqlUtil;
import org.opentripplanner.framework.geometry.EncodedPolyline;
import org.opentripplanner.model.plan.Leg;
import org.opentripplanner.model.plan.TransitLeg;
import org.opentripplanner.model.plan.leg.StopArrival;
Expand Down Expand Up @@ -157,7 +157,7 @@ public static GraphQLObjectType create(
.name("pointsOnLink")
.description("The leg's geometry.")
.type(linkGeometryType)
.dataFetcher(env -> EncodedPolyline.encode(leg(env).legGeometry()))
.dataFetcher(env -> EncodedPolyline.of(leg(env).legGeometry()))
.build()
)
.field(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@
import java.util.Optional;
import java.util.stream.Collectors;
import org.locationtech.jts.geom.LineString;
import org.opentripplanner.api.model.geometry.EncodedPolyline;
import org.opentripplanner.api.model.transit.FeedScopedIdMapper;
import org.opentripplanner.apis.transmodel.model.EnumTypes;
import org.opentripplanner.apis.transmodel.model.TransmodelTransportSubmode;
import org.opentripplanner.apis.transmodel.model.framework.TransmodelDirectives;
import org.opentripplanner.apis.transmodel.model.framework.TransmodelScalars;
import org.opentripplanner.apis.transmodel.support.GqlUtil;
import org.opentripplanner.framework.geometry.EncodedPolyline;
import org.opentripplanner.transit.model.network.TripPattern;
import org.opentripplanner.transit.model.site.StopLocation;
import org.opentripplanner.transit.model.timetable.Trip;
Expand Down Expand Up @@ -272,7 +272,7 @@ public GraphQLObjectType create(
return null;
}

return EncodedPolyline.encode(geometry);
return EncodedPolyline.of(geometry);
})
.build()
)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -294,4 +294,14 @@ public static double sumDistances(List<Coordinate> coordinates) {
}
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.
Comment on lines +298 to +299

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't seen markdown comments in OTP before, do you think we should start using them even though they're not really supported until java 23?

It will be nice to not have to write html

public static double sumDistances(Coordinate[] coordinates) {
double distance = 0;
for (int i = 1; i < coordinates.length; i++) {
distance += SphericalDistanceLibrary.distance(coordinates[i - 1], coordinates[i]);
}
return distance;
}
}
Loading
Loading