2GIS iOS MapGL
2GIS iOS MapGL是一个SDK,它允许您将2GIS地图添加到您的iOS应用程序中。它可以用来自定义界面中的地图,向地图添加自定义标记和标签,绘制路线和自定义形状,并突出地图上的各种对象,如建筑物、道路以及其他。
此SDK使用WebKit来渲染地图。如果您需要更本地的解决方案(例如,如果您不想在应用程序内显示网络内容),请查看iOS Native SDK。
完整文档,包括更多使用示例和所有类和方法的高级描述,可以在docs.2gis.com/en/ios/webgl/maps/overview中找到。
获取访问密钥
使用此SDK需要API密钥来连接到2GIS服务器并检索地理数据。此API密钥对于SDK是唯一的,不能与其他2GIS SDK一起使用。要获取密钥,请联系我们 [email protected]。
另外,如果您计划在地图上绘制路线,您还需要一个单独的密钥——一个路线API密钥,用于计算和显示最佳路线。要获取它,请填写partner.api.2gis.ru上的表格或通过[email protected]联系我们。
安装
2GIS iOS MapGL可以通过CocoaPods获取。要安装它,请在您的Podfile中添加以下行
pod 'MapGL'
使用
要运行示例应用,请打开HelloSDK.xcworkspace
并在Example/HelloSDK/HelloVC.swift
中指定您的API密钥
enum Constants {
static let apiKey = "YOUR_MAPGL_KEY"
static let directionsApiKey = "YOUR_DIRECTIONS_KEY"
}
创建地图控件
要显示地图,首先将一个MapView添加到您的界面中。MapView是从UIView继承而来的,因此您可以使用Storyboard、XIB或使用编程方式创建
let map = MapView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
然后,通过调用show()方法并传递您的API密钥来初始化控件。您还可以传递初始坐标和所需的缩放级别。有关选项的完整列表,请参阅API参考。
例如,以下代码将在克里姆林宫周围显示莫斯科的地图
map.show(
apiKey: "Your API key",
center: CLLocationCoordinate2D(latitude: 55.7516, longitude: 37.6179),
zoom: 16
)
要在地图初始化后进行某些操作,您可以编写一个尾随闭包
map.show(apiKey: "Your API key") { _ in
// closure body
}
添加标记
您可以在地图上添加任意数量的标记。要添加标记,请实例化 此外,您还可以更改标记的样式。您可以指定image(作为 要切换标记的可见性,您可以使用 您可以在地图上添加多个文本标签。要添加标签,通过指定坐标、标签文本、文字颜色(以UIColor的形式)和字体大小来实例化Label类。然后,将得到的对象传递给地图的add()方法。 要隐藏标签,可以使用hide()方法。要再次显示它,请使用show()方法。 除了图像标记和文本标签,您还可以在地图上绘制自定义形状,如线条、圆和多边形。对于每种形状,您需要指定坐标和颜色。另外,您还可以指定Z-order来在这些形状之间分层。 要在地图上绘制线条,请实例化Polyline类,并将得到的对象传递给地图的add()方法。 Polyline有两个类型的参数:线条点的坐标(CLLocationCoordinate2D数组)和最多三个PolylineStyle对象来修饰线条。 简单来说,线条可以由最多三条并列的子线条组成。每条子线由独立的参数修饰(style1用于最上方的子线,style2用于中间的子线,style3用于最下方的子线)。style2和style3可以省略,以绘制没有子线的线条。 例如,为了在两点之间绘制简单的线条,您可以使用以下类似代码 作为一个更复杂的例子,为了绘制由三点连接并具有三条子线的线条,您可以使用以下代码 在这个例子中,有一条白色线条在蓝色线条下方绘制,一条黑色线条在白色线条下方绘制。它们共同创建了一条双线效果。 要在地图上画圆,请创建Circle类实例,并将其对象传递给地图的add()方法。 Circle类有几个参数。要指定圆的中心坐标和大小,分别指定center(坐标)和radius(单位:米)。要指定填充颜色,请使用fillColor(如UIColor)。要指定描边颜色和宽度,请使用strokeColor和strokeWidth。最后,要指定Z顺序,请使用z参数。 要在地图上绘制多边形,请创建Polygon类实例,并将其对象传递给地图的add()方法。 Polygon有几个参数。要指定多边形顶点的坐标,请将points参数指定为一个包含CLLocationCoordinate2D的数组。要指定填充颜色,请使用fillColor(如UIColor)。要指定描边颜色和宽度,请使用strokeColor和strokeWidth。最后,要指定Z顺序,请使用z参数。 要接收触摸坐标,可以在地图上注册点击监听器 要获取被点击对象的ID(建筑、道路、标记、自定义形状等),可以实现可选方法的MapViewDelegate协议 然后可以使用对象的ID在地图上突出显示该对象(见突出显示对象)。相同的ID也可以用于通过地点API获取对象的完整信息,因为所有API中的ID都是相同的。 您可以为地图对象,如建筑、道路等,添加高亮显示。 要这样做,请调用setSelectedObjects()方法并将需要高亮的对象的ID数组传递给它。您可以通过向地图添加点击监听器来获取ID(见处理触摸事件部分)。 要更改突出显示对象的列表,只需再次调用此方法,并传递新的ID数组。 要禁用高亮显示,将空数组传递给setSelectedObjects()方法 如果您有方向API密钥,您可以在地图上绘制路线。 要绘制路线,首先通过调用方向对象并传入您的密钥来创建一个makeDirections()方法。 然后,您可以调用showCarRoute()方法,并传递最多10个坐标的数组来计算和显示一条最佳路线。 要隐藏路线,调用clear()方法。 2GIS iOS MapGL受BSD 2-Clause "简化"授权许可。更多信息请参阅LICENSE文件。map.show(apiKey: "Your API key") { _ in
let marker = Marker(coordinates: CLLocationCoordinate2D(latitude: 55.7516, longitude: 37.6179))
map.add(marker)
}
let marker = Marker(
coordinates: CLLocationCoordinate2D(latitude: 55.7516, longitude: 37.6179),
image: UIImage(named: "pin")!,
anchor: .bottom
)
marker.hide()
marker.show()
添加标签
map.show(apiKey: "Your API key") { _ in
let label = Label(
center: CLLocationCoordinate2D(latitude: 55.7517, longitude: 37.6179),
text: "The Kremlin label",
color: .white,
fontSize: 14
)
map.add(label)
}
label.hide()
label.show()
绘制自定义形状
绘制线条
let polyline = Polyline(
points: [
CLLocationCoordinate2D(latitude: 55.752164, longitude: 37.615487),
CLLocationCoordinate2D(latitude: 55.751691, longitude: 37.621339)
],
style1: PolylineStyle(color: .blue, width: 5)
)
map.add(polyline)
let polyline = Polyline(
points: [
CLLocationCoordinate2D(latitude: 37.615104, longitude: 55.752375),
CLLocationCoordinate2D(latitude: 37.618022, longitude: 55.752459),
CLLocationCoordinate2D(latitude: 37.615189, longitude: 55.750829),
CLLocationCoordinate2D(latitude: 37.617936, longitude: 55.750865)
],
style1: PolylineStyle(color: .blue, width: 6),
style2: PolylineStyle(color: .white, width: 10),
style3: PolylineStyle(color: .black, width: 12)
)
map.add(polyline)
绘制圆
let circle = Circle(
center: CLLocationCoordinate2D(latitude: 55.7516, longitude: 37.6179),
radius: 100,
fillColor: UIColor.blue.withAlphaComponent(0.2),
strokeColor: .blue,
strokeWidth: 2,
z: 5
)
map.add(circle)
绘制多边形
let polygon = Polygon(
points: [
CLLocationCoordinate2D(latitude: 55.7526, longitude: 37.6179),
CLLocationCoordinate2D(latitude: 55.7506, longitude: 37.6161),
CLLocationCoordinate2D(latitude: 55.7506, longitude: 37.6197)
],
fillColor: UIColor.blue.withAlphaComponent(0.2),
strokeColor: .blue,
strokeWidth: 2,
z: 5
)
map.add(polygon)
处理触摸事件
map.mapClick = { coordinates in
let latitude = coordinates.latitude
}
func mapView(_ mapView: MapView, didSelectObject object: MapObject) {
let objectId = object.id
}
突出显示对象
map.setSelectedObjects(["48231504731808815", "23520539192555249"])
map.setSelectedObjects([])
路线
let directions = map.makeDirections(with: "Your Directions API key")
directions.showCarRoute(points: [
CLLocationCoordinate2D(latitude: 55.746069, longitude: 37.622074),
CLLocationCoordinate2D(latitude: 55.747313, longitude: 37.615573)
])
directions.clear()
授权