形狀

選取平台: Android iOS JavaScript

Maps SDK for 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. 視需要設定其他屬性,例如 strokeWidthstrokeColor
  5. 設定 GMSPolylinemap 屬性。
  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;
      

矩形多段線

移除折線

您可以將 GMSPolylinemap 屬性設為 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]];
      

在 Maps SDK for iOS 1.7 版之前,您可以使用單一屬性 strokeColor 設定 GMSPolyline 的整個顏色。spans 屬性的優先順序高於 strokeColor

Swift

polyline.strokeColor = .red
      

Objective-C

polyline.strokeColor = [UIColor redColor];
      

風格

如果應用程式多次套用相同的筆劃顏色,定義可重複使用的樣式可能會很有幫助。折線樣式則是使用 GMSStrokeStyle 物件指定。筆劃樣式可以是單色,也可以是不同顏色的漸層。建立樣式後,您可以使用 spanWithStyle: 方法將其套用至 GMSStyleSpan

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 都從上一個片段之後開始:在以下範例中,灰色顏色從 1⁄2 開始到第二個片段,然後繼續到第 1⁄2 到第三個片段。

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]];
      

在折線中加入重複的色彩模式

如要在折線中新增模式,您可以在 GMSGeometryUtils 中使用 GMSStyleSpans 公用程式方法。GMSStyleSpans 方法接受兩個定義重複模式的陣列。其中一個陣列設定應重複的樣式,另一個陣列定義重複間隔。您可以搭配使用模式,建立可套用至任何折線的模式,不受長度或可用的線段數量影響。

舉例來說,下列程式碼片段定義了具有黑白配色模式的折線。由於類型指定為 kGMSLengthRhumb,因此沿著弧形線的長度會視為公尺 (在 Merrcator 中則為直線)。

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);
      

Sprite 印花折線

Sprite 印章折線可讓您使用自選的點陣圖圖片建立折線。形狀具有清楚的背景筆劃,但其周圍的角落不會遭到截斷,因此在說明步行路線時,有點相當實用。

Sprite 戳記的折線

您可以透過 GMSSpriteStyle 使用這項功能,並使用 GMSStrokeStylestampStyle 屬性將其設為戳記。

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];
polyline.strokeWidth = 20;
GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];

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

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

紋理印章折線

紋理戳記折線可讓您使用自選的重複紋理建立折線。形狀可使用清晰、純色或漸層背景顏色顯示。隨著縮放等級改變,紋理也會調整大小。在路徑或路徑點結尾或開頭的圖片,在特定縮放等級下會遭到截斷。

紋理清楚的折線

您可以使用 GMSTextureStyle 來使用這項功能,並透過 GMSStrokeStylestampStyle 屬性將其設為戳記。

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;
      

地圖功能

GMSMapView 上的 mapCapabilities 屬性可為地圖專用地圖項目新增程式輔助檢查功能。如想在呼叫特定 API 前,先行知道特定地圖 capabilities 是否可用,這個方法就能派上用場。這項查詢會決定地圖檢視是否支援 Sprite 印花折線。

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;
      

這個模式可讓您訂閱變更,並依據地圖檢視狀態做出回應。您也可以在 GMSMapViewDelegate 上實作 didChangeMapCapabilities,取得功能可用性的最新資訊。

多邊形

多邊形與折線類似,都是由一系列座標依序組成。不過,多邊形並不是開放的線段,而是定義封閉迴圈中的固體區域。多邊形是在 Maps SDK for iOS 中由 GMSPolygon 類別定義。

在地圖中新增 GMSPolygon 的做法與加入 GMSPolyline 的方式相同。首先,請建立對應的 GMSMutablePath 物件並新增路徑點,藉此指定路徑。這些點會構成多邊形的外框。每個 CLLocationCoordinate2D 都代表地球表面上的一個點。線段會根據您在路徑中加入路徑點的順序,繪製點與點之間的線段。

加入多邊形

  1. 建立 GMSMutablePath 物件。
  2. 請使用 addCoordinate:addLatitude:longitude: 方法設定路徑中的點。這些點會構成多邊形的外框。
  3. 使用路徑做為引數,將新的 GMSPolygon 物件執行個體化。
  4. 視需要設定其他屬性,例如 strokeWidthstrokeColorfillColor
  5. 設定 GMSPolygon.map 屬性,將多邊形指派給 GMSMapView 物件。
  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 for iOS 也包含 GMSCircle,可讓您在地球表面上繪製圓形。

如要建構圓形,請指定以下兩個屬性:

  • CLLocationCoordinate2D 格式指定的 position
  • 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 mapView = GMSMapView.map(withFrame: .zero, camera: camera)
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];
mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

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;