Map

Description: creating a map with a timeline, which data is loaded from file.

The ViewController.h File

#import <MapCharting/MapChart.h>
#import <MapCharting/MapChart2D.h>
#import "MapDataSource.h"
@interface ViewController : UIViewController<MapChartDelegate>{
    MapChart2D *m_view; // 2D map
    MapDataSource *datasource; // Data source
}
@end

The ViewController.m File

#import &quot;ViewController.h&quot;
#import &lt;MapCharting/MapTopobase.h&gt;
#import &lt;MapCharting/MapAreaVisual.h&gt;
#import &quot;SolidColorBrush.h&quot;
#import &quot;DataDependency.h&quot;
#import &lt;MapCharting/MapTooltip.h&gt;
#import &lt;MapCharting/MapLabel.h&gt;
#import &lt;MapCharting/MapLegend.h&gt;
#import &lt;MapCharting/MapShape.h&gt;
#import &quot;UIColor+transition.h&quot;
#import &lt;MapCharting/MapLabel.h&gt;
#import &lt;MapCharting/MapChartSign.h&gt;
#import &lt;MapCharting/MapArrow.h&gt;
#import &lt;MapCharting/MapFilledArrow.h&gt;
#import &lt;MapCharting/MapBarVisual.h&gt;
#import &lt;MapCharting/MapPieVisual.h&gt;
#import &quot;UIColor+hex.h&quot;
@implementation ViewController
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Load data from source
    datasource = [[MapDataSource alloc]initWithFileName:@&quot;data.txt&quot;];
    // Determine minimum and maximum data values
    [datasource prepare];
    // Create a map based on loaded data
    [self dataSourceFinishedLoadData];
}
// Creates a map based on loaded data
- (void)dataSourceFinishedLoadData
{
    // Create a 2D map
    m_view = [[MapChart2D alloc] init];
    // Load file with topobase
    NSData *file = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@&quot;world.svg&quot; ofType:nil]];
    // Create an object for working with map topobase
    MapTopobase *topobase = [[MapTopobase alloc] initWithData:file];
    
    // Create an object for working with map layer
    MapLayer *layer = [topobase rootLayer];
    // Create a tooltip for layer
    layer.tooltip = [MapTooltip new];
    
    // Set object for working with map topobase
    [m_view setTopobase:[layer topobase]];
    // Set object containing methods for working with map
    [m_view setDelegate: self];
    // Determine affine transformation applied to all map areas
    [[m_view topobase] setTransform: CGAffineTransformIdentity];
    
    // Create an object for working with map factor
    MapAreaVisual *visual = [[MapAreaVisual alloc] init];
    /* Determine whether map area background fill parameters
    depend on data source */
    DataDependency *dataDependency = [DataDependency dependency];
    [dataDependency setIsDependent:YES];
    // Set data source
    [visual setDataSource: datasource];
    [dataDependency setDataSource:datasource];
    
    // Set colors for map layer area background fill
    NSArray *colors = [NSArray arrayWithObjects:@&quot;ff462c&quot;, @&quot;ebaf36&quot;, @&quot;ffd900&quot;, @&quot;b1ca40&quot;, @&quot;6a8535&quot;, nil];
    // Determine minimum map value
    double value = [datasource minValue];
    // Determine map scale step
    double step = (datasource.maxValue - datasource.minValue) / [colors count];
    // Determine correspondence between map scale intervals and layer area background fill colors
    ValueScale *scale = [[ValueScale new] autorelease];
    for (int i = 1; i &lt;[colors count]; i++) {
        value += step;
        [scale.value addObject:[NSNumber numberWithDouble:value]];
        // Determine colors for the Less value
        UIColor *lessColor = [UIColor colorWithHex:[colors objectAtIndex:(i - 1)]];
        [scale.less addObject:[SolidColorBrush solidColorBrushWithColor:lessColor]];
        // Determine colors for the Equal or Greater value
        UIColor *equalColor = [UIColor colorWithHex:[colors objectAtIndex:(i)]];
        [scale.equal addObject:[SolidColorBrush solidColorBrushWithColor:equalColor]];
        [scale.greater addObject:[SolidColorBrush solidColorBrushWithColor:equalColor]];
    }
    // Set scale
    [dataDependency setScale:scale];
    [visual setBackground:dataDependency];
    
    // Set brush for map background fill
    UIColor *backgroundColor = [[[Brush new] autorelease] mainColor];
    [m_view setBackground:[SolidColorBrush solidColorBrushWithColor:backgroundColor]];
    // Set map title color
    m_view.caption.textColor = [UIColor blackColor];
    
    // Set label color for map layer areas, for which there is no data
    [m_view setNoDataText: NSLocalizedString(@&quot;NO_DATA&quot;, nil)];
    // Create a brush for filling map layer areas that have not data
    SolidColorBrush *brush = [[[SolidColorBrush alloc] init] autorelease];
    // Set brush transparency
    [brush setOpacity: 0.2];
    // Set brush color
    [brush setColor: [UIColor grayColor]];
    // Set this brush
    [[[visual background] scale] setNoData: brush];
    
    // Get map legend
    MapLegend *legend = [m_view legend];
    // Display legend
    [legend setVisibility: YES];
    // Set scale
    [legend setValueScale: scale];
    // Align legend by map center
    [legend setBlockAlignment: NWLegendBlockAlignmentBottomCenter];
    
    // Set legend margins
    Thickness margin = {0,20,0,0};
    [legend setMargin:margin];
    // Set legend text color and font parameters
    [legend setTextColor:[UIColor darkGrayColor]];
    [legend setFont:[UIFont systemFontOfSize:12]];
    
    // Set the Less interval record format
    NSString *lessFormat = [NSMutableString stringWithString:NSLocalizedString(@&quot;LESS_FORMAT&quot;, nil)];
    [legend setLessFormat:lessFormat];
    // Set the Greater interval record format
    NSString *greaterFormat = [NSMutableString stringWithString:NSLocalizedString(@&quot;GREATER_FORMAT&quot;, nil)];
    [legend setGreaterFormat:greaterFormat];
    // Set between interval record format
    NSString *betweenFormat = [NSMutableString stringWithString:NSLocalizedString(@&quot;BETWEEN_FORMAT&quot;, nil)];
    [legend setBetweenFormat:betweenFormat];
    // Enable displaying of equality relations in legend
    [legend setShowEquals: YES];
    NSString *equalFormat = [NSMutableString stringWithString:NSLocalizedString(@&quot;EQUAL_FORMAT&quot;, nil)];
    [legend setEqualFormat: equalFormat];
    
    // Create legend top text
    MapLabel *header = [[MapLabel new] autorelease];
    [header setText: NSLocalizedString(@&quot;HEADER_TEXT&quot;, nil)];
    // Set text font parameters
    [header setFont: [UIFont systemFontOfSize:14]];
    [header setTextColor:[UIColor blackColor]];
    // Set text margins
    Thickness headerMargin = {5, 0, 0, 0};
    [header setMargin:headerMargin];
    // Set legend top text
    [[m_view legend] setHeader:header];
    
    // Create and set legend bottom text
    MapLabel *footer = [MapLabel new];
    [footer setText: NSLocalizedString(@&quot;FOOTER_TEXT&quot;, nil)];
    // Set text margins
    Thickness footerMargin = [footer margin];
    footerMargin.top = 80;
    footerMargin.left = -60;
    [footer setMargin:footerMargin];
    [legend setFooter: footer];
    
    // Set marker shape for map legend
    [legend setMarkerShape: MarkerShapeRhombus];
    // Set legend orientation
    [legend setOrientation: NWLegendOrientationFreeVertical];
    // Set legend position
    CGPoint pt = {[m_view legend].origin.x, 375};
    [legend setOrigin: pt];
    
    // Get timeline
    MapTimeAxis *timeAxis = [m_view timeAxis];
    // Display timeline
    [timeAxis setHidden: NO];
    // Set object containing methods for working with timeline
    [timeAxis setDelegate: m_view];
    // Set data source
    [timeAxis setDataSource:datasource];
    // Set up animation delay
    [timeAxis setDelayTime: AnimateTypeSlow];
    // Set font parameters for timeline
    [timeAxis setFont:[UIFont fontWithName:@&quot;Arial&quot; size:16]];
    // Set minimum distance in points between two neighbor tick marks
    [timeAxis setMinTickSpacing:1.0];
    // Set blue color for tick marks
    [timeAxis setTickColor: [UIColor blueColor]];
    /* Set time of moving from one tick mark
    to other one during animation playback */
    [timeAxis setJumpTime: AnimateTypeNormal];
    // Set current timeline slider position
    [timeAxis setIndex:0];
    // Create and display label over the current timeline slider position
    MapTooltip *caption = [[MapTooltip new] autorelease];
    [caption setVisibility:YES];
    [timeAxis setLabel: caption];
    
    /* Add an object for working with map factor
    into array of visual elements corresponding to child layers and areas
    */
    [[layer visuals] addObject: visual];
    // Add map layer into array of displayed layers
    [[m_view layers] addObject:layer];
    [self setView: m_view];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear: animated];
    [self mapChartDidAppear: m_view];
}
- (void)mapChartDidAppear:(MapChart *)mapChart {
    // Set new component size
    struct CGRect frame;
    frame = CGRectMake(0, 0, 375, 550);
    [mapChart setFrame:frame];
    // Set gray color border
    [[mapChart layer] setBorderColor: [[UIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:1] CGColor]];
    [[mapChart layer] setBorderWidth: 1.0f];
    
    // Create three toolbars
    UIToolbar *toolBar1 = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 35)] autorelease];
    UIToolbar *toolBar2 = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 30, frame.size.width, 35)] autorelease];
    UIToolbar *toolBar3 = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 60, frame.size.width, 35)] autorelease];
    UIToolbar *toolBar4 = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 90, frame.size.width, 35)] autorelease];
    
    // Add created toolbars
    [self.view addSubview:toolBar1];
    [self.view addSubview:toolBar2];
    [self.view addSubview:toolBar3];
    [self.view addSubview:toolBar4];
    
    // Determine button display settings
    NSDictionary *appearSettings = [NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@&quot;Arial&quot; size:14], UITextAttributeFont, nil];
    // Create required buttons
    UIBarButtonItem *toFitButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;ToFit&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(toFit)] autorelease];
    [toFitButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *invButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;Invalidate&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(invalidate)] autorelease];
    [invButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *invOverlayButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;InvalidateOverlay&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(invalidateOverlay)] autorelease];
    [invOverlayButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *showAllLabelsButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;ShowLabels&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(showAllLabels)] autorelease];
    [showAllLabelsButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *hideAllLabelsButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;HideLabels&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(hideAllLabels)] autorelease];
    [hideAllLabelsButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *resetButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;ResetTimeline&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(reset)] autorelease];
    [resetButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;Back&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(back)] autorelease];
    [backButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *forwardButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;Forward&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(forward)] autorelease];
    [forwardButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *abortButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;Abort&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(abort)] autorelease];
    [abortButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    UIBarButtonItem *stopButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@&quot;Stop&quot;, nil) style:UIBarButtonItemStyleBordered target:self action:@selector(stop)] autorelease];
    [stopButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
    
    // Add buttons to toolbars
    [toolBar1 setItems: [NSArray arrayWithObjects: toFitButton,invButton,invOverlayButton, nil]];
    [toolBar2 setItems: [NSArray arrayWithObjects: showAllLabelsButton,hideAllLabelsButton, nil]];
    [toolBar3 setItems: [NSArray arrayWithObjects: forwardButton, backButton, resetButton, nil]];
    [toolBar4 setItems: [NSArray arrayWithObjects: abortButton, stopButton, nil]];
}
// Places map by center and zooms it to fit the screen
- (void) toFit
{
    [m_view sizeContentToFit];
}
// Fully redraws map
- (void) invalidate
{
    [m_view invalidate];
}
// Fully redraws map layers
- (void)invalidateOverlay
{
    [m_view invalidateOverlay];
}
// Resets all timeline data and reloads it from data source
- (void)reset
{
    [m_view.timeAxis reset];
}
// Moves timeline slider forward
- (void)back
{
    [m_view.timeAxis stepBackward];
}
//Moves timeline slider backward
- (void)forward
{
    [m_view.timeAxis stepForward];
}
// Aborts timeline animation playback
- (void)abort
{
    [m_view.timeAxis abort];
}
// Stops timeline animation playback
-(void) stop {
    [m_view.timeAxis stop];
}
// Displays labels for all map layer areas
- (void)showAllLabels
{
    // Create a label for map layer areas
    MapLabel *label = [MapLabel new];
    // Make label visible
    label.visibility = YES;
    label.font = [UIFont fontWithName:@&quot;Arial&quot; size:14];
    // Set mask
    label.maskText = @&quot;%@&quot;;
    label.maxWidth = 150.0;
    label.minWidth = 100.0;
    label.textColor = [UIColor blackColor];
    label.textWrapping = TextWrappingNoWrap;
    // Set tag for all map layer areas
    MapLayer *currentLayer = [[m_view layers] objectAtIndex:0];
    NSArray *shapes = [currentLayer shapesInRect:[currentLayer bounds]];
    for (MapShape *shape in shapes) {
        NSString *shapeId = [shape ID];
        if ([shapeId  isEqual: @&quot;AU&quot;] || [shapeId  isEqual: @&quot;RU&quot;] || [shapeId  isEqual: @&quot;US&quot;]) {
            [shape setLabel: label];
        }
    }
    [label autorelease];
    // Rerender map
    [self toFit];
}
// Removes labels of all map layer areas
- (void)hideAllLabels {
    // Remove labels of all map layer areas
    NSArray *shapes = [[m_view.layers objectAtIndex:0] allShapes];
    for (MapShape *shape in shapes) {
        [shape setLabel: NULL];
    }
    // Fully redraw map
    [self toFit];
}
// Called after map layer area touch
- (void) mapChart:(MapChart2D *)mapChart touchDownInShape:(MapShape *)shape {
    /* Zoom and scroll
    for displaying the specified map layer area with animation playback */
    [mapChart zoomToShape:shape animated:YES];
    // Display tooltip for map layer area
    [m_view showPopupInShape:shape];
    // Fully redraw map
    [mapChart invalidate];
}
@end

See also:

Setting Up Legend Parameters