Map Requests

Map Requests

Once you've setup the SDK either for the browser or as an NPM module, getting map imagery into your application is easy using the AerisWeather class.

Map image requests are made using an instance of MapRequest and interact with the Xweather Mapping Platform (Raster Maps). The SDK returns a JavaScript Promise (opens in a new tab) object when performing the asynchronous requests when calling get() on a request. This allows you to handle the response's result on completion of the request. Furthermore, you can also use JavaScript's async/await (opens in a new tab) operators to mimic syncronous requests for data instead of relying on a Promise callback function.

Creating a MapRequest

Use the map() method on your initialized AerisWeather instance, which will return a new map request instance that you can configure further:

// create the request instance
const request = aeris.map();
 
// set the map layers to include
request.layers('flat,radar,counties,admin');
 
// set the desired center coordinate and zoom level
request.center('seattle,wa').zoom(8);
 
// set the desired image size to 500x300 pixels
request.size(500, 300);
 
// perform the request and add the image to the DOM
request.get().then((result) => {
 
    // returned map image will be accessible on `result.image`
    const target = document.createElement('div');
    target.appendChild(result.image);
    document.body.appendChild(target);
    
});

The result that is returned to your Promise callback (or variable assignment when using async/await) will be an instance of MapResult, which contains not only the image returned by the response, but other information about the response. You will typically only be accessing the result.image property as that is the image element returned by Raster Maps for your request.

Promise vs Callback Function vs Async/Await

When performing your request using the get() method, you can either use the returned Promise to handle the response or include a callback function as the method's only argument. Your callback function will be called with the result on completion of the request:

// perform the request and output the data using a callback function
request.get((result) => {
    // returned map image will be accessible on `result.image`
    const target = document.createElement('div');
    target.appendChild(result.image);
    document.body.appendChild(target);
});

Alternatively, you can use async/await (opens in a new tab) if you're performing the request within an async function:

// perform the request using async/await
const loadImage = async () => {
    const result = await request.get();
    const target = document.createElement('div');
    target.appendChild(result.image);
    document.body.appendChild(target);
};
 
loadImage();

Accessing Map Valid Times

As outlined above, a map request will return an instance of MapResult containing the resulting image returned by the API but also other information about the map in the metadata property of the result. This metadata property is an instance of MapMetadata and provides you with the run time, valid time and the min/max dates for which the resulting map image is valid.

For instance, you may want to display the latest radar map for your location and the actual time for which the image is valid for. You'd perform the same type of setup as explained above, but this time you'd need to access the metadata object as well to grab the validDate for the map:

// perform the request and add the image to the DOM
request.get().then((result) => {
 
    // returned map image will be accessible on `result.image`
    const target = document.createElement('div');
    target.appendChild(result.image);
    document.body.appendChild(target);
    
    // output the map's valid time to the DOM from the `result.metadata` object
    const { metadata: { validDate }} = result;
    if (validDate) {
        const timeTarget = document.createElement('div');
        timeTarget.innerHTML = validDate.toString();
        document.body.appendChild(timeTarget);
    }
    
});

If your map request contains layers representing a date range instead of a specific date and time, such as convective or temperatures-outlook-6-10d-cpc, you would need to access the metadata's minValidDate (opens in a new tab) and maxValidDate (opens in a new tab) values to determine the date range the map's data represents:

// perform the request and add the image to the DOM
request.get().then((result) => {
 
    // returned map image will be accessible on `result.image`
    const target = document.createElement('div');
    target.appendChild(result.image);
    document.body.appendChild(target);
    
    // output the map's valid time range to the DOM from the `result.metadata` object
    const { metadata: { minValidDate, maxValidDate }} = result;
    if (minValidDate && maxValidDate) {
        const timeTarget = document.createElement('div');
        timeTarget.innerHTML = `${minValidDate()} - ${maxValidDate()}`;
        document.body.appendChild(timeTarget);
    }
    
});

Methods

The following methods are available when configuring an MapRequest instance:

MethodValue TypeDescription
base(:value)string, string[]Sets the base layers, which will be rendered at the bottom of the layer stack.
bounds(:value)ICoordinateBoundsSets the bounding box coordinates for the rendered map region.
center(:loc)string, ICoordinateSets the center for the map request. The center can be a place name or a geographical coordinate value.
data(:value)string, string[]Sets the weather data layers, which will be rendered above the base layers but below overlays and text.
date(:value)DateSets the time offset value using the specified date.
layers(:value)string, string[], Layer[]Sets all layers, which will be rendered in the order in which they are provided by value.
metric(:value)booleanSets whether text data should be rendered as Metric units.
offset(:value)string, numberSets the time offset value relative to now.
overlays(:value)string, string[]Sets the overlay layers, which will be rendered above weather data layers but below text layers.
place(:value)stringSets the location the map will be centered on.
size(:width, :height)numberSets the map width and height.
text(:value)string, string[]Sets the text layers, which will be rendered at the top of the layer stack.
type(:value)stringSets the type of map image to request, either image (default) or tile.
zoom(:value)numberSets the zoom level.

The following are additional methods available when working with request instances:

MethodValue TypeDescription
get(:callback)FunctionPerforms the request. Returns a Promise that can be used to handle the result. Alternatively, a callback function can be passed to handle the result.
url(:groups)string[]Returns the url string for the request based on the configured parameters and options. An optional array of group names can be provided to only return the url containing layers in those groups, e.g. url(['data']) would only return weather data layers in the url.
cancel()Cancels the request.
param(:key, :value)string, anySets or returns the specified parameter. If a value is provided, then the option will be set. Otherwise the current value will be returned.
setParams(:value)ApiRequestUpdates the request's configuration using the specified options object.
clone()Returns an identical duplicate of the request instance.

Request Result

The Promise or callback function from the call to get() to perform the request will receive one argument, which is the result of the request. This result will be an instance of MapResult containing various pieces of information related to the request and response.

The following properties are returned with each MapResult instance:

PropertyDescription
imageImage returned by the API.
metadataAdditional information about the returned map image, such as valid and run times. See MapMetadata.
errorError that occurred during the request, if any.
paramsRequest parameters that were used.
responseResponse object returned by the request.

Typically you will be most interested in the image property as that will contain the map image returned by the API for your request.