All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.opentripplanner.common.StreetUtils Maven / Gradle / Ivy
package org.opentripplanner.common;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.Polygon;
import org.opentripplanner.common.geometry.Subgraph;
import org.opentripplanner.graph_builder.DataImportIssueStore;
import org.opentripplanner.graph_builder.issues.GraphConnectivity;
import org.opentripplanner.routing.api.request.RoutingRequest;
import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.core.TraverseMode;
import org.opentripplanner.routing.core.TraverseModeSet;
import org.opentripplanner.routing.edgetype.ElevatorEdge;
import org.opentripplanner.routing.edgetype.FreeEdge;
import org.opentripplanner.routing.edgetype.StreetEdge;
import org.opentripplanner.routing.edgetype.StreetTransitLink;
import org.opentripplanner.routing.edgetype.StreetTraversalPermission;
import org.opentripplanner.routing.edgetype.TransitEntranceLink;
import org.opentripplanner.routing.graph.Edge;
import org.opentripplanner.routing.graph.Graph;
import org.opentripplanner.routing.graph.Vertex;
import org.opentripplanner.routing.vertextype.StreetVertex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
public class StreetUtils {
private static Logger LOG = LoggerFactory.getLogger(StreetUtils.class);
private static int islandCounter = 0;
public static void pruneFloatingIslands(Graph graph, int maxIslandSize,
int islandWithStopMaxSize, String islandLogName, DataImportIssueStore issueStore) {
LOG.debug("pruning");
PrintWriter islandLog = null;
if (islandLogName != null && !islandLogName.isEmpty()) {
try {
islandLog = new PrintWriter(new File(islandLogName));
} catch (Exception e) {
LOG.error("Failed to write islands log file", e);
}
}
if (islandLog != null) {
islandLog.printf("%s\t%s\t%s\t%s\t%s\n","id","stopCount", "streetCount","wkt" ,"hadRemoved");
}
Map subgraphs = new HashMap();
Map> neighborsForVertex = new HashMap>();
// RoutingRequest options = new RoutingRequest(new TraverseModeSet(TraverseMode.WALK, TraverseMode.TRANSIT));
RoutingRequest options = new RoutingRequest(new TraverseModeSet(TraverseMode.WALK));
for (Vertex gv : graph.getVertices()) {
if (!(gv instanceof StreetVertex)) {
continue;
}
State s0 = new State(gv, options);
for (Edge e : gv.getOutgoing()) {
Vertex in = gv;
if (!(e instanceof StreetEdge || e instanceof StreetTransitLink ||
e instanceof TransitEntranceLink || e instanceof ElevatorEdge ||
e instanceof FreeEdge)
) {
continue;
}
State s1 = e.traverse(s0);
if (s1 == null) {
continue;
}
Vertex out = s1.getVertex();
ArrayList vertexList = neighborsForVertex.get(in);
if (vertexList == null) {
vertexList = new ArrayList();
neighborsForVertex.put(in, vertexList);
}
vertexList.add(out);
vertexList = neighborsForVertex.get(out);
if (vertexList == null) {
vertexList = new ArrayList();
neighborsForVertex.put(out, vertexList);
}
vertexList.add(in);
}
}
ArrayList islands = new ArrayList();
/* associate each node with a subgraph */
for (Vertex gv : graph.getVertices()) {
if (!(gv instanceof StreetVertex)) {
continue;
}
Vertex vertex = gv;
if (subgraphs.containsKey(vertex)) {
continue;
}
if (!neighborsForVertex.containsKey(vertex)) {
continue;
}
Subgraph subgraph = computeConnectedSubgraph(neighborsForVertex, vertex);
if (subgraph != null){
for (Iterator vIter = subgraph.streetIterator(); vIter.hasNext();) {
Vertex subnode = vIter.next();
subgraphs.put(subnode, subgraph);
}
islands.add(subgraph);
}
}
LOG.info(islands.size() + " sub graphs found");
/* remove all tiny subgraphs and large subgraphs without stops */
for (Subgraph island : islands) {
boolean hadRemoved = false;
if(island.stopSize() > 0){
//for islands with stops
if (island.streetSize() < islandWithStopMaxSize) {
depedestrianizeOrRemove(graph, island, issueStore);
hadRemoved = true;
}
}else{
//for islands without stops
if (island.streetSize() < maxIslandSize) {
depedestrianizeOrRemove(graph, island, issueStore);
hadRemoved = true;
}
}
if (islandLog != null) {
WriteNodesInSubGraph(island, islandLog, hadRemoved);
}
}
if (graph.removeEdgelessVertices() > 0) {
LOG.info("Removed edgeless vertices after pruning islands");
}
}
private static void depedestrianizeOrRemove(
Graph graph,
Subgraph island,
DataImportIssueStore issueStore
) {
//iterate over the street vertex of the subgraph
for (Iterator vIter = island.streetIterator(); vIter.hasNext();) {
Vertex v = vIter.next();
Collection outgoing = new ArrayList(v.getOutgoing());
for (Edge e : outgoing) {
if (e instanceof StreetEdge) {
StreetEdge pse = (StreetEdge) e;
StreetTraversalPermission permission = pse.getPermission();
permission = permission.remove(StreetTraversalPermission.PEDESTRIAN);
permission = permission.remove(StreetTraversalPermission.BICYCLE);
if (permission == StreetTraversalPermission.NONE) {
graph.removeEdge(pse);
} else {
pse.setPermission(permission);
}
}
}
}
for (Iterator vIter = island.streetIterator(); vIter.hasNext();) {
Vertex v = vIter.next();
if (v.getDegreeOut() + v.getDegreeIn() == 0) {
graph.remove(v);
}
}
//remove street conncetion form
for (Iterator vIter = island.stopIterator(); vIter.hasNext();) {
Vertex v = vIter.next();
Collection edges = new ArrayList(v.getOutgoing());
edges.addAll(v.getIncoming());
for (Edge e : edges) {
if (e instanceof StreetTransitLink || e instanceof TransitEntranceLink) {
graph.removeEdge(e);
}
}
}
issueStore.add(new GraphConnectivity(island.getRepresentativeVertex(), island.streetSize()));
}
private static Subgraph computeConnectedSubgraph(
Map> neighborsForVertex, Vertex startVertex) {
Subgraph subgraph = new Subgraph();
Queue q = new LinkedList();
q.add(startVertex);
while (!q.isEmpty()) {
Vertex vertex = q.poll();
for (Vertex neighbor : neighborsForVertex.get(vertex)) {
if (!subgraph.contains(neighbor)) {
subgraph.addVertex(neighbor);
q.add(neighbor);
}
}
}
return subgraph;
// if(subgraph.size()>1) return subgraph;
// return null;
}
private static void WriteNodesInSubGraph(Subgraph subgraph, PrintWriter islandLog, boolean hadRemoved){
Geometry convexHullGeom = subgraph.getConvexHull();
if (convexHullGeom != null && !(convexHullGeom instanceof Polygon)) {
convexHullGeom = convexHullGeom.buffer(0.0001,5);
}
islandLog.printf("%d\t%d\t%d\t%s\t%b\n", islandCounter, subgraph.stopSize(),
subgraph.streetSize(), convexHullGeom, hadRemoved);
islandCounter++;
}
}