Skip to content

Latest commit

 

History

History
155 lines (126 loc) · 6.71 KB

china_cn_iOS.md

File metadata and controls

155 lines (126 loc) · 6.71 KB

Mapbox China plugin for iOS

当前版本:v0.0.1

  • 支持中国用户
  • 坐标系转化为GCJ-02

Mapbox China for iOS 为使用 Mapbox China 地图提供了基础。该插件包含使用 Mapbox China 样式的便捷方法,将 WGS-84 坐标转换为 GCJ-02 的坐标系,以及提供 GCJ-02 坐标位置更新的自定义位置管理器。

入门

要访问 Mapbox China 样式,您需要一个专门的 access token。请填写 https://www.mapbox.cn/contact 上的表格,即可申请你的 access token。没有此 access token,您将无法访问 Mapbox China 矢量切片。

安装

通过安装适用于 iOS 的 Mapbox Maps SDK 和 Mapbox China 插件来设置 Mapbox China 插件,您可以按照我们的安装指南中的说明安装 Maps SDK。

CocoaPods

在您的Podfile中添加下面的语句:

pod 'MapboxChinaPlugin'

接下来通过在命令行中运行 pod update 来更新工程。

Carthage

在您的 Cartfile 中添加下面的语句:

binary "https://www.mapbox.cn/mapbox-china-plugin/ios/Mapbox-iOS-China-Plugin.json" ~> 0.0.1

通过在终端中运行 carthage update 来更新工程。

设置工程

API 配置

要接收 Mapbox China 矢量切片,请将 MGLMapboxAPIBaseURL 作为键添加到 Info.plist 中,并将 https://api.mapbox.cn 设置为其值。这会切换地图样式的API端点。

Mapbox China 样式

Mapbox目前提供三种中国政府认可的地图样式:Mapbox 街景地图、浅色地图和暗黑地图。默认使用Mapbox街景地图。

该插件提供了用于更新地图样式 URL 的便捷方法。

样式名称 URL字符串 MGLStyle 的便捷方法
街景地图 mapbox://styles/mapbox/streets-zh-v1 mbcn_streetsChineseStyleURL
暗黑地图 mapbox://styles/mapbox/dark-zh-v1 mbcn_darkChineseStyleURL
浅色地图 mapbox://styles/mapbox/light-zh-v1 mbcn_lightChineseStyleURL

使用 Mapbox China 插件

添加插件

-addToMapView: 方法将 Mapbox China 插件添加到已初始化的 MGLMapView 中。此方法将地图的样式 URL 切换为中国样式,并配置使用 GCJ-02 坐标的位置管理器。 Swift

import MapboxChinaPlugin
 
class ViewController: UIViewController, MGLMapViewDelegate {
 
    override func viewDidLoad() {
        super.viewDidLoad()
        let mapView = MGLMapView(frame: view.bounds)
        let chinaPlugin = MBXChinaPlugin()
        chinaPlugin.add(to: mapView)
        view.addSubview(mapView)
    }
}

Objective C

import MapboxChinaPlugin;
 
@interface ViewController ()
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    MGLMapView *mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds];
    MBXChinaPlugin *chinaPlugin = [[MBXChinaPlugin alloc] init];
    [chinaPlugin addToMapView:mapView];
}
 
@end

坐标系转换

默认情况下,Maps SDK 使用 WGS-84 坐标�系。该插件可将 WGS-84 坐标转换为 GCJ-02 坐标,以符合中国政府的制图要求。目前,此插件支持�转换 CLLocationCoordinate2DMGLShape 对象。 转换由NSValueTransformerMGLConvertToDatumTransformerName 管理,后者是 NSValueTransformerName。 通过将插件添加到地图视图或直接初始化 MBCNGCJCoordinateTransformer ,可以使 MGLConvertToDatumTransformerName 可用。

Swift

let transformerName = NSValueTransformerName(rawValue: MGLConvertToDatumTransformerName)
let transformer = ValueTransformer(forName: transformerName)

Objective C

NSValueTransformer *transformer = [NSValueTransformer valueTransformerForName:MGLConvertToDatumTransformerName];

要转换一个标注,请转换改标注的坐标属性。这会将 WGS-84 坐标转换为 GCJ-02 坐标。这也可用于设置地图视图的中心坐标。 Swift

let unshiftedCoordinate = CLLocationCoordinate2D(latitude: 31.22894, longitude: 121.45434)

// Use the value transformer to shift the coordinate.
guard let transformedValue = transformer.transformedValue(NSValue(mglCoordinate: unshiftedCoordinate)) as? NSValue else { return }
let annotation = MGLPointAnnotation()
 
// Convert the NSValue back to an CLLocationCoordinate2D. Set the annotation's coordinate property to that shifted value.
let shiftedCoordinate = transformedValue.mglCoordinateValue
annotation.coordinate = shiftedCoordinate
mapView.addAnnotation(annotation)
 
// Set the center coordinate for the map view to the transformed coordinate.
mapView.setCenter(shiftedCoordinate, zoomLevel: 15, animated: false)

Objective C

CLLocationCoordinate2D unshiftedCoordinate = CLLocationCoordinate2DMake(31.22894, 121.45434);
 
// Use the value transformer to shift the coordinate.
NSValue *transformedValue = [transformer transformedValue:[NSValue valueWithMGLCoordinate:unshiftedCoordinate]];
MGLPointAnnotation *annotation = [[MGLPointAnnotation alloc] init];
 
// Convert the NSValue back to an CLLocationCoordinate2D. Set the annotation's coordinate property to that shifted value.
CLLocationCoordinate2D shiftedCoordinate = [transformedValue MGLCoordinateValue];
annotation.coordinate = shiftedCoordinate;
[mapView addAnnotation:annotation];
 
// Set the center coordinate for the map view to the transformed coordinate.
[mapView setCenterCoordinate:shiftedCoordinate zoomLevel:15 animated:NO];

此方法也适用于 MGLShapeMGLFeature 对象,包括使用 GeoJSON 创建的对象。

let originalShape = [
CLLocationCoordinate2D(latitude: 31.22869, longitude: 121.4534),
CLLocationCoordinate2D(latitude: 31.22894, longitude: 121.45319),
CLLocationCoordinate2D(latitude: 31.2287, longitude: 121.45279),
CLLocationCoordinate2D(latitude: 31.22844, longitude: 121.45301),
CLLocationCoordinate2D(latitude: 31.22869, longitude: 121.4534)
]
 
let shape = MGLPolygon(coordinates: originalShape, count: UInt(originalShape.count))
 
// Shift the shape's coordinates.
let transformedValue = transformer.transformedValue(shape) as! MGLPolygon

Objective C

CLLocationCoordinate2D originalShape[5] = {
CLLocationCoordinate2DMake(31.22869, 121.4534),
CLLocationCoordinate2DMake(31.22894, 121.45319),
CLLocationCoordinate2DMake(31.2287, 121.45279),
CLLocationCoordinate2DMake(31.22844, 121.45301),
CLLocationCoordinate2DMake(31.22869, 121.4534)
};
 
MGLPolygon *shape = [MGLPolygon polygonWithCoordinates:originalShape count:5];
 
// Shift the shape's coordinates.
MGLPolygon *transformedShape = [transformer transformedValue:shape];