Описание: создание карты с временной осью, данные для которой загружаются из файла.
#import <MapCharting/MapChart.h>
#import <MapCharting/MapChart2D.h>
#import "MapDataSource.h"
@interface ViewController : UIViewController<MapChartDelegate>{
MapChart2D *m_view; // Двумерная карта
MapDataSource *datasource; // Источник данных
}
@end
#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];
// Создаём объект для работы со слоем карты
MapLayer *layer = [topobase rootLayer];
// Создаём всплывающую подсказку для слоя
layer.tooltip = [MapTooltip new];
// Устанавливаем объект для работы с топоосновой карты
[m_view setTopobase:[layer topobase]];
// Устанавливаем объект, содержащий методы для работы с картой
[m_view setDelegate: self];
// Определяем аффинное преобразование, применяемое ко всем областям карты
[[m_view topobase] setTransform: CGAffineTransformIdentity];
// Создаём объект для работы с картографическим показателем
MapAreaVisual *visual = [[MapAreaVisual alloc] init];
/* Устанавливаем признак того, что параметры заливки фона областей карты
зависят от источника данных */
DataDependency *dataDependency = [DataDependency dependency];
[dataDependency setIsDependent:YES];
// Устанавливаем источник данных
[visual setDataSource: datasource];
[dataDependency setDataSource:datasource];
// Задаём цвета для заливки фона областей слоя карты
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];
// Получаем легенду карты
MapLegend *legend = [m_view legend];
// Отображаем легенду
[legend setVisibility: YES];
// Устанавливаем шкалу
[legend setValueScale: scale];
// Выравниваем легенду по центру карты
[legend setBlockAlignment: NWLegendBlockAlignmentBottomCenter];
// Устанавливаем отступы для легенды
Thickness margin = {0,20,0,0};
[legend setMargin:margin];
// Устанавливаем цвет текста и параметры шрифта легенды
[legend setTextColor:[UIColor darkGrayColor]];
[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];
// Устанавливаем формат записи промежуточного интервала
NSString *betweenFormat = [NSMutableString stringWithString:NSLocalizedString(@"BETWEEN_FORMAT", nil)];
[legend setBetweenFormat:betweenFormat];
// Разрешаем отображение отношений равенства в легенде
[legend setShowEquals: YES];
NSString *equalFormat = [NSMutableString stringWithString:NSLocalizedString(@"EQUAL_FORMAT", nil)];
[legend setEqualFormat: equalFormat];
// Создаём верхний текст легенды
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];
// Создаём и устанавливаем нижний текст легенды
MapLabel *footer = [MapLabel new];
[footer setText: NSLocalizedString(@"FOOTER_TEXT", nil)];
// Устанавливаем отступы текста
Thickness footerMargin = [footer margin];
footerMargin.top = 80;
footerMargin.left = -60;
[footer setMargin:footerMargin];
[legend setFooter: footer];
// Устанавливаем форму маркеров для легенды карты
[legend setMarkerShape: MarkerShapeRhombus];
// Задаём ориентацию легенды
[legend setOrientation: NWLegendOrientationFreeVertical];
// Устанавливаем позицию легенды
CGPoint pt = {[m_view legend].origin.x, 375};
[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];
/* Добавляем объект для работы с картографическим показателем
в массив визуальных элементов, соответствующих дочерним слоям и областям
*/
[[layer visuals] addObject: visual];
// Добавляем слой карты в массив отображаемых слоёв
[[m_view layers] addObject:layer];
[self setView: m_view];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear: animated];
[self mapChartDidAppear: m_view];
}
- (void)mapChartDidAppear:(MapChart *)mapChart {
// Устанавливаем новые размеры компонента
struct CGRect frame;
frame = CGRectMake(0, 0, 375, 550);
[mapChart setFrame:frame];
// Устанавливаем рамку серого цвета
[[mapChart layer] setBorderColor: [[UIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:1] CGColor]];
[[mapChart layer] setBorderWidth: 1.0f];
// Создаём три панели инструментов
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];
// Добавляем созданные панели
[self.view addSubview:toolBar1];
[self.view addSubview:toolBar2];
[self.view addSubview:toolBar3];
[self.view addSubview:toolBar4];
// Определяем настройки отображения кнопок
NSDictionary *appearSettings = [NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"Arial" size:14], UITextAttributeFont, nil];
// Создаём необходимые кнопки
UIBarButtonItem *toFitButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"ToFit", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(toFit)] autorelease];
[toFitButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *invButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Invalidate", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(invalidate)] autorelease];
[invButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *invOverlayButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"InvalidateOverlay", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(invalidateOverlay)] autorelease];
[invOverlayButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *showAllLabelsButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"ShowLabels", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(showAllLabels)] autorelease];
[showAllLabelsButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *hideAllLabelsButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"HideLabels", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(hideAllLabels)] autorelease];
[hideAllLabelsButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *resetButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"ResetTimeline", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(reset)] autorelease];
[resetButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Back", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(back)] autorelease];
[backButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *forwardButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Forward", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(forward)] autorelease];
[forwardButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *abortButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Abort", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(abort)] autorelease];
[abortButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
UIBarButtonItem *stopButton = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Stop", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(stop)] autorelease];
[stopButton setTitleTextAttributes:appearSettings forState:UIControlStateNormal];
// Добавляем кнопки на панели инструментов
[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]];
}
// Располагает карту по центру и масштабирует её на весь экран
- (void) toFit
{
[m_view sizeContentToFit];
}
// Выполняет полную перерисовку карты
- (void) invalidate
{
[m_view invalidate];
}
// Выполняет полную перерисовку слоёв карты
- (void)invalidateOverlay
{
[m_view invalidateOverlay];
}
// Сбрасывает все данные оси и заново загружает их из источника
- (void)reset
{
[m_view.timeAxis reset];
}
// Перемещает ползунок вперёд по оси
- (void)back
{
[m_view.timeAxis stepBackward];
}
// Перемещает ползунок назад по оси
- (void)forward
{
[m_view.timeAxis stepForward];
}
// Прерывает воспроизведение анимации временной оси
- (void)abort
{
[m_view.timeAxis abort];
}
// Останавливает воспроизведение анимации временной оси
-(void) stop {
[m_view.timeAxis stop];
}
// Отображает подписи для всех областей слоя карты
- (void)showAllLabels
{
// Создаём подпись для областей слоя карты
MapLabel *label = [MapLabel new];
// Делаем метку видимой
label.visibility = YES;
label.font = [UIFont fontWithName:@"Arial" size:14];
// Устанавливаем маску
label.maskText = @"%@";
label.maxWidth = 150.0;
label.minWidth = 100.0;
label.textColor = [UIColor blackColor];
label.textWrapping = TextWrappingNoWrap;
// Устанавливаем метку для всех областей слоя карты
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: @"AU"] || [shapeId isEqual: @"RU"] || [shapeId isEqual: @"US"]) {
[shape setLabel: label];
}
}
[label autorelease];
// Выполняем полную перерисовку карты
[self toFit];
}
// Удаляет подписи у всех областей слоя карты
- (void)hideAllLabels {
// Удаляем подписи у всех областей слоя карты
NSArray *shapes = [[m_view.layers objectAtIndex:0] allShapes];
for (MapShape *shape in shapes) {
[shape setLabel: NULL];
}
// Выполняем полную перерисовку карты
[self toFit];
}
// Вызывается после касания области слоя карты
- (void) mapChart:(MapChart2D *)mapChart touchDownInShape:(MapShape *)shape {
/* Изменяем масштаб и выполняем прокрутку
для отображения указанной области слоя карты с воспроизведением анимации */
[mapChart zoomToShape:shape animated:YES];
// Отображаем подсказку для области слоя карты
[m_view showPopupInShape:shape];
// Выполняем полную перерисовку карты
[mapChart invalidate];
}
@end
См. также: