Фигуры

Выберите платформу: Android iOS JavaScript

Maps SDK для iOS позволяет добавлять на карты различные фигуры. Поддерживаются следующие фигуры:

  • Ломаная линия – это серия соединенных отрезков, из которых можно составить любую фигуру. С их помощью можно отмечать пути и маршруты на карте.
  • Многоугольник – это замкнутая фигура, используемая для обозначения областей на карте.
  • Круг – это географически точная проекция круга на земную поверхность.

Внешний вид любой фигуры можно изменить разными способами.

Ломаные линии

Ломаные линии позволяют прорисовывать линии на карте. Объект GMSPolyline представляет собой упорядоченную последовательность точек, отображаемую в виде набора отрезков. Цвет ломаной линии можно задать с помощью GMSStrokeStyle.

Чтобы создать ломаную линию, необходимо указать ее контур, создав соответствующий объект GMSMutablePath с двумя или более точками. Каждый объект CLLocationCoordinate2D представляет собой точку на земной поверхности. Точки соединяются прямыми линиями в том порядке, в каком они были добавлены в маршрут. Добавить точки в контур можно с помощью методов addCoordinate: или addLatitude:longitude:.

Swift

let path = GMSMutablePath()
path.add(CLLocationCoordinate2D(latitude: -33.85, longitude: 151.20))
path.add(CLLocationCoordinate2D(latitude: -33.70, longitude: 151.40))
path.add(CLLocationCoordinate2D(latitude: -33.73, longitude: 151.41))
let polyline = GMSPolyline(path: path)
      

Objective-C

GMSMutablePath *path = [GMSMutablePath path];
[path addCoordinate:CLLocationCoordinate2DMake(-33.85, 151.20)];
[path addCoordinate:CLLocationCoordinate2DMake(-33.70, 151.40)];
[path addCoordinate:CLLocationCoordinate2DMake(-33.73, 151.41)];
GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
      

Добавление ломаной линии

  1. Создайте объект GMSMutablePath.
  2. Задайте точки на пути с помощью методов addCoordinate: или addLatitude:longitude:.
  3. Создайте новый экземпляр объекта GMSPolyline, используя путь в качестве аргумента.
  4. При необходимости задайте другие свойства, например strokeWidth и strokeColor.
  5. Задайте свойство map для GMSPolyline.
  6. Фигура появится на карте.

В следующем фрагменте кода показано, как добавлять на карту прямоугольник.

Swift

let rectanglePath = GMSMutablePath()
rectanglePath.add(CLLocationCoordinate2D(latitude: 37.36, longitude: -122.0))
rectanglePath.add(CLLocationCoordinate2D(latitude: 37.45, longitude: -122.0))
rectanglePath.add(CLLocationCoordinate2D(latitude: 37.45, longitude: -122.2))
rectanglePath.add(CLLocationCoordinate2D(latitude: 37.36, longitude: -122.2))
rectanglePath.add(CLLocationCoordinate2D(latitude: 37.36, longitude: -122.0))

let rectangle = GMSPolyline(path: path)
rectangle.map = mapView
      

Objective-C

GMSMutablePath *rectanglePath = [GMSMutablePath path];
[rectanglePath addCoordinate:CLLocationCoordinate2DMake(37.36, -122.0)];
[rectanglePath addCoordinate:CLLocationCoordinate2DMake(37.45, -122.0)];
[rectanglePath addCoordinate:CLLocationCoordinate2DMake(37.45, -122.2)];
[rectanglePath addCoordinate:CLLocationCoordinate2DMake(37.36, -122.2)];
[rectanglePath addCoordinate:CLLocationCoordinate2DMake(37.36, -122.0)];

GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path];
rectangle.map = mapView;
      

Прямоугольная полилиния

Как удалить ломаную линию

Чтобы удалить ломаную линию с карты, установите для свойства map объекта GMSPolyline значение nil. Вы также можете удалить с карты все наложения (включая ломаные линии и другие фигуры), вызвав метод GMSMapView clear.

Swift

mapView.clear()
      

Objective-C

[mapView clear];
      

Настройка ломаной линии

Объект GMSPolyline предоставляет несколько свойств, позволяющих управлять внешним видом линии. Поддерживаются следующие параметры.

strokeWidth
Ширина всей линии в экранных точках. (значение по умолчанию – 1). Она не масштабируется, т. е. остается одинакова на всех уровнях масштаба карты.
geodesic
Если задано значение YES, рендерить край этой ломаной линии как геодезический. Геодезическая линия представляет собой наиболее краткий путь вдоль земной поверхности. На карте с проекцией Меркатора такая линия имеет форму кривой. Негеодезическая линия рисуется на карте как прямая. Значение по умолчанию – NO.
spans
Используется для указания цвета одного или нескольких сегментов ломаной линии. Свойство spans – это массив объектов GMSStyleSpan. Свойство spans – это предпочтительный способ изменить цвет ломаной линии.
strokeColor
Объект UIColor, определяющий цвет ломаной линии. Значение по умолчанию – blueColor. Если задано свойство spans, то свойство strokeColor игнорируется.

Показанный ниже код соединяет Мельбурн и Перт толстой ломаной линией с геодезической интерполяцией.

Swift

let path = GMSMutablePath()
path.addLatitude(-37.81319, longitude: 144.96298)
path.addLatitude(-31.95285, longitude: 115.85734)
let polyline = GMSPolyline(path: path)
polyline.strokeWidth = 10.0
polyline.geodesic = true
polyline.map = mapView
      

Objective-C

GMSMutablePath *path = [GMSMutablePath path];
[path addLatitude:-37.81319 longitude:144.96298];
[path addLatitude:-31.95285 longitude:115.85734];
GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
polyline.strokeWidth = 10.f;
polyline.geodesic = YES;
polyline.map = mapView;
      

Чтобы изменить ломаную линию после ее добавления на карту, сохраните возможность обращаться к объекту GMSPolyline.

Swift

polyline.strokeColor = .blue
      

Objective-C

polyline.strokeColor = [UIColor blueColor];
      

Как изменить цвет ломаной линии

Ломаные линии отображаются на карте в виде серии сегментов. Вы можете изменить цвет отдельных сегментов или всей линии с помощью свойства spans. Это свойство позволяет точно настраивать цвет ломаной линии, но есть и более простые способы применить один стиль ко всей линии.

В приведенном ниже фрагменте кода с помощью метода spanWithColor: цвет всей линии меняется на красный.

Swift

polyline.spans = [GMSStyleSpan(color: .red)]
      

Objective-C

polyline.spans = @[[GMSStyleSpan spanWithColor:[UIColor redColor]]];
      

Если у вас уже есть доступ к объекту GMSStrokeStyle, вы можете использовать метод spanWithStyle:.

Swift

let solidRed = GMSStrokeStyle.solidColor(.red)
polyline.spans = [GMSStyleSpan(style: solidRed)]
      

Objective-C

GMSStrokeStyle *solidRed = [GMSStrokeStyle solidColor:[UIColor redColor]];
polyline.spans = @[[GMSStyleSpan spanWithStyle:solidRed]];
      

До версии 1.7 Maps SDK для iOS для настройки цвета GMSPolyline использовалось одно свойство – strokeColor. Свойство spans имеет приоритет над свойством strokeColor.

Swift

polyline.strokeColor = .red
      

Objective-C

polyline.strokeColor = [UIColor redColor];
      

Стили

Если в приложении один и тот же цвет обводки применяется несколько раз, может быть полезно определить стиль, который можно использовать повторно. Стили ломаных линий задаются с помощью объекта GMSStrokeStyle. Стиль обводки может быть сплошным цветом или градиентом от одного цвета к другому. Созданный стиль можно применить к объекту GMSStyleSpan с помощью метода spanWithStyle:.

Swift

// Create two styles: one that is solid blue, and one that is a gradient from red to yellow
let solidBlue = GMSStrokeStyle.solidColor(.blue)
let solidBlueSpan = GMSStyleSpan(style: solidBlue)
let redYellow = GMSStrokeStyle.gradient(from: .red, to: .yellow)
let redYellowSpan = GMSStyleSpan(style: redYellow)
      

Objective-C

// Create two styles: one that is solid blue, and one that is a gradient from red to yellow
GMSStrokeStyle *solidBlue = [GMSStrokeStyle solidColor:[UIColor blueColor]];
GMSStyleSpan *solidBlueSpan = [GMSStyleSpan spanWithStyle:solidBlue];
GMSStrokeStyle *redYellow =
    [GMSStrokeStyle gradientFromColor:[UIColor redColor] toColor:[UIColor yellowColor]];
GMSStyleSpan *redYellowSpan = [GMSStyleSpan spanWithStyle:redYellow];
      

Стиль span будет применяться до конца ломаной линии или до тех пор, пока не будет задан новый стиль. Вы можете изменить цвет всей линии, задав для свойства spans ломаной линии одно значение GMSStyleSpan. В примере показано, как применить градиент по всей длине ломаной линии.

Swift

polyline.spans = [GMSStyleSpan(style: redYellow)]
      

Objective-C

polyline.spans = @[[GMSStyleSpan spanWithStyle:redYellow]];
      

Изменение цвета отдельных сегментов линий

Чтобы настроить стиль каждого сегмента ломаной линии по отдельности, создайте массив объектов GMSStyleSpan и передайте его свойству spans. По умолчанию каждый элемент массива задает цвет соответствующего сегмента линии. Если элементов в массиве больше, чем сегментов в строке, лишние элементы будут игнорироваться. Если в массиве меньше элементов, последний элемент GMSStyleSpan описывает цвет оставшейся части строки.

Вы можете использовать цветные блоки и/или градиентные ломаные линии, чтобы указать изменения вдоль ломаной линии, например высоту или скорость. В приведенном ниже фрагменте кода для первых двух сегментов ломаной линии задан красный цвет, а для остальных – градиент от красного к желтому.

Swift

polyline.spans = [
  GMSStyleSpan(style: solidRed),
  GMSStyleSpan(style: solidRed),
  GMSStyleSpan(style: redYellow)
]
      

Objective-C

polyline.spans = @[[GMSStyleSpan spanWithStyle:solidRed],
                   [GMSStyleSpan spanWithStyle:solidRed],
                   [GMSStyleSpan spanWithStyle:redYellow]];
      

Чтобы задать стиль сразу для нескольких сегментов, используйте метод spanWithStyle:segments:. Например, следующий код равнозначен приведенному выше. Длина последнего сегмента GMSStyleSpan всегда игнорируется, поскольку стиль используется для описания остатка строки.

Swift

polyline.spans = [
  GMSStyleSpan(style: solidRed, segments:2),
  GMSStyleSpan(style: redYellow, segments:10)
]
      

Objective-C

polyline.spans = @[[GMSStyleSpan spanWithStyle:solidRed segments:2],
                   [GMSStyleSpan spanWithStyle:redYellow segments:10]];
      

Дробные сегменты

Сегменты также могут быть указаны в виде дробного значения. В результате стиль будет применен к дробному числу сегментов, что может привести к разделению одного сегмента. Каждый GMSStyleSpan начинается сразу после предыдущего. В примере ниже серый цвет начинается с середины второго сегмента и продолжается до середины третьего.

Swift

polyline.spans = [
  GMSStyleSpan(style: solidRed, segments: 2.5),
  GMSStyleSpan(color: .gray),
  GMSStyleSpan(color: .purple, segments: 0.75),
  GMSStyleSpan(style: redYellow)
]
      

Objective-C

polyline.spans = @[[GMSStyleSpan spanWithStyle:solidRed segments:2.5],
                   [GMSStyleSpan spanWithColor:[UIColor grayColor]],
                   [GMSStyleSpan spanWithColor:[UIColor purpleColor] segments:0.75],
                   [GMSStyleSpan spanWithStyle:redYellow]];
      

Как добавить повторяющийся цветовой узор к ломаной линии

Если вы хотите добавить узор к ломаной линии, используйте метод GMSStyleSpans в GMSGeometryUtils. Метод GMSStyleSpans принимает два массива, которые определяют повторяющийся шаблон. Один массив задает стили, которые должны повторяться, а другой определяет интервал повторения. Используя их вместе, можно создать шаблон, который можно применить к любой ломаной линии, независимо от ее длины или количества доступных сегментов.

