Skip to main content

Tilequery

This guide provides an overview of how to query Mapbox-hosted vector tile features near a point using the Mapbox Java SDK.

The Mapbox Tilequery API allows you to retrieve data about specific features from a vector tileset, based on a given latitude and longitude. The API makes it possible to query for features within a radius, do point in polygon queries, query for features in multiple composite layers, and augment data from the Mapbox Geocoding API with custom data.

For more information about this API, including its pricing structure, see the Mapbox Tilequery API documentation.

Import packages

import com.mapbox.api.tilequery.MapboxTilequery
import com.mapbox.geojson.FeatureCollection

Building the query URL

To begin with, you'll need to create a new instance of the MapboxTilequery object and use its builder to customize your query. The options offered in the builder includes choices such as the query coordinate, the type of GeoJSON geometry you're searching for, and the search area radius.

MapboxTilequery tilequery = MapboxTilequery.builder()
.accessToken(MAPBOX_ACCESS_TOKEN)
.tilesetIds(tilesetId)
.query(Point.fromLngLat(LONGITUDE,LATITUDE))
.radius(radiusInMeters)
.limit(maxNumOfFeaturesReturned)
.geometry(geoJsonGeometryString) // "point", "linestring", or "polygon"
.dedupe(boolean)
.layers(singleOrListOfMapLayerIds) // layer name within a tileset, not a style
.build();
PLAYGROUND
Tilequery Playground

Create and run Tilequery API queries and see the results on a map.

Query response

Access the Tilequery API response object inside the onResponse callback. The onResponse callback is built with Retrofit, like the Java SDK's other services' callbacks. The response will include a List<Feature> if the query you built has any Features in it. But, there's no guarantee that the response will have any Feature objects in it.

tilequery.enqueueCall(new Callback<FeatureCollection>() {
@Override public void onResponse(Call<FeatureCollection> call, Response<FeatureCollection> response) {

List<Feature> featureList = response.body().features();

}

@Override public void onFailure(Call<FeatureCollection> call, Throwable throwable) {

Log.d("Request failed: %s", throwable.getMessage());

}
});

Each Feature in the response has a distance, geometry, and layer property associated with it:

tilequery.enqueueCall(new Callback<FeatureCollection>() {
@Override public void onResponse(Call<FeatureCollection> call, Response<FeatureCollection> response) {

// The FeatureCollection that is inside the API response

List<Feature> featureList = response.body().features();

// Distance that the Feature is from the original Tilequery Point coordinate
String distance = featureList.get(0).getProperty("tilequery").getAsJsonObject().get("distance").toString();

// The Feature's GeoJSON geometry type
String geometryType = featureList.get(0).getProperty("tilequery").getAsJsonObject().get("geometry").toString();

// The id of the map layer which the Feature is a part of
String layerId = featureList.get(0).getProperty("tilequery").getAsJsonObject().get("layer").toString();
}

@Override public void onFailure(Call<FeatureCollection> call, Throwable throwable) {

Log.d("Request failed: %s", throwable.getMessage());

}
});
Was this page helpful?