use of io.arlas.server.core.model.CollectionReference in project ARLAS-server by gisaia.
the class TileRESTService method tiledgeosearch.
@Timed
@Path("{collection}/_tile/{z}/{x}/{y}.png")
@GET
@Produces({ TileRESTService.PRODUCES_PNG })
@Consumes(UTF8JSON)
@ApiOperation(value = "Tiled GeoSearch", produces = TileRESTService.PRODUCES_PNG, notes = Documentation.TILED_GEOSEARCH_OPERATION, consumes = UTF8JSON, response = FeatureCollection.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successful operation"), @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class) })
public Response tiledgeosearch(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, @ApiParam(name = "x", value = "x", required = true) @PathParam(value = "x") Integer x, @ApiParam(name = "y", value = "y", required = true) @PathParam(value = "y") Integer y, @ApiParam(name = "z", value = "z", required = true) @PathParam(value = "z") Integer z, // --------------------------------------------------------
@ApiParam(name = "f", value = Documentation.FILTER_PARAM_F, allowMultiple = true) @QueryParam(value = "f") List<String> f, @ApiParam(name = "q", value = Documentation.FILTER_PARAM_Q, allowMultiple = true) @QueryParam(value = "q") List<String> q, @ApiParam(name = "dateformat", value = Documentation.FILTER_DATE_FORMAT) @QueryParam(value = "dateformat") String dateformat, @ApiParam(hidden = true) @HeaderParam(value = "partition-filter") String partitionFilter, @ApiParam(hidden = true) @HeaderParam(value = "Column-Filter") Optional<String> columnFilter, @ApiParam(name = "size", value = Documentation.PAGE_PARAM_SIZE, defaultValue = "10", allowableValues = "range[1, infinity]", type = "integer") @DefaultValue("10") @QueryParam(value = "size") IntParam size, @ApiParam(name = "from", value = Documentation.PAGE_PARAM_FROM, defaultValue = "0", allowableValues = "range[0, infinity]", type = "integer") @DefaultValue("0") @QueryParam(value = "from") IntParam from, @ApiParam(name = "sort", value = Documentation.PAGE_PARAM_SORT, allowMultiple = true) @QueryParam(value = "sort") String sort, @ApiParam(name = "after", value = Documentation.PAGE_PARAM_AFTER) @QueryParam(value = "after") String after, @ApiParam(name = "before", value = Documentation.PAGE_PARAM_BEFORE) @QueryParam(value = "before") String before, // --------------------------------------------------------
@ApiParam(name = "sampling", value = TileDocumentation.TILE_SAMPLING, defaultValue = "10") @QueryParam(value = "sampling") Integer sampling, @ApiParam(name = "coverage", value = TileDocumentation.TILE_COVERAGE, defaultValue = "70") @QueryParam(value = "coverage") Integer coverage, // --------------------------------------------------------
@ApiParam(value = "max-age-cache") @QueryParam(value = "max-age-cache") Integer maxagecache) throws NotFoundException, ArlasException {
CollectionReference collectionReference = exploreService.getCollectionReferenceService().getCollectionReference(collection);
if (collectionReference == null) {
throw new NotFoundException(collection);
}
if (collectionReference.params.rasterTileURL == null) {
throw new NotFoundException(collectionReference.collectionName + " has no URL defined for fetching the tiles.");
}
if (StringUtil.isNullOrEmpty(collectionReference.params.rasterTileURL.url)) {
throw new NotFoundException(collectionReference.collectionName + " has no URL defined for fetching the tiles.");
}
if (z < collectionReference.params.rasterTileURL.minZ || z > collectionReference.params.rasterTileURL.maxZ) {
LOGGER.info("Request level out of [" + collectionReference.params.rasterTileURL.minZ + "-" + collectionReference.params.rasterTileURL.maxZ + "]");
return Response.noContent().build();
}
BoundingBox bbox = GeoTileUtil.getBoundingBox(new Tile(x, y, z));
Search search = new Search();
search.filter = ParamsParser.getFilter(collectionReference, f, q, dateformat);
search.page = ParamsParser.getPage(size, from, sort, after, before);
search.projection = ParamsParser.getProjection(collectionReference.params.rasterTileURL.idPath + "," + collectionReference.params.geometryPath, null);
ColumnFilterUtil.assertRequestAllowed(columnFilter, collectionReference, search);
Search searchHeader = new Search();
searchHeader.filter = ParamsParser.getFilter(partitionFilter);
MixedRequest request = new MixedRequest();
request.basicRequest = search;
request.headerRequest = searchHeader;
request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
Queue<TileProvider<RasterTile>> providers = findCandidateTiles(collectionReference, request).stream().filter(match -> match._2().map(// if geo is available, does it intersect the bbox?
polygon -> (!collectionReference.params.rasterTileURL.checkGeometry) || polygon.intersects(GeoTileUtil.toPolygon(bbox))).orElse(// otherwise, let's keep that match, we'll see later if it paints something
Boolean.TRUE)).map(match -> new URLBasedRasterTileProvider(new RasterTileURL(collectionReference.params.rasterTileURL.url.replace("{id}", Optional.ofNullable(match._1()).orElse("")), collectionReference.params.rasterTileURL.minZ, collectionReference.params.rasterTileURL.maxZ, collectionReference.params.rasterTileURL.checkGeometry), collectionReference.params.rasterTileWidth, collectionReference.params.rasterTileHeight)).collect(Collectors.toCollection(LinkedList::new));
if (providers.size() == 0) {
return Response.noContent().build();
}
Try<Optional<RasterTile>, ArlasException> stacked = new RasterTileStacker().stack(providers).sampling(Optional.ofNullable(sampling).orElse(10)).upTo(new RasterTileStacker.Percentage(Optional.ofNullable(coverage).orElse(10))).on(new Tile(x, y, z));
stacked.onFail(failure -> LOGGER.error("Failed to fetch a tile", failure));
return stacked.map(otile -> otile.map(tile -> Try.withCatch(() -> {
// lets write the image to the response's output
final ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(tile.getImg(), "png", out);
return cache(Response.ok(out.toByteArray()), maxagecache);
}, IOException.class).onFail(e -> Response.serverError().entity(e.getMessage()).build()).orElse(// Can't write the tile => No content
Response.noContent().build())).orElse(// No tile => No content
Response.noContent().build())).orElse(// No tile => No content
Response.noContent().build());
}
use of io.arlas.server.core.model.CollectionReference in project ARLAS-server by gisaia.
the class GeoAggregateRESTService method shapeaggregatePost.
@Timed
@Path("{collection}/_shapeaggregate")
@POST
@Produces(ZIPFILE)
@Consumes(UTF8JSON)
@ApiOperation(value = "ShapeAggregate", produces = ZIPFILE, notes = Documentation.SHAPEAGGREGATION_OPERATION, consumes = UTF8JSON)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successful operation"), @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class), @ApiResponse(code = 501, message = "Not implemented functionality.", response = Error.class) })
public Response shapeaggregatePost(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, // --------------------------------------------------------
AggregationsRequest aggregationRequest, @ApiParam(hidden = true) @HeaderParam(value = "partition-filter") String partitionFilter, @ApiParam(hidden = true) @HeaderParam(value = "Column-Filter") Optional<String> columnFilter, // --------------------------------------------------------
@ApiParam(name = "pretty", value = Documentation.FORM_PRETTY, defaultValue = "false") @QueryParam(value = "pretty") Boolean pretty, // --------------------------------------------------------
@ApiParam(value = "max-age-cache") @QueryParam(value = "max-age-cache") Integer maxagecache) throws NotFoundException, ArlasException {
CollectionReference collectionReference = exploreService.getCollectionReferenceService().getCollectionReference(collection);
if (collectionReference == null) {
throw new NotFoundException(collection);
}
AggregationsRequest aggregationsRequestHeader = new AggregationsRequest();
aggregationsRequestHeader.filter = ParamsParser.getFilter(partitionFilter);
MixedRequest request = new MixedRequest();
exploreService.setValidGeoFilters(collectionReference, aggregationRequest);
exploreService.setValidGeoFilters(collectionReference, aggregationsRequestHeader);
ColumnFilterUtil.assertRequestAllowed(columnFilter, collectionReference, aggregationRequest);
request.basicRequest = aggregationRequest;
request.headerRequest = aggregationsRequestHeader;
request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
FeatureCollection fc = getFeatureCollection(request, collectionReference, true, Optional.empty());
File result = toShapefile(fc);
try {
return Response.ok(result).header("Content-Disposition", "attachment; filename=" + result.getName()).build();
} finally {
try {
FileUtils.forceDeleteOnExit(result);
} catch (IOException ignored) {
}
}
}
use of io.arlas.server.core.model.CollectionReference in project ARLAS-server by gisaia.
the class GeoAggregateRESTService method geoaggregatePost.
@Timed
@Path("{collection}/_geoaggregate")
@POST
@Produces(UTF8JSON)
@Consumes(UTF8JSON)
@ApiOperation(value = "GeoAggregate", produces = UTF8JSON, notes = Documentation.GEOAGGREGATION_OPERATION, consumes = UTF8JSON, response = FeatureCollection.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successful operation", response = FeatureCollection.class, responseContainer = "FeatureCollection"), @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class), @ApiResponse(code = 501, message = "Not implemented functionality.", response = Error.class) })
public Response geoaggregatePost(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, // --------------------------------------------------------
AggregationsRequest aggregationRequest, @ApiParam(hidden = true) @HeaderParam(value = "partition-filter") String partitionFilter, @ApiParam(hidden = true) @HeaderParam(value = "Column-Filter") Optional<String> columnFilter, // --------------------------------------------------------
@ApiParam(name = "pretty", value = Documentation.FORM_PRETTY, defaultValue = "false") @QueryParam(value = "pretty") Boolean pretty, // --------------------------------------------------------
@ApiParam(value = "max-age-cache") @QueryParam(value = "max-age-cache") Integer maxagecache) throws NotFoundException, ArlasException {
CollectionReference collectionReference = exploreService.getCollectionReferenceService().getCollectionReference(collection);
if (collectionReference == null) {
throw new NotFoundException(collection);
}
AggregationsRequest aggregationsRequestHeader = new AggregationsRequest();
aggregationsRequestHeader.filter = ParamsParser.getFilter(partitionFilter);
MixedRequest request = new MixedRequest();
exploreService.setValidGeoFilters(collectionReference, aggregationRequest);
exploreService.setValidGeoFilters(collectionReference, aggregationsRequestHeader);
ColumnFilterUtil.assertRequestAllowed(columnFilter, collectionReference, aggregationRequest);
request.basicRequest = aggregationRequest;
request.headerRequest = aggregationsRequestHeader;
request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
FeatureCollection fc = getFeatureCollection(request, collectionReference, (aggregationRequest.form != null && aggregationRequest.form.flat), Optional.empty());
return cache(Response.ok(fc), maxagecache);
}
use of io.arlas.server.core.model.CollectionReference in project ARLAS-server by gisaia.
the class GeoAggregateRESTService method geohashgeoaggregate.
@Timed
@Path("{collection}/_geoaggregate/{geohash}")
@GET
@Produces(UTF8JSON)
@Consumes(UTF8JSON)
@ApiOperation(value = "GeoAggregate on a geohash", produces = UTF8JSON, notes = Documentation.GEOHASH_GEOAGGREGATION_OPERATION, consumes = UTF8JSON, response = FeatureCollection.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successful operation", response = FeatureCollection.class, responseContainer = "FeatureCollection"), @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class), @ApiResponse(code = 501, message = "Not implemented functionality.", response = Error.class) })
public Response geohashgeoaggregate(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, @ApiParam(name = "geohash", value = "geohash", required = true) @PathParam(value = "geohash") String geohash, // --------------------------------------------------------
@ApiParam(name = "agg", value = Documentation.GEOAGGREGATION_PARAM_AGG) @QueryParam(value = "agg") List<String> agg, // --------------------------------------------------------
@ApiParam(name = "f", value = Documentation.FILTER_PARAM_F, allowMultiple = true) @QueryParam(value = "f") List<String> f, @ApiParam(name = "q", value = Documentation.FILTER_PARAM_Q, allowMultiple = true) @QueryParam(value = "q") List<String> q, @ApiParam(name = "dateformat", value = Documentation.FILTER_DATE_FORMAT) @QueryParam(value = "dateformat") String dateformat, @ApiParam(hidden = true) @HeaderParam(value = "partition-filter") String partitionFilter, @ApiParam(hidden = true) @HeaderParam(value = "Column-Filter") Optional<String> columnFilter, // --------------------------------------------------------
@ApiParam(name = "pretty", value = Documentation.FORM_PRETTY, defaultValue = "false") @QueryParam(value = "pretty") Boolean pretty, @ApiParam(name = "flat", value = Documentation.FORM_FLAT, defaultValue = "false") @QueryParam(value = "flat") Boolean flat, // --------------------------------------------------------
@ApiParam(value = "max-age-cache") @QueryParam(value = "max-age-cache") Integer maxagecache) throws NotFoundException, ArlasException {
CollectionReference collectionReference = exploreService.getCollectionReferenceService().getCollectionReference(collection);
if (collectionReference == null) {
throw new NotFoundException(collection);
}
if (geohash.startsWith("#")) {
geohash = geohash.substring(1);
}
if (agg == null || agg.size() == 0) {
agg = Collections.singletonList("geohash:" + collectionReference.params.centroidPath + ":interval-" + geohash.length());
}
List<BoundingBox> bboxes = getBoundingBoxes(geohash, agg, collectionReference);
List<CompletableFuture<AggregationResponse>> futureList = new ArrayList<>();
AggregationTypeEnum aggType = null;
for (BoundingBox b : bboxes) {
Expression pwithinBbox = new Expression(collectionReference.params.centroidPath, OperatorEnum.within, b.getWest() + "," + b.getSouth() + "," + String.format(Locale.ROOT, "%.8f", b.getEast() - GEOHASH_EPSILON) + "," + String.format(Locale.ROOT, "%.8f", b.getNorth() - GEOHASH_EPSILON));
MixedRequest request = getGeoaggregateRequest(collectionReference, ParamsParser.getFilter(collectionReference, f, q, dateformat, b, pwithinBbox), partitionFilter, columnFilter, agg);
aggType = ((AggregationsRequest) request.basicRequest).aggregations.get(0).type;
futureList.add(CompletableFuture.supplyAsync(() -> {
try {
return exploreService.aggregate(request, collectionReference, true, ((AggregationsRequest) request.basicRequest).aggregations, 0, System.nanoTime());
} catch (ArlasException e) {
throw new RuntimeException(e);
}
}));
}
List<AggregationResponse> aggResponses = futureList.stream().map(CompletableFuture::join).collect(Collectors.toList());
return cache(Response.ok(toGeoJson(merge(aggResponses), aggType, Boolean.TRUE.equals(flat), Optional.of(geohash))), maxagecache);
}
use of io.arlas.server.core.model.CollectionReference in project ARLAS-server by gisaia.
the class ComputeRESTService method compute.
@Timed
@Path("{collection}/_compute")
@GET
@Produces(UTF8JSON)
@Consumes(UTF8JSON)
@ApiOperation(value = "Compute", produces = UTF8JSON, notes = Documentation.COMPUTE_OPERATION, consumes = UTF8JSON, response = ComputationResponse.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successful operation", response = ComputationResponse.class, responseContainer = "ArlasComputation"), @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class) })
public Response compute(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, // --------------------------------------------------------
@ApiParam(name = "field", value = Documentation.COMPUTE_FIELD, required = true) @QueryParam(value = "field") String field, @ApiParam(name = "metric", value = Documentation.COMPUTE_METRIC, required = true) @QueryParam(value = "metric") String metric, // --------------------------------------------------------
@ApiParam(name = "f", value = Documentation.FILTER_PARAM_F, allowMultiple = true) @QueryParam(value = "f") List<String> f, @ApiParam(name = "q", value = Documentation.FILTER_PARAM_Q, allowMultiple = true) @QueryParam(value = "q") List<String> q, @ApiParam(name = "dateformat", value = Documentation.FILTER_DATE_FORMAT) @QueryParam(value = "dateformat") String dateformat, @ApiParam(hidden = true) @HeaderParam(value = "partition-filter") String partitionFilter, @ApiParam(hidden = true) @HeaderParam(value = "Column-Filter") Optional<String> columnFilter, // --------------------------------------------------------
@ApiParam(name = "pretty", value = Documentation.FORM_PRETTY, defaultValue = "false") @QueryParam(value = "pretty") Boolean pretty, // --------------------------------------------------------
@ApiParam(value = "max-age-cache") @QueryParam(value = "max-age-cache") Integer maxagecache) throws ArlasException {
CollectionReference collectionReference = exploreService.getCollectionReferenceService().getCollectionReference(collection);
if (collectionReference == null) {
throw new NotFoundException(collection);
}
ComputationRequest computationRequest = new ComputationRequest();
computationRequest.filter = ParamsParser.getFilter(collectionReference, f, q, dateformat);
computationRequest.field = field;
computationRequest.metric = ComputationEnum.fromValue(metric);
exploreService.setValidGeoFilters(collectionReference, computationRequest);
ColumnFilterUtil.assertRequestAllowed(columnFilter, collectionReference, computationRequest);
ComputationRequest computationRequestHeader = new ComputationRequest();
computationRequestHeader.filter = ParamsParser.getFilter(partitionFilter);
exploreService.setValidGeoFilters(collectionReference, computationRequestHeader);
MixedRequest request = new MixedRequest();
request.basicRequest = computationRequest;
request.headerRequest = computationRequestHeader;
request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
ComputationResponse computationResponse = exploreService.compute(request, collectionReference);
return cache(Response.ok(computationResponse), maxagecache);
}
Aggregations