Например, в приведенном ниже фрагменте кода определяется ломаная линия с чередующимся черно-белым узором. Длина отрезков измеряется в метрах вдоль локсодромии (в проекции Меркатора это прямая линия), поскольку тип задан как kGMSLengthRhumb.

Swift

let styles = [
  GMSStrokeStyle.solidColor(.white),
  GMSStrokeStyle.solidColor(.black)
]
let lengths: [NSNumber] = [100000, 50000]
polyline.spans = GMSStyleSpans(
  polyline.path!,
  styles,
  lengths,
  GMSLengthKind.rhumb
)
      

Objective-C

NSArray *styles = @[[GMSStrokeStyle solidColor:[UIColor whiteColor]],
                    [GMSStrokeStyle solidColor:[UIColor blackColor]]];
NSArray *lengths = @[@100000, @50000];
polyline.spans = GMSStyleSpans(polyline.path, styles, lengths, kGMSLengthRhumb);
      

Текстурированные ломаные линии со спрайтами

Текстурированные ломаные линии позволяют создавать ломаные линии с использованием повторяющегося растрового изображения по вашему выбору. Фигуры отображаются с четким фоновым штрихом, но штамп не усекается по углам линий, что делает их полезными в таких ситуациях, как точки для иллюстрации пешеходных маршрутов.

Текстурированная ломаная линия со спрайтами

Чтобы использовать эту функцию, создайте объект GMSSpriteStyle и задайте его в качестве штампа с помощью свойства stampStyle объекта GMSStrokeStyle.

Swift

let path = GMSMutablePath()
path.addLatitude(-37.81319, longitude: 144.96298)
path.addLatitude(-31.95285, longitude: 115.85734)
let polyline = GMSPolyline(path: path)
polyline.strokeWidth = 20
let image = UIImage(named: "imageFromBundleOrAsset")! // Image could be from anywhere
let stampStyle = GMSSpriteStyle(image: image)
let transparentStampStroke = GMSStrokeStyle.transparentStroke(withStamp: stampStyle)
let span = GMSStyleSpan(style: transparentStampStroke)
polyline.spans = [span]
polyline.map = mapView
      

Objective-C

GMSMutablePath *path = [GMSMutablePath path];
[path addLatitude:-37.81319 longitude:144.96298];
[path addLatitude:-31.95285 longitude:115.85734];
GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
polyline.strokeWidth = 20;

UIImage *image = [UIImage imageNamed:@"imageFromBundleOrAsset"];
GMSStrokeStyle *transparentStampStroke = [GMSStrokeStyle transparentStrokeWithStampStyle:[GMSSpriteStyle spriteStyleWithImage:image]];

GMSStyleSpan *span = [GMSStyleSpan spanWithStyle:transparentStampStroke];
polyline.spans = @[span];
polyline.map = mapView;
      

Текстурированные ломаные линии

Текстурированные ломаные линии позволяют создавать ломаные линии с использованием повторяющейся текстуры по вашему выбору. Фигуры могут быть показаны с прозрачным, сплошным или градиентным фоновым штрихом. Размер текстуры меняется в зависимости от уровня масштабирования. Изображения в начале или конце маршрутов или точек маршрута усекаются при определенных уровнях масштабирования.

Текстурированная ломаная линия

Для этого используется класс GMSTextureStyle, который задается в качестве штампа с помощью свойства stampStyle класса GMSStrokeStyle.

Swift

let path = GMSMutablePath()
path.addLatitude(-37.81319, longitude: 144.96298)
path.addLatitude(-31.95285, longitude: 115.85734)
let polyline = GMSPolyline(path: path)
polyline.strokeWidth = 20
let redWithStamp = GMSStrokeStyle.solidColor(.red)
let image = UIImage(named: "imageFromBundleOrAsset")! // Image could be from anywhere
redWithStamp.stampStyle = GMSTextureStyle(image: image)
let span = GMSStyleSpan(style: redWithStamp)
polyline.spans = [span]
polyline.map = mapView
      

