Описание: карта строится по полученным данным, содержит две стрелки и три всплывающие подсказки.
#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];
[m_view setTopobase: topobase];
// Определяем аффинное преобразование, применяемое ко всем областям карты
[topobase setTransform: CGAffineTransformIdentity];
[m_view setClipsToBounds:YES];
// Запрещаем масштабирование карты
[m_view setZoomEnabled:NO];
// Создаём объект для работы с картографическим показателем
MapAreaVisual *visual = [[MapAreaVisual alloc] init];
// Устанавливаем источник данных
[visual setDataSource: datasource];
/* Устанавливаем признак того, что параметры заливки фона областей карты
зависят от источника данных */
[[visual background] setIsDependent:YES];
// Создаём объект для работы со слоем карты
MapLayer *layer = [[m_view topobase] rootLayer];
// Создаём всплывающую подсказку для слоя
layer.tooltip = [MapTooltip new];
// Задаём цвета для заливки фона областей слоя карты
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]];
}
// Устанавливаем шкалу карты
[[visual background] setScale:scale];
// Устанавливаем кисть для заливки фона карты
[m_view setBackground:[SolidColorBrush solidColorBrushWithColor:[UIColor whiteColor]]];
// Устанавливаем цвет заголовка карты
m_view.caption.textColor = [UIColor blackColor];
// Устанавливаем текст подписи для областей слоя карты, для которых отсутствуют данные
[m_view setNoDataText: NSLocalizedString(@"NO_DATA", nil)];
// Создаём кисть для заливки областей слоя карты с отсутствующими данными
SolidColorBrush *brush = [[[SolidColorBrush alloc] init] autorelease];
// Установим прозрачность кисти
[brush setOpacity: 0.2];
// Установим цвет кисти
brush.color = [UIColor grayColor];
// Установим данную кисть
[[[visual background] scale] setNoData: brush];
Thickness th = {0};
th.top = 20;
th.bottom = 20;
// Определяем текст заголовка
[[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 setVisibility:NO];
// Получаем временную шкалу
MapTimeAxis *timeAxis = [m_view timeAxis];
// Скрываем временную шкалу
[timeAxis setHidden: YES];
// Создаём стрелку между регионами
MapArrow *arrow1 = [MapArrow new];
// Устанавливаем текст подписи
arrow1.text = NSLocalizedString(@"MAP_ARROW_1", nil);;
// Устанавливаем цвет текста подписи
arrow1.textColor = [UIColor blackColor];
// Устанавливаем цвет заливки
SolidColorBrush *br = [SolidColorBrush new];
[br setColor:[UIColor lightGrayColor]];
// Устанавливаем фон надписи
arrow1.textBackground = br;
// Задаём семейство шрифтов
arrow1.fontName = @"Arial";
// Устанавливаем размер шрифта
arrow1.fontSize = 15.0;
// Задаём область карты, в которой начинается стрелка
arrow1.startShape = [layer shapeWithId:@"US"];
// Задаём область карты, в которой заканчивается стрелка
arrow1.endShape = [layer shapeWithId:@"RU"];
// Устанавливаем угол изгиба стрелки
arrow1.angle = 0;
// Устанавливаем цвет линии границы
arrow1.strokeColor = [UIColor blackColor];
// Устанавливаем толщину линии границы
arrow1.strokeThickness = 1.0;
// Задаём тип линии границы
arrow1.strokeStyle = StrokeStyleSolid;
// Устанавливаем ширину указателя стрелки
[arrow1 setPointerWidth:10];
// Устанавливаем длину указателя стрелки
[arrow1 setPointerLength:20];
CGPoint start = {100.0,50.0};
arrow1.startPoint = start; // Точка карты, в которой начинается стрелка
CGPoint end = {300.0,450.0};
arrow1.endPoint = end; // Точка карты, в которой заканчивается стрелка
// Стрелка между точками карты
MapFilledArrow *arrow2 = [MapFilledArrow new];
arrow2.base = 10;
arrow2.fill = br;
// Устанавливаем текст подписи
arrow2.text = NSLocalizedString(@"MAP_ARROW_2", nil);
// Устанавливаем цвет текста подписи
arrow2.textColor = [UIColor blackColor];
arrow2.textAlignment = UITextAlignmentCenter;
arrow2.textOrientation = TextOrientationAlongTheArrow;
// Задаём цвет кисти
[br setColor:[UIColor lightGrayColor]];
// Устанавливаем фон подписи
arrow2.textBackground = [br autorelease];
CGPoint st = {100.0,50.0};
// Устанавливаем точку карты, в которой начинается стрелка
arrow1.startPoint = st;
CGPoint en = {300.0,450.0};
// Устанавливаем точку карты, в которой заканчивается стрелка
arrow2.endPoint = en;
// Задаём угол изгиба стрелки
arrow2.angle = 10;
// Устанавливаем цвет линии границы
arrow2.strokeColor = [UIColor blackColor];
// Устанавливаем толщину линии границы
arrow2.strokeThickness = 2.0;
// Задаём тип линии границы
arrow2.strokeStyle = StrokeStyleSolid;
// Устанавливаем ширину указателя стрелки
[arrow2 setPointerWidth:30];
// Устанавливаем длину указателя стрелки
[arrow2 setPointerLength:50];
// Создаём массив стрелок
NSArray *arrows = [NSArray arrayWithObjects:arrow1,arrow2, nil];
[m_view setArrows:arrows];
// Отображаем стрелки
[m_view setShowArrows:YES];
// Создаём подсказки для для областей карты
NSArray *countries = [NSArray arrayWithObjects:@"AU", @"CN", @"RU", nil];
for(int i = 0; i < [countries count]; i++) {
MapShape *shape = [layer shapeWithId: [countries objectAtIndex:i]];
shape.strokeColor = [UIColor darkGrayColor];
shape.strokeThickness = 2.0;
MapTooltip *tip = [MapTooltip new];
tip.visibility = YES;
tip.text = shape.title;
tip.font = [UIFont fontWithName:@"Arial" size:14];
tip.background = [SolidColorBrush solidColorBrushWithColor:[UIColor whiteColor]];
tip.borderColor = [UIColor blackColor];
tip.borderThickness = 1.0;
tip.borderRadius = 3.0;
Thickness pad = {2.0,2.0,2.0,2.0};
tip.padding = pad;
shape.tooltip = tip;
}
/* Добавляем объект для работы с картографическим показателем
в массив визуальных элементов, соответствующих дочерним слоям и областям */
[[layer visuals] addObject: visual];
// Добавляем слой карты в массив отображаемых слоёв
[[m_view layers] addObject:layer];
[self setView:m_view];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Устанавливаем новые размеры карты
struct CGRect frame;
frame = CGRectMake(0, 0, 375, 470);
[m_view setFrame:frame];
// Устанавливаем рамку серого цвета
[[m_view layer] setBorderColor: [[UIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:1] CGColor]];
[[m_view layer] setBorderWidth: 1.0f];
}
- (void)mapChartDidAppear:(MapChart *)mapChart {
}
@end
См. также: