overlay - ShenYj/ShenYj.github.io GitHub Wiki

地图

目前国内 iOS 开发可选方案主要有

  • 百度地图
  • 高德地图
  • 腾讯地图
  • 原生地图

三方地图框架的确很便捷,为我们封装了很多好用功能, 比如连最基础的地图缩放等级,在源生地图中默认也是不包含的

坐标系

境外统一为 WGS84, 国内高德与腾讯使用的是国测局的 GCJ02, 百度是二次加密后的 BD09

最常见的三个坐标系,除此之外,还有其他坐标系

覆盖物

地图覆盖物主要包含以下两类

  • Annotation
  • Overlay

Annotation 基本做地图必用的, 展示一些自定义样式大头针
Overlay 包含路线、图形等,以及一些手绘图自定义图片等

Overlay 其主要包含

  • MKPolyline: 比如路线
  • MKPolygon: 比如绘制矩形、不规则多边形等
  • MKCircle: 绘制圆形

自定义图片覆盖物可以通过自定义 Overlay 实现

MKPolygon

  • e.g. 绘制矩形

    let southWest = CLLocationCoordinate2D(latitude: 39.912804, longitude: 116.391462)
    let northEast = CLLocationCoordinate2D(latitude: 39.923593, longitude: 116.402614)
    
    let leftTop = CLLocationCoordinate2D(latitude: northEast.latitude, longitude: southWest.longitude)
    let leftDown = CLLocationCoordinate2D(latitude: southWest.latitude, longitude: southWest.longitude)
    let rightDown = CLLocationCoordinate2D(latitude: southWest.latitude, longitude: northEast.longitude)
    let rightTop = CLLocationCoordinate2D(latitude: northEast.latitude, longitude: northEast.longitude)
    
    /// 顺时针方向
    var coords = [leftTop, rightTop, rightDown, leftDown]
    
    /// 多边形
    let polygonOverlay = MKPolygon(coordinates: &coords, count: coords.count)
    mapView.addOverlay(polygonOverlay)

这里在设置坐标点时是顺时针方向, 之前在写百度地图绘制矩形时是传入了逆时针方向

效果图:

.

百度

.

MKPolygon 自定义图片覆盖物

  • e.g. 图片覆盖物

    let centerLocation = CLLocation(latitude: 39.904685116866624, longitude: 116.3659296332766)
    let southWestLocation = CLLocation(latitude: 39.9042937397008, longitude: 116.36550672412181)
    let northEastLocation = CLLocation(latitude: 39.905045562412326, longitude: 116.36632992691236)
    
    /// 设置地图范围
    let latitudeDelta = northEastLocation.coordinate.latitude - southWestLocation.coordinate.latitude
    let longitudeDelta = northEastLocation.coordinate.longitude - southWestLocation.coordinate.longitude
    let span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta)
    let region = MKCoordinateRegion(center: centerLocation.coordinate, span: span)
    mapView.setRegion(region, animated: true)
    
    /// 手绘图的区域
    let southWest = CLLocationCoordinate2D(latitude: southWestLocation.coordinate.latitude, longitude: southWestLocation.coordinate.longitude)
    let northEast = CLLocationCoordinate2D(latitude: northEastLocation.coordinate.latitude, longitude: northEastLocation.coordinate.longitude)
    
    let leftTop = CLLocationCoordinate2D(latitude: northEast.latitude, longitude: southWest.longitude)
    let leftDown = CLLocationCoordinate2D(latitude: southWest.latitude, longitude: southWest.longitude)
    let rightDown = CLLocationCoordinate2D(latitude: southWest.latitude, longitude: northEast.longitude)
    let rightTop = CLLocationCoordinate2D(latitude: northEast.latitude, longitude: northEast.longitude)
    
    /// 顺时针方向
    var coords = [leftTop, rightTop, rightDown, leftDown, leftTop]
    
    /// 地图中心点
    mapView.setCenter(centerLocation.coordinate, animated: true)
    
    if let overLay { mapView.removeOverlay(overLay) }
    
    groundImageName = "19585.jpg"
    let polygonOverlay = MKPolygon(coordinates: &coords, count: coords.count)
    overLay = polygonOverlay
    mapView.addOverlay(polygonOverlay)
⚠️ **GitHub.com Fallback** ⚠️