Search in sources :

Example 1 with IGeometryFilter

use of com.wdtinc.mapbox_vector_tile.adapt.jts.IGeometryFilter in project graphhopper by graphhopper.

the class MVTResource method doGetXyz.

@GET
@Path("{z}/{x}/{y}.mvt")
@Produces("application/x-protobuf")
public Response doGetXyz(@Context HttpServletRequest httpReq, @Context UriInfo uriInfo, @PathParam("z") int zInfo, @PathParam("x") int xInfo, @PathParam("y") int yInfo, @QueryParam(Parameters.Details.PATH_DETAILS) List<String> pathDetails) {
    if (zInfo <= 9) {
        VectorTile.Tile.Builder mvtBuilder = VectorTile.Tile.newBuilder();
        return Response.fromResponse(Response.ok(mvtBuilder.build().toByteArray(), PBF).build()).header("X-GH-Took", "0").build();
    }
    StopWatch totalSW = new StopWatch().start();
    Coordinate nw = num2deg(xInfo, yInfo, zInfo);
    Coordinate se = num2deg(xInfo + 1, yInfo + 1, zInfo);
    LocationIndexTree locationIndex = (LocationIndexTree) graphHopper.getLocationIndex();
    final NodeAccess na = graphHopper.getGraphHopperStorage().getNodeAccess();
    BBox bbox = new BBox(nw.x, se.x, se.y, nw.y);
    if (!bbox.isValid())
        throw new IllegalStateException("Invalid bbox " + bbox);
    final GeometryFactory geometryFactory = new GeometryFactory();
    VectorTile.Tile.Builder mvtBuilder = VectorTile.Tile.newBuilder();
    final IGeometryFilter acceptAllGeomFilter = geometry -> true;
    final Envelope tileEnvelope = new Envelope(se, nw);
    final MvtLayerParams layerParams = new MvtLayerParams(256, 4096);
    final UserDataKeyValueMapConverter converter = new UserDataKeyValueMapConverter();
    if (!encodingManager.hasEncodedValue(RoadClass.KEY))
        throw new IllegalStateException("You need to configure GraphHopper to store road_class, e.g. graph.encoded_values: road_class,max_speed,... ");
    final EnumEncodedValue<RoadClass> roadClassEnc = encodingManager.getEnumEncodedValue(RoadClass.KEY, RoadClass.class);
    final AtomicInteger edgeCounter = new AtomicInteger(0);
    // in toFeatures addTags of the converter is called and layerProps is filled with keys&values => those need to be stored in the layerBuilder
    // otherwise the decoding won't be successful and "undefined":"undefined" instead of "speed": 30 is the result
    final MvtLayerProps layerProps = new MvtLayerProps();
    final VectorTile.Tile.Layer.Builder layerBuilder = MvtLayerBuild.newLayerBuilder("roads", layerParams);
    locationIndex.query(bbox, edgeId -> {
        EdgeIteratorState edge = graphHopper.getGraphHopperStorage().getEdgeIteratorStateForKey(edgeId * 2);
        LineString lineString;
        RoadClass rc = edge.get(roadClassEnc);
        if (zInfo >= 14) {
            PointList pl = edge.fetchWayGeometry(FetchMode.ALL);
            lineString = pl.toLineString(false);
        } else if (rc == RoadClass.MOTORWAY || zInfo > 10 && (rc == RoadClass.PRIMARY || rc == RoadClass.TRUNK) || zInfo > 11 && (rc == RoadClass.SECONDARY) || zInfo > 12) {
            double lat = na.getLat(edge.getBaseNode());
            double lon = na.getLon(edge.getBaseNode());
            double toLat = na.getLat(edge.getAdjNode());
            double toLon = na.getLon(edge.getAdjNode());
            lineString = geometryFactory.createLineString(new Coordinate[] { new Coordinate(lon, lat), new Coordinate(toLon, toLat) });
        } else {
            // skip edge for certain zoom
            return;
        }
        edgeCounter.incrementAndGet();
        Map<String, Object> map = new HashMap<>(2);
        map.put("name", edge.getName());
        for (String str : pathDetails) {
            // how to indicate an erroneous parameter?
            if (str.contains(",") || !encodingManager.hasEncodedValue(str))
                continue;
            EncodedValue ev = encodingManager.getEncodedValue(str, EncodedValue.class);
            if (ev instanceof EnumEncodedValue)
                map.put(ev.getName(), edge.get((EnumEncodedValue) ev).toString());
            else if (ev instanceof DecimalEncodedValue)
                map.put(ev.getName(), edge.get((DecimalEncodedValue) ev));
            else if (ev instanceof BooleanEncodedValue)
                map.put(ev.getName(), edge.get((BooleanEncodedValue) ev));
            else if (ev instanceof IntEncodedValue)
                map.put(ev.getName(), edge.get((IntEncodedValue) ev));
        }
        lineString.setUserData(map);
        // doing some AffineTransformation
        TileGeomResult tileGeom = JtsAdapter.createTileGeom(lineString, tileEnvelope, geometryFactory, layerParams, acceptAllGeomFilter);
        List<VectorTile.Tile.Feature> features = JtsAdapter.toFeatures(tileGeom.mvtGeoms, layerProps, converter);
        layerBuilder.addAllFeatures(features);
    });
    MvtLayerBuild.writeProps(layerBuilder, layerProps);
    mvtBuilder.addLayers(layerBuilder.build());
    byte[] bytes = mvtBuilder.build().toByteArray();
    totalSW.stop();
    logger.debug("took: " + totalSW.getSeconds() + ", edges:" + edgeCounter.get());
    return Response.ok(bytes, PBF).header("X-GH-Took", "" + totalSW.getSeconds() * 1000).build();
}
Also used : com.graphhopper.routing.ev(com.graphhopper.routing.ev) IGeometryFilter(com.wdtinc.mapbox_vector_tile.adapt.jts.IGeometryFilter) JtsAdapter(com.wdtinc.mapbox_vector_tile.adapt.jts.JtsAdapter) LoggerFactory(org.slf4j.LoggerFactory) VectorTile(com.wdtinc.mapbox_vector_tile.VectorTile) Coordinate(org.locationtech.jts.geom.Coordinate) HashMap(java.util.HashMap) MvtLayerBuild(com.wdtinc.mapbox_vector_tile.build.MvtLayerBuild) MvtLayerParams(com.wdtinc.mapbox_vector_tile.build.MvtLayerParams) EncodingManager(com.graphhopper.routing.util.EncodingManager) Inject(javax.inject.Inject) LocationIndexTree(com.graphhopper.storage.index.LocationIndexTree) HttpServletRequest(javax.servlet.http.HttpServletRequest) MediaType(javax.ws.rs.core.MediaType) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) GraphHopper(com.graphhopper.GraphHopper) com.graphhopper.util(com.graphhopper.util) GeometryFactory(org.locationtech.jts.geom.GeometryFactory) Logger(org.slf4j.Logger) Context(javax.ws.rs.core.Context) BBox(com.graphhopper.util.shapes.BBox) UserDataKeyValueMapConverter(com.wdtinc.mapbox_vector_tile.adapt.jts.UserDataKeyValueMapConverter) TileGeomResult(com.wdtinc.mapbox_vector_tile.adapt.jts.TileGeomResult) LineString(org.locationtech.jts.geom.LineString) List(java.util.List) NodeAccess(com.graphhopper.storage.NodeAccess) javax.ws.rs(javax.ws.rs) Response(javax.ws.rs.core.Response) MvtLayerProps(com.wdtinc.mapbox_vector_tile.build.MvtLayerProps) UriInfo(javax.ws.rs.core.UriInfo) Envelope(org.locationtech.jts.geom.Envelope) NodeAccess(com.graphhopper.storage.NodeAccess) GeometryFactory(org.locationtech.jts.geom.GeometryFactory) HashMap(java.util.HashMap) LineString(org.locationtech.jts.geom.LineString) Envelope(org.locationtech.jts.geom.Envelope) TileGeomResult(com.wdtinc.mapbox_vector_tile.adapt.jts.TileGeomResult) UserDataKeyValueMapConverter(com.wdtinc.mapbox_vector_tile.adapt.jts.UserDataKeyValueMapConverter) MvtLayerProps(com.wdtinc.mapbox_vector_tile.build.MvtLayerProps) VectorTile(com.wdtinc.mapbox_vector_tile.VectorTile) IGeometryFilter(com.wdtinc.mapbox_vector_tile.adapt.jts.IGeometryFilter) VectorTile(com.wdtinc.mapbox_vector_tile.VectorTile) LocationIndexTree(com.graphhopper.storage.index.LocationIndexTree) Coordinate(org.locationtech.jts.geom.Coordinate) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) LineString(org.locationtech.jts.geom.LineString) BBox(com.graphhopper.util.shapes.BBox) MvtLayerParams(com.wdtinc.mapbox_vector_tile.build.MvtLayerParams)