Objective-C

GMSMutablePath *path = [GMSMutablePath path];
[path addLatitude:-37.81319 longitude:144.96298];
[path addLatitude:-31.95285 longitude:115.85734];
GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
polyline.strokeWidth = 20;
GMSStrokeStyle *redWithStamp = [GMSStrokeStyle solidColor:[UIColor redColor]];

UIImage *image = [UIImage imageNamed:@"imageFromBundleOrAsset"]; // Image could be from anywhere
redWithStamp.stampStyle = [GMSTextureStyle textureStyleWithImage:image];

GMSStyleSpan *span = [GMSStyleSpan spanWithStyle:redWithStamp];
polyline.spans = @[span];
polyline.map = mapView;
      

Функции карты

Свойство mapCapabilities в GMSMapView добавляет программную проверку функций, связанных с картой. Это полезно, когда нужно узнать, доступны ли определенные capabilities карты, прежде чем вызывать определенные API. Этот запрос определяет, поддерживаются ли ломаные линии со спрайтами в режиме просмотра карты.

Swift

let path = GMSMutablePath()
path.addLatitude(-37.81319, longitude: 144.96298)
path.addLatitude(-31.95285, longitude: 115.85734)
let polyline = GMSPolyline(path: path)
polyline.strokeWidth = 20
let image = UIImage(named: "imageFromBundleOrAsset")! // Image could be from anywhere
let spans: [GMSStyleSpan]
if (mapView.mapCapabilities.contains(.spritePolylines)) {
  let spriteStyle = GMSSpriteStyle(image: image)
  let stroke = GMSStrokeStyle.transparentStroke(withStamp: spriteStyle)
  spans = [ GMSStyleSpan(style: stroke) ]
} else {
  let stroke = GMSStrokeStyle.solidColor(.clear)
  stroke.stampStyle = GMSTextureStyle(image: image)
  spans = [ GMSStyleSpan(style: stroke) ]
}
polyline.spans = spans
polyline.map = mapView
      

Objective-C

GMSMutablePath *path = [GMSMutablePath path];
[path addLatitude:-37.81319 longitude:144.96298];
[path addLatitude:-31.95285 longitude:115.85734];

UIImage *_Nonnull image = [UIImage imageNamed:@"imageFromBundleOrAsset"]; // Image could be from anywhere

NSArray<GMSStyleSpan *> * spans;
if (mapView.mapCapabilities & GMSMapCapabilityFlagsSpritePolylines) {
  GMSSpriteStyle *spriteStyle = [GMSSpriteStyle spriteStyleWithImage:image];
  GMSStrokeStyle *stroke = [GMSStrokeStyle transparentStrokeWithStampStyle:spriteStyle];
  spans = @[ [GMSStyleSpan spanWithStyle:stroke] ];
} else {
  GMSStrokeStyle *stroke = [GMSStrokeStyle solidColor:UIColor.clearColor];
  stroke.stampStyle = [GMSTextureStyle textureStyleWithImage:image];
  spans = @[ [GMSStyleSpan spanWithStyle:stroke] ];
}

GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
polyline.strokeWidth = 20;
polyline.spans = spans;
polyline.map = mapView;
      

Этот шаблон позволяет подписаться на изменения и реагировать на обновления состояния просмотра карты. Вы также можете реализовать didChangeMapCapabilities на GMSMapViewDelegate, чтобы получать обновления о доступности функций.

Многоугольники

Многоугольники похожи на ломаные линии тем, что состоят из заданной последовательности координат. Многоугольники отличаются тем, что являются замкнутыми фигурами и могут иметь заливку. В Maps SDK для iOS многоугольники определяются классом GMSPolygon.

Добавить на карту многоугольник (GMSPolygon) можно тем же способом, что и ломаную линию (GMSPolyline). Сначала укажите путь, создав соответствующий объект GMSMutablePath и добавив в него точки. формирующие контур многоугольника. Каждый объект CLLocationCoordinate2D представляет собой точку на земной поверхности. Точки соединяются прямыми линиями в том порядке, в каком они были добавлены в путь.

Как добавить многоугольник

  1. Создайте объект GMSMutablePath.
  2. Задайте точки на пути с помощью методов addCoordinate: или addLatitude:longitude:. формирующие контур многоугольника.
  3. Создайте новый экземпляр объекта GMSPolygon, используя путь в качестве аргумента.
  4. При необходимости задайте другие свойства, такие как strokeWidth, strokeColor и fillColor.
  5. Назначьте многоугольник объекту GMSMapView, задав свойство GMSPolygon.map.
  6. Многоугольник появится на карте.

В следующем фрагменте кода показано, как добавлять прямоугольник на карту.

Swift

// Create a rectangular path
let rect = GMSMutablePath()
rect.add(CLLocationCoordinate2D(latitude: 37.36, longitude: -122.0))
rect.add(CLLocationCoordinate2D(latitude: 37.45, longitude: -122.0))
rect.add(CLLocationCoordinate2D(latitude: 37.45, longitude: -122.2))
rect.add(CLLocationCoordinate2D(latitude: 37.36, longitude: -122.2))

// Create the polygon, and assign it to the map.
let polygon = GMSPolygon(path: rect)
polygon.fillColor = UIColor(red: 0.25, green: 0, blue: 0, alpha: 0.05);
polygon.strokeColor = .black
polygon.strokeWidth = 2
polygon.map = mapView
      

Objective-C

// Create a rectangular path
GMSMutablePath *rect = [GMSMutablePath path];
[rect addCoordinate:CLLocationCoordinate2DMake(37.36, -122.0)];
[rect addCoordinate:CLLocationCoordinate2DMake(37.45, -122.0)];
[rect addCoordinate:CLLocationCoordinate2DMake(37.45, -122.2)];
[rect addCoordinate:CLLocationCoordinate2DMake(37.36, -122.2)];

// Create the polygon, and assign it to the map.
GMSPolygon *polygon = [GMSPolygon polygonWithPath:rect];
polygon.fillColor = [UIColor colorWithRed:0.25 green:0 blue:0 alpha:0.05];
polygon.strokeColor = [UIColor blackColor];
polygon.strokeWidth = 2;
polygon.map = mapView;
      

Внешний вид многоугольника можно настроить как до его добавления на карту, так и после.

Удаление многоугольника

Чтобы удалить многоугольник, задайте для его свойства GMSPolygon.map значение nil и отсоедините layer от родительского элемента.

Swift

 polygon.map = nil
 polygon.layer.removeFromSuperLayer()

Objective-C

 polygon.map = nil;
 [polygon.layer removeFromSuperlayer];
 

Круги

Помимо общего класса GMSPolygon, в Maps SDK для iOS также есть класс GMSCircle, позволяющий рисовать круги на поверхности Земли.

Чтобы создать круг, необходимо указать следующие два свойства:

  • position (объект CLLocationCoordinate2D, содержащий координаты центра);
  • radius (радиус в метрах).

Круг затем определяется как набор всех точек на земной поверхности, которые удалены от координат center на расстояние radius. В силу особенностей проекции Меркатора, используемой в Maps API, сфера выглядит на карте, как почти идеальный круг, если располагается в районе экватора, и стремится к эллипсу по мере удаления от экватора.

Добавление круга

В приведенном ниже фрагменте кода показано, как добавлять круг на карту:

Swift

let circleCenter = CLLocationCoordinate2D(latitude: 37.35, longitude: -122.0)
let circle = GMSCircle(position: circleCenter, radius: 1000)
circle.map = mapView
      

Objective-C

CLLocationCoordinate2D circleCenter = CLLocationCoordinate2DMake(37.35, -122.0);
GMSCircle *circle = [GMSCircle circleWithPosition:circleCenter
                                         radius:1000];
circle.map = mapView;
      

Изменить внешний вид круга можно как до, так и после его добавления на карту.

Как настроить круг

Вы можете задать пользовательские цвета и толщину линий, изменив свойства объекта GMSCircle. Поддерживаются следующие параметры.

