Параметры карты

Описание: карта строится по полученным данным, содержит две стрелки и три всплывающие подсказки.

Файл «ViewController.h»

#import <MapCharting/MapChart.h>
#import <MapCharting/MapChart2D.h>
#import "MapDataSource.h"
@interface ViewController : UIViewController<MapChartDelegate>{
    MapChart2D *m_view; // Двумерная карта
    MapDataSource *datasource; // Источник данных
}
@end

Файл «ViewController.m»

#import "ViewController.h"
#import <MapCharting/MapTopobase.h>
#import <MapCharting/MapAreaVisual.h>
#import "SolidColorBrush.h"
#import "DataDependency.h"
#import <MapCharting/MapTooltip.h>
#import <MapCharting/MapLabel.h>
#import <MapCharting/MapLegend.h>
#import <MapCharting/MapShape.h>
#import "UIColor+transition.h"
#import <MapCharting/MapLabel.h>
#import <MapCharting/MapChartSign.h>
#import <MapCharting/MapArrow.h>
#import <MapCharting/MapFilledArrow.h>
#import <MapCharting/MapBarVisual.h>
#import <MapCharting/MapPieVisual.h>
#import "UIColor+hex.h"
@implementation ViewController
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Загружаем данные из источника
    datasource = [[MapDataSource alloc]initWithFileName:@"data.txt"];
    // Определяем минимальное и максимальное значения данных
    [datasource prepare];
    // Создаём карту на основе загруженных данных
    [self dataSourceFinishedLoadData];
}
// Создаёт карту на основе загруженных данных
- (void)dataSourceFinishedLoadData
{
    // Создаём двумерную карту
    m_view = [[MapChart2D alloc] init];
    // Загружаем файл с топоосновой
    NSData *file = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"world.svg" ofType:nil]];
    // Создаём объект для работы с топоосновой карты
    MapTopobase *topobase = [[MapTopobase alloc] initWithData:file];
    if([MapTopobase isSVG:file]) {
        NSLog(@"Топооснова карты имеет SVG-формат");
        } else {
        NSLog(@"Топооснова карты не имеет SVG-формат");
    }
    // Создаём объект для работы со слоем карты
    MapLayer *layer = [topobase rootLayer];
    // Создаём всплывающую подсказку для слоя
    layer.tooltip = [MapTooltip new];
    // Устанавливаем объект для работы с топоосновой карты
    [m_view setTopobase:[layer topobase]];
    // Устанавливаем объект, содержащий методы для работы с картой
    [m_view setDelegate:  self];
    // Определяем аффинное преобразование, применяемое ко всем областям карты
    [[m_view topobase] setTransform: CGAffineTransformIdentity];
    
    [m_view setClipsToBounds:YES];
    // Разрешаем масштабирование карты
    [m_view setZoomEnabled:YES];
    // Разрешаем автоматическое скрытие легенды
    [m_view setAutoHideLegend: YES];
    
    // Создаём объект для работы с картографическим показателем
    MapAreaVisual *visual = [[MapAreaVisual alloc] init];
    /* Устанавливаем признак того, что параметры заливки фона областей карты
    зависят от источника данных */
    DataDependency *dataDependency = [DataDependency dependency];
    [dataDependency setIsDependent:YES];
    // Устанавливаем источник данных
    [visual setDataSource: datasource];
    [dataDependency setDataSource:datasource];
    
    // Создаём подпись для областей слоя карты
    MapLabel *label = [MapLabel new];
    // Скрываем подпись
    label.visibility = NO;
    label.font = [UIFont fontWithName:@"Arial" size:16];
    // Значение задаётся автоматически и содержит наименование области слоя карты
    label.text = @"";
    label.maxWidth = 150.0;
    label.minWidth = 100.0;
    label.textColor = [UIColor blackColor];
    label.textWrapping = TextWrappingNoWrap;
    // Устанавливаем подпись для слоя
    [layer setLabel: label];
    // Устанавливаем границу областей слоя карты
    [layer setStrokeThickness: 1.0];
    [layer setStrokeColor: [UIColor darkGrayColor]];
    
    // Задаём цвета для заливки фона областей слоя карты
    NSArray *colors = [NSArray arrayWithObjects:@"ff462c", @"ebaf36", @"ffd900", @"b1ca40", @"6a8535", nil];
    // Определяем минимальное значение карты
    double value = [datasource minValue];
    // Определяем шаг для шкалы карты
    double step = (datasource.maxValue - datasource.minValue) / [colors count];
    // Определяем соответствие между интервалами шкалы карты и цветами заливки фона областей слоя
    ValueScale *scale = [[ValueScale new] autorelease];
    for (int i = 1; i <[colors count]; i++) {
        value += step;
        [scale.value addObject:[NSNumber numberWithDouble:value]];
        // Определяем цвета для значения «меньше»
        UIColor *lessColor = [UIColor colorWithHex:[colors objectAtIndex:(i - 1)]];
        [scale.less addObject:[SolidColorBrush solidColorBrushWithColor:lessColor]];
        // Определяем цвета для значения «равно» или «больше»
        UIColor *equalColor = [UIColor colorWithHex:[colors objectAtIndex:(i)]];
        [scale.equal addObject:[SolidColorBrush solidColorBrushWithColor:equalColor]];
        [scale.greater addObject:[SolidColorBrush solidColorBrushWithColor:equalColor]];
    }
    // Устанавливаем шкалу карты
    [dataDependency setScale:scale];
    [visual setBackground:dataDependency];
    
    // Устанавливаем кисть для заливки фона карты
    UIColor *backgroundColor = [[[Brush new] autorelease] mainColor];
    [m_view setBackground:[SolidColorBrush solidColorBrushWithColor:backgroundColor]];
    // Устанавливаем цвет заголовка карты
    m_view.caption.textColor = [UIColor blackColor];
    
    // Устанавливаем текст подписи для областей слоя карты, для которых отсутствуют данные
    [m_view setNoDataText: NSLocalizedString(@"NO_DATA", nil)];
    // Создаём кисть для заливки областей слоя карты с отсутствующими данными
    SolidColorBrush *brush = [[[SolidColorBrush alloc] init] autorelease];
    // Установим прозрачность кисти
    [brush setOpacity: 0.2];
    // Установим цвет кисти
    [brush setColor: [UIColor grayColor]];
    // Установим данную кисть
    [[[visual background] scale] setNoData: brush];
    
    Thickness th = {0};
    th.top = 30;
    // Определяем текст заголовка
    [[m_view caption] setText: NSLocalizedString(@"WORLD_MAP", nil)];
    // Задаём отступ для заголовка
    [[m_view caption] setMargin: th];
    // Определяем параметры шрифта
    [[m_view caption] setFont:[UIFont systemFontOfSize:18]];
    // Используем направление письма слева направо
    [m_view setUsingRightToLeft: NO];
    
    // Получаем легенду карты
    MapLegend *legend = [m_view legend];
    // Устанавливаем шкалу
    [legend setValueScale: scale];
    // Выравниваем легенду по центру карты
    [legend setBlockAlignment: NWLegendBlockAlignmentBottomCenter];
    // Устанавливаем отступы для легенды
    Thickness margin = {0,20,0,0};
    [legend setMargin:margin];
    // Устанавливаем цвет текста и параметры шрифта легенды
    [legend setTextColor:[UIColor blackColor]];
    [legend setFont:[UIFont systemFontOfSize:12]];
    // Устанавливаем формат записи интервала «меньше»
    NSString *lessFormat = [NSMutableString stringWithString:NSLocalizedString(@"LESS_FORMAT", nil)];
    [legend setLessFormat:lessFormat];
    // Устанавливаем формат записи интервала «больше»
    NSString *greaterFormat = [NSMutableString stringWithString:NSLocalizedString(@"GREATER_FORMAT", nil)];
    [legend setGreaterFormat:greaterFormat];
    
    // Создаём верхний текст легенды
    MapLabel *header = [[MapLabel new] autorelease];
    [header setText: NSLocalizedString(@"HEADER_TEXT", nil)];
    // Устанавливаем параметры шрифта для текста
    [header setFont: [UIFont systemFontOfSize:14]];
    [header setTextColor:[UIColor blackColor]];
    // Устанавливаем отступы текста
    Thickness headerMargin = {5, 0, 0, 0};
    [header setMargin:headerMargin];
    // Устанавливаем верхний текст для легенды
    [[m_view legend] setHeader:header];
    
    // Устанавливаем форму маркеров для легенды карты
    [legend setMarkerShape: MarkerShapeRectangle];
    // Задаём ориентацию легенды
    [legend setOrientation: NWLegendOrientationFreeVertical];
    // Устанавливаем позицию легенды
    CGPoint pt = {[m_view legend].origin.x, 325};
    [legend setOrigin: pt];
    
    // Получаем временную шкалу
    MapTimeAxis *timeAxis = [m_view timeAxis];
    // Отображаем временную шкалу
    [timeAxis setHidden: NO];
    // Устанавливаем объект, содержащий методы для работы со шкалой
    [timeAxis setDelegate: m_view];
    // Устанавливаем источник данных
    [timeAxis setDataSource:datasource];
    // Настраиваем задержку анимации
    [timeAxis setDelayTime: AnimateTypeSlow];
    // Задаём параметры шрифта для временной шкалы
    [timeAxis setFont:[UIFont fontWithName:@"Arial" size:16]];
    // Задаём минимальное расстояние в точках между двумя соседними делениями оси
    [timeAxis setMinTickSpacing:1.0];
    // Устанавливаем для делений шкалы синий цвет
    [timeAxis setTickColor: [UIColor blueColor]];
    /* Устанавливаем длительность перемещения от одного значения оси
    к другому во время воспроизведения анимации */
    [timeAxis setJumpTime: AnimateTypeNormal];
    // Устанавливаем текущее положение ползунка шкалы
    [timeAxis setIndex:0];
    // Создаём и отображаем подпись над текущим положением ползунка шкалы
    MapTooltip *caption = [[MapTooltip new] autorelease];
    [caption setVisibility:YES];
    [timeAxis setLabel: caption];
    
    // Создаём круговой показатель
    MapPieVisual *pieVisual = [MapPieVisual new];
    // Указываем источник данных
    [pieVisual setDataSource:datasource];
    pieVisual.maxPiesCount = 6;
    // Устанавливаем радиус кругового показателя
    pieVisual.radius.value = [NSNumber numberWithDouble:20.0];
    // Устанавливаем минимальный радиус
    pieVisual.leastRadiusPart = 10.0;
    pieVisual.isProportional = NO;
    // Устанавливаем толщину границы
    pieVisual.borderThickness = 1.0;
    pieVisual.borderColor.value = [UIColor blackColor];
    
    // Создаём столбиковый показатель
    MapBarVisual *barVisual = [MapBarVisual new];
    // Указываем источник данных
    [barVisual setDataSource:datasource];
    // Устанавливаем расстояние между столбиками
    barVisual.barDistance = 1.0;
    // Определяем толщину границы
    barVisual.borderThickness = 1.0;
    // Устанавливаем минимальную высоту столбца
    barVisual.leastHeightPart = 1.0;
    // Устанавливаем минимальную ширину столбца
    barVisual.leastWidthPart = 1.0;
    // Устанавливаем процентное соотношение столбцов
    barVisual.isPercentage = NO;
    // Определяем цвет границы столбца
    barVisual.borderColor.value = [UIColor whiteColor];
    // Определяем максимальное количество столбцов
    barVisual.maxBarsCount = 6;
    barVisual.height.isDependent = YES;
    barVisual.width.isDependent = YES;
    
    // Отображаем показатели на карте
    [layer.visuals addObject:pieVisual];
    [layer.visuals addObject:barVisual];
    [layer.visuals addObject: visual];
    [m_view setShowCharts:YES];
    
    barVisual.height.scale.value = visual.background.scale.value;
    barVisual.height.scale.less = visual.background.scale.value;
    barVisual.height.scale.equal = visual.background.scale.value;
    barVisual.height.scale.greater = visual.background.scale.value;
    barVisual.background.scale.value = visual.background.scale.value;
    barVisual.background.scale.less = visual.background.scale.less;
    barVisual.background.scale.equal = visual.background.scale.equal;
    barVisual.background.scale.greater = visual.background.scale.greater;
    pieVisual.background.scale.value = visual.background.scale.value;
    pieVisual.background.scale.less = visual.background.scale.less;
    pieVisual.background.scale.equal = visual.background.scale.equal ;
    pieVisual.background.scale.greater = visual.background.scale.greater;
    
    /* Добавляем объект для работы с картографическим показателем
    в массив визуальных элементов, соответствующих дочерним слоям и областям
    */
    [[layer visuals] addObject: visual];
    // Добавляем слой карты в массив отображаемых слоёв
    [[m_view layers] addObject:layer];
    [self setView: m_view];
    // Выполняем пользовательский пример
    [self executeExample];
}
// Выполняет пользовательский пример, размещённый в теле данного метода
-(void) executeExample {
    
};
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear: animated];
    [self mapChartDidAppear: m_view];
}
// Вызывается после касания области слоя карты
- (void) mapChart:(MapChart2D *)mapChart touchDownInShape:(MapShape *)shape {
    [self mapChart:mapChart touchDownInShapeWithID:[shape ID]];
}
// Вызывается после касания области слоя карты
- (void) mapChart:(MapChart2D *)mapChart touchDownInShapeWithID:(NSString *)shapeId {
    // Получаем область слоя карты по идентификатору
    MapShape *shape = [[[mapChart layers] objectAtIndex:0] shapeWithId:shapeId];
    /* Изменяем масштаб и выполняем прокрутку
    для отображения указанной области слоя карты с воспроизведением анимации */
    [mapChart zoomToShape:shape animated:YES];
    // Отображаем подсказку для области слоя карты
    [m_view showPopupInShape:shape];
    // Выполняем полную перерисовку карты
    [mapChart invalidate];
}
- (void)mapChartDidAppear:(MapChart *)mapChart {
    // Устанавливаем новые размеры компонента
    struct CGRect frame;
    frame = CGRectMake(0, 0, 375, 470);
    [mapChart setFrame:frame];
    // Устанавливаем рамку серого цвета
    [[mapChart layer] setBorderColor: [[UIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:1] CGColor]];
    [[mapChart layer] setBorderWidth: 1.0f];
}
// Вызывается после изменения индекса временной шкалы
-(void)mapChart:(MapChart *)mapChart setDoubleTimeAxisIndex:(double)idx {
    // Определяем прозрачность карты в зависимости от текущего индекса шкалы
    double coef = idx - floor(idx);
    double alpha = 1 - coef;
    if (coef > 0.5) {
        alpha = coef;
    }
    // Устанавливаем новое значение прозрачности карты
    [mapChart setAlpha:alpha];
    // Выполняем полную перерисовку слоёв карты
    [mapChart invalidateOverlay];
}
@end

См. также:

Создание столбиковых и круговых показателей на карте