Aggregations

GraphHopper (com.graphhopper.GraphHopper)1 com.graphhopper.routing.ev (com.graphhopper.routing.ev)1 EncodingManager (com.graphhopper.routing.util.EncodingManager)1 NodeAccess (com.graphhopper.storage.NodeAccess)1 LocationIndexTree (com.graphhopper.storage.index.LocationIndexTree)1 com.graphhopper.util (com.graphhopper.util)1 BBox (com.graphhopper.util.shapes.BBox)1 VectorTile (com.wdtinc.mapbox_vector_tile.VectorTile)1 IGeometryFilter (com.wdtinc.mapbox_vector_tile.adapt.jts.IGeometryFilter)1 JtsAdapter (com.wdtinc.mapbox_vector_tile.adapt.jts.JtsAdapter)1 TileGeomResult (com.wdtinc.mapbox_vector_tile.adapt.jts.TileGeomResult)1 UserDataKeyValueMapConverter (com.wdtinc.mapbox_vector_tile.adapt.jts.UserDataKeyValueMapConverter)1 MvtLayerBuild (com.wdtinc.mapbox_vector_tile.build.MvtLayerBuild)1 MvtLayerParams (com.wdtinc.mapbox_vector_tile.build.MvtLayerParams)1 MvtLayerProps (com.wdtinc.mapbox_vector_tile.build.MvtLayerProps)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 Inject (javax.inject.Inject)1