Skip to content

Instantly share code, notes, and snippets.

@karussell
Created March 18, 2019 21:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save karussell/61ff7852d1f5fc143f1e45f27be8659d to your computer and use it in GitHub Desktop.
Save karussell/61ff7852d1f5fc143f1e45f27be8659d to your computer and use it in GitHub Desktop.
Coordinate nw = num2deg(xInfo, yInfo, zInfo);
Coordinate se = num2deg(xInfo + 1, yInfo + 1, zInfo);
if ("mvt".equalsIgnoreCase(resultStr) && zInfo >= 10 && (nw.y < 49 && nw.y > 48.3) && (nw.x > 10.5 && nw.x < 11.5)) {
qr = locationIndex.findClosest((nw.y + se.y) / 2, (nw.x + se.x) / 2, edgeFilter);
if (!qr.isValid())
throw new IllegalArgumentException("Point not found:" + point);
queryGraph = new QueryGraph(graph);
queryGraph.lookup(Collections.singletonList(qr));
hintsMap = new HintsMap();
RouteResource.initHints(hintsMap, uriInfo.getQueryParameters());
weighting = graphHopper.createWeighting(hintsMap, encoder, graph);
isochrone = new Isochrone(queryGraph, weighting, reverseFlow);
isochrone.setTimeLimit(1200);
List<Number[]> edgeList = isochrone.searchEdges(qr.getClosestNode());
IGeometryFilter acceptAllGeomFilter = geometry -> true;
Envelope tileEnvelope = new Envelope(se, nw);
MvtLayerParams layerParams = new MvtLayerParams(256, 4096);
GeometryFactory geometryFactory = new GeometryFactory();
LineString[] edgeListGeometry = new LineString[edgeList.size()];
for (int edgeCounter = 0; edgeCounter < edgeList.size(); edgeCounter++) {
Number[] edge = edgeList.get(edgeCounter);
edgeListGeometry[edgeCounter] = geometryFactory.createLineString(
new Coordinate[]{new Coordinate(edge[0].doubleValue(), edge[1].doubleValue()),
new Coordinate(edge[2].doubleValue(), edge[3].doubleValue())});
}
logger.info("start encoding: " + resultStr + ", edges:" + 1);
// doing some AffineTransformation
TileGeomResult tileGeom = JtsAdapter.createTileGeom(
geometryFactory.createMultiLineString(edgeListGeometry),
tileEnvelope,
geometryFactory,
layerParams,
acceptAllGeomFilter);
MvtLayerProps layerProps = new MvtLayerProps();
VectorTile.Tile.Layer.Builder layerBuilder = MvtLayerBuild.newLayerBuilder("roads", layerParams);
MvtLayerBuild.writeProps(layerBuilder, layerProps);
List<VectorTile.Tile.Feature> features = JtsAdapter.toFeatures(tileGeom.mvtGeoms, layerProps, new UserDataKeyValueMapConverter());
VectorTile.Tile mvt = VectorTile.Tile.newBuilder().addLayers(layerBuilder.addAllFeatures(features).build()).build();
byte[] bytes = mvt.toByteArray();
String tookStr = "" + sw.stop().getSeconds() * 1000;
logger.info("took: " + tookStr);
return Response.fromResponse(Response.ok(bytes, new MediaType("application", "x-protobuf")).build())
.header("X-GH-Took", tookStr)
.build();
}
Coordinate num2deg(int xInfo, int yInfo, int zoom) {
double n = Math.pow(2, zoom);
double lonDeg = xInfo / n * 360.0 - 180.0;
// unfortunately latitude numbers goes from north to south
double latRad = Math.atan(Math.sinh(Math.PI * (1 - 2 * yInfo / n)));
double latDeg = Math.toDegrees(latRad);
return new Coordinate(lonDeg, latDeg);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment