Skip to content

Commit

Permalink
Remove obsolete interface; move highly-specific function to resource
Browse files Browse the repository at this point in the history
  • Loading branch information
michaz committed Oct 11, 2019
1 parent ee02bc1 commit 8a15c30
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 146 deletions.

This file was deleted.

This file was deleted.

Expand Up @@ -31,7 +31,6 @@
import com.graphhopper.GraphHopperAPI;
import com.graphhopper.http.health.GraphHopperHealthCheck;
import com.graphhopper.http.health.GraphHopperStorageHealthCheck;
import com.graphhopper.isochrone.algorithm.DelaunayTriangulationIsolineBuilder;
import com.graphhopper.jackson.Jackson;
import com.graphhopper.reader.gtfs.GraphHopperGtfs;
import com.graphhopper.reader.gtfs.GtfsStorage;
Expand Down Expand Up @@ -142,20 +141,6 @@ public void dispose(Boolean instance) {
}
}

static class RasterHullBuilderFactory implements Factory<DelaunayTriangulationIsolineBuilder> {

DelaunayTriangulationIsolineBuilder builder = new DelaunayTriangulationIsolineBuilder();

@Override
public DelaunayTriangulationIsolineBuilder provide() {
return builder;
}

@Override
public void dispose(DelaunayTriangulationIsolineBuilder delaunayTriangulationIsolineBuilder) {
}
}

@Override
public void initialize(Bootstrap<?> bootstrap) {
// See #1440: avoids warning regarding com.fasterxml.jackson.module.afterburner.util.MyClassLoader
Expand Down Expand Up @@ -226,7 +211,6 @@ protected void configure() {
bind(encodingManager).to(EncodingManager.class);
bind(graphHopperStorage).to(GraphHopperStorage.class);
bind(gtfsStorage).to(GtfsStorage.class);
bindFactory(RasterHullBuilderFactory.class).to(DelaunayTriangulationIsolineBuilder.class);
}
});
environment.jersey().register(NearestResource.class);
Expand Down Expand Up @@ -277,7 +261,6 @@ protected void configure() {
bindFactory(TranslationMapFactory.class).to(TranslationMap.class);
bindFactory(EncodingManagerFactory.class).to(EncodingManager.class);
bindFactory(GraphHopperStorageFactory.class).to(GraphHopperStorage.class);
bindFactory(RasterHullBuilderFactory.class).to(DelaunayTriangulationIsolineBuilder.class);
}
});

Expand Down
Expand Up @@ -4,7 +4,7 @@
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.graphhopper.GraphHopper;
import com.graphhopper.http.WebHelper;
import com.graphhopper.isochrone.algorithm.DelaunayTriangulationIsolineBuilder;
import com.graphhopper.isochrone.algorithm.ContourBuilder;
import com.graphhopper.isochrone.algorithm.Isochrone;
import com.graphhopper.json.geo.JsonFeature;
import com.graphhopper.routing.QueryGraph;
Expand All @@ -17,6 +17,12 @@
import com.graphhopper.util.shapes.GHPoint;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.MultiPolygon;
import org.locationtech.jts.geom.Polygon;
import org.locationtech.jts.triangulate.ConformingDelaunayTriangulator;
import org.locationtech.jts.triangulate.ConstraintVertex;
import org.locationtech.jts.triangulate.quadedge.QuadEdgeSubdivision;
import org.locationtech.jts.triangulate.quadedge.Vertex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -27,10 +33,7 @@
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.*;

@Path("isochrone")
public class IsochroneResource {
Expand All @@ -39,14 +42,12 @@ public class IsochroneResource {

private final GraphHopper graphHopper;
private final EncodingManager encodingManager;
private final DelaunayTriangulationIsolineBuilder delaunayTriangulationIsolineBuilder;
private final GeometryFactory geometryFactory = new GeometryFactory();

@Inject
public IsochroneResource(GraphHopper graphHopper, EncodingManager encodingManager, DelaunayTriangulationIsolineBuilder delaunayTriangulationIsolineBuilder) {
public IsochroneResource(GraphHopper graphHopper, EncodingManager encodingManager) {
this.graphHopper = graphHopper;
this.encodingManager = encodingManager;
this.delaunayTriangulationIsolineBuilder = delaunayTriangulationIsolineBuilder;
}

@GET
Expand Down Expand Up @@ -103,7 +104,7 @@ public Response doGet(
if ("polygon".equalsIgnoreCase(resultStr)) {
List<List<Coordinate>> buckets = isochrone.searchGPS(qr.getClosestNode(), nBuckets);
if (isochrone.getVisitedNodes() > graphHopper.getMaxVisitedNodes() / 5) {
throw new IllegalArgumentException("Server side reset: too many junction nodes would have to explored (" + isochrone.getVisitedNodes() + "). Let us know if you need this increased.");
throw new IllegalArgumentException("Too many nodes would have to explored (" + isochrone.getVisitedNodes() + "). Let us know if you need this increased.");
}

int counter = 0;
Expand All @@ -116,7 +117,7 @@ public Response doGet(
counter++;
}
ArrayList<JsonFeature> features = new ArrayList<>();
List<Coordinate[]> polygonShells = delaunayTriangulationIsolineBuilder.calcList(buckets, buckets.size() - 1);
List<Coordinate[]> polygonShells = calcPolygons(buckets);
for (Coordinate[] polygonShell : polygonShells) {
JsonFeature feature = new JsonFeature();
HashMap<String, Object> properties = new HashMap<>();
Expand Down Expand Up @@ -149,4 +150,48 @@ public Response doGet(
throw new IllegalArgumentException("type not supported:" + resultStr);
}
}

@SuppressWarnings("unchecked")
private static List<Coordinate[]> calcPolygons(List<List<Coordinate>> pointLists) {
Collection<ConstraintVertex> sites = new ArrayList<>();
for (int i = 0; i < pointLists.size(); i++) {
List<Coordinate> level = pointLists.get(i);
for (Coordinate coord : level) {
ConstraintVertex site = new ConstraintVertex(coord);
site.setZ((double) i);
sites.add(site);
}
}
ConformingDelaunayTriangulator conformingDelaunayTriangulator = new ConformingDelaunayTriangulator(sites, 0.0);
conformingDelaunayTriangulator.setConstraints(new ArrayList(), new ArrayList());
conformingDelaunayTriangulator.formInitialDelaunay();
QuadEdgeSubdivision tin = conformingDelaunayTriangulator.getSubdivision();
for (Vertex vertex : (Collection<Vertex>) tin.getVertices(true)) {
if (tin.isFrameVertex(vertex)) {
vertex.setZ(Double.MAX_VALUE);
}
}
ArrayList<Coordinate[]> polygonShells = new ArrayList<>();
ContourBuilder contourBuilder = new ContourBuilder(tin);
// ignore the last isoline as it forms just the convex hull
for (int i = 0; i < pointLists.size() - 1; i++) {
MultiPolygon multiPolygon = contourBuilder.computeIsoline((double) i + 0.5);
int maxPoints = 0;
Polygon maxPolygon = null;
for (int j = 0; j < multiPolygon.getNumGeometries(); j++) {
Polygon polygon = (Polygon) multiPolygon.getGeometryN(j);
if (polygon.getNumPoints() > maxPoints) {
maxPoints = polygon.getNumPoints();
maxPolygon = polygon;
}
}
if (maxPolygon == null) {
throw new IllegalStateException("no maximum polygon was found?");
} else {
polygonShells.add(maxPolygon.getExteriorRing().getCoordinates());
}
}
return polygonShells;
}

}

0 comments on commit 8a15c30

Please sign in to comment.