Search in sources :

Example 1 with Jumper

use of io.opentraffic.engine.geom.Jumper in project traffic-engine by opentraffic.

the class JumperDataStore method addJumper.

public void addJumper(Jumper jumper) {
    Fun.Tuple2<Long, Long> jumperId = jumper.getStartEndTuple();
    if (jumperMap.containsKey(jumperId))
        return;
    NavigableSet<Fun.Tuple2<Long, Long>> startSubset = jumperStartIndex.subSet(// inclusive lower bound, null tests lower than anything
    new Fun.Tuple2(jumperId.b, null), // inclusive lower bound, null tests lower than anything
    true, // inclusive upper bound, HI tests higher than anything
    new Fun.Tuple2(jumperId.b, Fun.HI), // inclusive upper bound, HI tests higher than anything
    true);
    for (Fun.Tuple2<Long, Long> adjacentJumperId : startSubset) {
        Jumper adjacentJumper = jumperMap.get(adjacentJumperId);
        if (adjacentJumper.startNodeId == jumper.endNodeId && adjacentJumper.endNodeId == jumper.startNodeId)
            continue;
        Jumper mergedJumper = adjacentJumper.merge(jumper);
        if (mergedJumper != null) {
            jumperMap.put(mergedJumper.getStartEndTuple(), mergedJumper);
            jumperStartIndex.add(mergedJumper.getStartEndTuple());
            jumperEndIndex.add(mergedJumper.getEndStartTuple());
        }
    }
    NavigableSet<Fun.Tuple2<Long, Long>> endSubset = jumperEndIndex.subSet(// inclusive lower bound, null tests lower than anything
    new Fun.Tuple2(jumperId.a, null), // inclusive lower bound, null tests lower than anything
    true, // inclusive upper bound, HI tests higher than anything
    new Fun.Tuple2(jumperId.a, Fun.HI), // inclusive upper bound, HI tests higher than anything
    true);
    for (Fun.Tuple2<Long, Long> adjacentJumperId : endSubset) {
        Jumper adjacentJumper = jumperMap.get(new Fun.Tuple2<>(adjacentJumperId.b, adjacentJumperId.a));
        if (adjacentJumper.startNodeId == jumper.endNodeId && adjacentJumper.endNodeId == jumper.startNodeId)
            continue;
        Jumper mergedJumper = adjacentJumper.merge(jumper);
        if (mergedJumper != null) {
            jumperMap.put(mergedJumper.getStartEndTuple(), mergedJumper);
            jumperStartIndex.add(mergedJumper.getStartEndTuple());
            jumperEndIndex.add(mergedJumper.getEndStartTuple());
        }
    }
    jumperMap.put(jumper.getStartEndTuple(), jumper);
    jumperStartIndex.add(jumper.getStartEndTuple());
    jumperEndIndex.add(jumper.getEndStartTuple());
}
Also used : Jumper(io.opentraffic.engine.geom.Jumper)

Example 2 with Jumper

use of io.opentraffic.engine.geom.Jumper in project traffic-engine by opentraffic.

the class JumperSerializer method deserialize.

@Override
public Jumper deserialize(DataInput in, int available) throws IOException {
    Jumper jumper = new Jumper();
    jumper.startNodeId = in.readLong();
    jumper.endNodeId = in.readLong();
    jumper.length = in.readDouble();
    int len = in.readInt();
    jumper.segments = new Long[len];
    for (int i = 0; i < len; i++) {
        jumper.segments[i] = in.readLong();
    }
    return jumper;
}
Also used : Jumper(io.opentraffic.engine.geom.Jumper)

Example 3 with Jumper

use of io.opentraffic.engine.geom.Jumper in project traffic-engine by opentraffic.

the class OSMDataStore method addOsm.

private OSMArea addOsm(Fun.Tuple2<Integer, Integer> tile, Envelope env, OSM osm, Boolean keepCompleteGeometries) {
    String placeName = null;
    Long placePop = null;
    for (Entry<Long, Node> entry : osm.nodes.entrySet()) {
        Long id = entry.getKey();
        Node node = entry.getValue();
        if (id == 259009337) {
            try {
                long pop = Long.parseLong(node.getTag("population"));
                if (placePop == null || placePop < pop) {
                    placePop = pop;
                    placeName = node.getTag("name");
                }
            } catch (Exception e) {
            }
        }
    }
    List<StreetSegment> segments = getStreetSegments(osm);
    List<SpatialDataItem> segmentItems = new ArrayList<>();
    List<SpatialDataItem> triplineItems = new ArrayList<>();
    for (StreetSegment segment : segments) {
        if (streetSegments.contains(segment.getSegmentId()))
            continue;
        if (segment.length > MIN_SEGMENT_LEN) {
            LengthIndexedLine lengthIndexedLine = new LengthIndexedLine(segment.getGeometry());
            double scale = (lengthIndexedLine.getEndIndex() - lengthIndexedLine.getStartIndex()) / segment.length;
            List<TripLine> tripLines = new ArrayList<TripLine>();
            tripLines.add(createTripLine(segment, 1, lengthIndexedLine, (OSMDataStore.INTERSECTION_MARGIN_METERS) * scale, OSMDataStore.INTERSECTION_MARGIN_METERS));
            tripLines.add(createTripLine(segment, 2, lengthIndexedLine, ((segment.length - OSMDataStore.INTERSECTION_MARGIN_METERS) * scale), segment.length - OSMDataStore.INTERSECTION_MARGIN_METERS));
            for (TripLine tripLine : tripLines) {
                triplineItems.add(tripLine);
            }
        } else {
            jumperDataStore.addJumper(new Jumper(segment));
        }
        if (!keepCompleteGeometries)
            segment.truncateGeometry();
        segmentItems.add(segment);
    }
    streetSegments.save(segmentItems);
    jumperDataStore.save();
    triplines.save(triplineItems);
    long zoneOffset = timeZoneConverter.getOffsetForCoord(env.centre());
    OSMArea osmArea = new OSMArea(osmAreaIds.getNextId(), tile.a, tile.b, Z_INDEX, placeName, placePop, zoneOffset, env);
    osmAreas.put(tile, osmArea);
    db.commit();
    System.out.println("Loaded OSM " + tile.a + ", " + tile.b);
    if (placeName != null)
        System.out.println("\t" + placeName + ", " + placePop);
    return osmArea;
}
Also used : StreetSegment(io.opentraffic.engine.geom.StreetSegment) Node(com.conveyal.osmlib.Node) SpatialDataItem(io.opentraffic.engine.data.SpatialDataItem) Jumper(io.opentraffic.engine.geom.Jumper) LengthIndexedLine(com.vividsolutions.jts.linearref.LengthIndexedLine) TripLine(io.opentraffic.engine.geom.TripLine)

Aggregations

Jumper (io.opentraffic.engine.geom.Jumper)3 Node (com.conveyal.osmlib.Node)1 LengthIndexedLine (com.vividsolutions.jts.linearref.LengthIndexedLine)1 SpatialDataItem (io.opentraffic.engine.data.SpatialDataItem)1 StreetSegment (io.opentraffic.engine.geom.StreetSegment)1 TripLine (io.opentraffic.engine.geom.TripLine)1