fillColor
Объект UIColor, определяющий цвет заливки круга. (по умолчанию она прозрачна).
strokeColor
Объект UIColor, определяющий цвет контура окружности. Значение по умолчанию – blackColor.
strokeWidth
Толщина контура круга в экранных точках. (значение по умолчанию – 1). Толщина не меняется при масштабировании.

Показанный ниже код добавляет на карту толстый красный круг с полупрозрачной красной заливкой.

Swift

circle.fillColor = UIColor(red: 0.35, green: 0, blue: 0, alpha: 0.05)
circle.strokeColor = .red
circle.strokeWidth = 5
      

Objective-C

circle.fillColor = [UIColor colorWithRed:0.25 green:0 blue:0 alpha:0.05];
circle.strokeColor = [UIColor redColor];
circle.strokeWidth = 5;
      

Как создать полый многоугольник

В одном объекте GMSPolygon можно объединить несколько контуров. Это позволяет создавать сложные фигуры, в которых одни многоугольники располагаются внутри других подобно островкам (например, кольца с заливкой). Сложные фигуры состоят из нескольких контуров.

Создайте многоугольник с контуром, который определяет наибольшую площадь, покрываемую многоугольником. Затем укажите свойство holes многоугольника в виде массива из одного или нескольких объектов GMSPath, которые определяют отверстия в многоугольнике.

Если меньший контур располагается внутри большего, он будет виден как вырезанный сегмент.

Следующий пример кода демонстрирует создание многоугольника с двумя отверстиями:

Swift

let hydeParkLocation = CLLocationCoordinate2D(latitude: -33.87344, longitude: 151.21135)
let camera = GMSCameraPosition.camera(withTarget: hydeParkLocation, zoom: 16)
let options = GMSMapViewOptions()
options.camera = camera
let mapView = GMSMapView(options: options)
mapView.animate(to: camera)

let hydePark = "tpwmEkd|y[QVe@Pk@BsHe@mGc@iNaAKMaBIYIq@qAMo@Eo@@[Fe@DoALu@HUb@c@XUZS^ELGxOhAd@@ZB`@J^BhFRlBN\\BZ@`AFrATAJAR?rAE\\C~BIpD"
let archibaldFountain = "tlvmEqq|y[NNCXSJQOB[TI"
let reflectionPool = "bewmEwk|y[Dm@zAPEj@{AO"

let hollowPolygon = GMSPolygon()
hollowPolygon.path = GMSPath(fromEncodedPath: hydePark)
hollowPolygon.holes = [GMSPath(fromEncodedPath: archibaldFountain)!, GMSPath(fromEncodedPath: reflectionPool)!]
hollowPolygon.fillColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.2)
hollowPolygon.strokeColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
hollowPolygon.strokeWidth = 2
hollowPolygon.map = mapView
      

Objective-C

CLLocationCoordinate2D hydeParkLocation = CLLocationCoordinate2DMake(-33.87344, 151.21135);
GMSCameraPosition *camera = [GMSCameraPosition cameraWithTarget:hydeParkLocation
                                                           zoom:16];
GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init];
options.camera = camera;
mapView = [[GMSMapView alloc] initWithOptions:options];

NSString *hydePark = @"tpwmEkd|y[QVe@Pk@BsHe@mGc@iNaAKMaBIYIq@qAMo@Eo@@[Fe@DoALu@HUb@c@XUZS^ELGxOhAd@@ZB`@J^BhFRlBN\\BZ@`AFrATAJAR?rAE\\C~BIpD";
NSString *archibaldFountain = @"tlvmEqq|y[NNCXSJQOB[TI";
NSString *reflectionPool = @"bewmEwk|y[Dm@zAPEj@{AO";

GMSPolygon *hollowPolygon = [[GMSPolygon alloc] init];
hollowPolygon.path = [GMSPath pathFromEncodedPath:hydePark];
hollowPolygon.holes = @[[GMSPath pathFromEncodedPath:archibaldFountain],
                  [GMSPath pathFromEncodedPath:reflectionPool]];
hollowPolygon.fillColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:0.2];
hollowPolygon.strokeColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];
hollowPolygon.strokeWidth = 2;
hollowPolygon.map = mapView;