GPXRouteElement.java
/*
* This file is part of Openrouteservice.
*
* Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this library;
* if not, see <https://www.gnu.org/licenses/>.
*/
package org.heigit.ors.api.responses.routing.gpx;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import org.heigit.ors.routing.RouteResult;
import org.heigit.ors.routing.RouteSegment;
import org.heigit.ors.routing.RouteStep;
import org.locationtech.jts.geom.Coordinate;
import java.util.ArrayList;
import java.util.List;
@XmlRootElement(name = "rte")
@Schema(name = "rte")
public class GPXRouteElement {
@XmlElement(name = "rtept")
List<GPXRoutePointElement> routePoints;
@XmlElement(name = "extensions")
GPXRouteExtensions extensions;
public GPXRouteElement() {
}
public GPXRouteElement(RouteResult result) {
routePoints = new ArrayList<>();
Coordinate[] routeCoordinates = result.getGeometry();
List<RouteSegment> segments = result.getSegments();
List<RouteStep> steps = new ArrayList<>();
for (RouteSegment segment : segments) {
steps.addAll(segment.getSteps());
}
for (int i = 0; i < steps.size(); i++) {
RouteStep step = steps.get(i);
int coordStartId = step.getWayPoints()[0];
int coordEndId = step.getWayPoints()[1];
int coordinateId = coordStartId;
while (coordinateId >= coordStartId && coordinateId <= coordEndId) {
if (coordStartId == coordEndId) {
Coordinate c = routeCoordinates[coordinateId];
routePoints.add(new GPXRoutePointElement(step, c.x, c.y, c.z, i));
break;
} else if (coordinateId < coordEndId) {
Coordinate c = routeCoordinates[coordinateId];
routePoints.add(new GPXRoutePointElement(step, c.x, c.y, c.z, i));
}
coordinateId++;
}
}
// it may be the case that we did not ask for instructions so there will be no steps
if (steps.isEmpty()) {
for (Coordinate coord : routeCoordinates) {
routePoints.add(new GPXRoutePointElement(null, coord.x, coord.y, coord.z, -1));
}
}
extensions = new GPXRouteExtensions(result);
}
}