Weather Maps
The AerisMapKit module of the Xweather iOS SDK provides a fully-functional interactive weather map that you can easily drop into your custom application to display any type of weather data currently offered from Xweather Raster Maps and Xweather Weather API. This weather map is highly configurable and customizable, giving you even more control over how it integrates into your project.
Supported Map Libraries
The AerisMapKit module of the SDK works with the following mapping libraries. The default mapping library is Apple Maps using MapKit:
- Apple Maps (using MapKit (opens in a new tab))
- Mapbox (using the Mapbox GL SDK (opens in a new tab) for iOS)
- Google Maps (using the Google Maps SDK (opens in a new tab) for iOS)
When you instantiate an instance of a weather map object, you must specify which mapping library you want to use and cannot be changed once the weather map is created. The weather map object will automatically handle setting up your map view and the addition and removal of map overlays and objects based on the mapping strategy you choose.
Creating a Basic Weather Map
The simplest method for setting up a weather map is to instantiate an instance of AWFWeatherMap
with the desired map type. If you don't provide a map type, then the default of AWFWeatherMapTypeApple
will be used:
let weatherMap = AWFWeatherMap(mapType: .apple)
This initializes will also use the default map configuration and styling. If you want to provide a different configuration, then you will also need to specify your custom AWFWeatherMapConfig
instance:
let weatherMap = AWFWeatherMap(mapType: .apple, config: MyWeatherMapConfig())
Refer to the configuration guide for additional information regarding map configuration customizations.
Once you have a weather map instance, you'll need to add the weather map view to your application's view hierarchy and set its frame or layout constraints. You must use the weatherMapView
, not the weather map's mapView
property, when setting up your weather map. The weatherMapView
is a container view that includes the map view for the chosen mapping library, such as MKMapView
or MGLMapView
, and other internal subviews required for various weather map functionality.
So, use weatherMapView
in place of where you would use MKMapView
or other map view:
weatherMap.weatherMapView.frame = view.bounds
view.addSubview(weatherMap.weatherMapView)
If you need to receive event messages for various events triggered by an AWFWeatherMap
instance, such as when data sources are added to or removed from the map or the state of animations, you'll need to assign the weather map's delegate
property and conform to the AWFWeatherMapDelegate
protocol:
weatherMap.delegate = self
Using AWFWeatherMapViewController
To get a fully-interactive and functional weather map up and running similar to that in our SDK's demo application (opens in a new tab) requires much more setup than creating a basic weather map instance as the section above demonstrated. Therefore, we've wrapped all of the core weather map functionality into the AWFWeatherMapViewController
class that you can simply drop into your project with little effort.
AWFWeatherMapViewController
sets up everything you need for a fully interactive weather map, including:
- weather map and map view instances
- timeline/animation control view
- data legend view
- options menu for toggling map data sources on and off
- handling of the various weather map events by implementing the
AWFWeatherMapDelegate
protocol
By default, AWFWeatherMapViewController
will instantiate a default instance of AWFWeatherMap
that uses Apple's MapKit and the default configuration and styles. You can override these defaults by setting the weatherMapType
and config
properties on your map controller instance before adding the weather map view to your view hierarchy:
let mapConfig = MyWeatherMapConfig()
let weatherMapController = AWFWeatherMapViewController()
weatherMapController.weatherMapType = .apple
weatherMapController.config = mapConfig
Alternatively, you can subclass AWFWeatherMapViewController
and override the above properties at initialization:
class MyWeatherMapViewController: AWFWeatherMapViewController {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.weatherMapType = .apple
self.config = MyWeatherMapConfig()
self.isAutorefreshEnabled = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
For implementations that require even more advanced levels of customization and control, you should subclass AWFWeatherMapViewController
and override the necessary options and/or methods. Review the API reference for AWFWeatherMapViewController
for the complete list of public properties and methods available.
Receiving Map View Delegate Messages
Since your weather map and its internal objects must remain the sole delegate for your map view, you must NOT set the delegate property on a weather map's map view directly.
Therefore, to use a weather map while still responding to map view delegate messages, such as those from MKMapViewDelegate
, you must set the mapViewDelegate
property on your weather map instance to the object that acts as the delegate:
weatherMap.mapViewDelegate = self
Note that this is NOT the same as setting the delegate
on your weather map instance. Refer to our examples on adding custom annotations and overlays to your weather map for additional information.