在MapBox iOS(快速)上显示照片地理标记

时间:2018-10-26 18:37:41

标签: swift mapbox

我想得到类似图片的东西。 我不知道如何从网址中将图像加载为图标。 网址图片数据包含在json中。我还想更改标签总数下的背景。 有人可以帮助我,并向我展示使用示例吗? 链接到下面的照片。

import Mapbox

   class ViewController: UIViewController, MGLMapViewDelegate {

   var mapView: MGLMapView!
   var icon: UIImage!
   var popup: UILabel?

   enum CustomError: Error {
      case castingError(String)
    }

   override func viewDidLoad() {
       super.viewDidLoad()

       mapView = MGLMapView(frame: view.bounds, styleURL: MGLStyle.lightStyleURL)
       mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
       mapView.tintColor = .darkGray
       mapView.delegate = self
       view.addSubview(mapView)

       let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleMapTap(sender:)))
       for recognizer in mapView.gestureRecognizers! where recognizer is UITapGestureRecognizer {
          singleTap.require(toFail: recognizer)
       }
       mapView.addGestureRecognizer(singleTap)

       icon = UIImage(named: "port")
    }

    func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {
       let url = URL(fileURLWithPath: Bundle.main.path(forResource: "ports", ofType: "geojson")!)

       let source = MGLShapeSource(identifier: "clusteredPorts",url: url,options: [.clustered: true, .clusterRadius: icon.size.width])
       style.addSource(source)

       style.setImage(icon.withRenderingMode(.alwaysTemplate), forName: "icon")


       let ports = MGLSymbolStyleLayer(identifier: "ports", source: source)
       ports.iconImageName = NSExpression(forConstantValue: "icon")
       ports.iconColor = NSExpression(forConstantValue: UIColor.darkGray.withAlphaComponent(0.9))
       ports.predicate = NSPredicate(format: "cluster != YES")
       style.addLayer(ports)


       let stops = [
          20: UIColor.lightGray,
          50: UIColor.orange,
          100: UIColor.red,
          200: UIColor.purple
       ]


       let circlesLayer = MGLCircleStyleLayer(identifier: "clusteredPorts", source: source)
       circlesLayer.circleRadius = NSExpression(forConstantValue: NSNumber(value: Double(icon.size.width) / 2))
        circlesLayer.circleOpacity = NSExpression(forConstantValue: 0.75)
        circlesLayer.circleStrokeColor = NSExpression(forConstantValue: UIColor.white.withAlphaComponent(0.75))
       circlesLayer.circleStrokeWidth = NSExpression(forConstantValue: 2)
       circlesLayer.circleColor = NSExpression(format: "mgl_step:from:stops:(point_count, %@, %@)", UIColor.lightGray, stops)
       circlesLayer.predicate = NSPredicate(format: "cluster == YES")
       style.addLayer(circlesLayer)


       let numbersLayer = MGLSymbolStyleLayer(identifier: "clusteredPortsNumbers", source: source)
       numbersLayer.textColor = NSExpression(forConstantValue: UIColor.white)
       numbersLayer.textFontSize = NSExpression(forConstantValue: NSNumber(value: Double(icon.size.width) / 2))
       numbersLayer.iconAllowsOverlap = NSExpression(forConstantValue: true)
       numbersLayer.text = NSExpression(format: "CAST(point_count, 'NSString')")

       numbersLayer.predicate = NSPredicate(format: "cluster == YES")
       style.addLayer(numbersLayer)
    }
}

Example

1 个答案:

答案 0 :(得分:0)

在大多数地图SDK中,您可以为此使用注释。

MGLMapView也具有添加或删除注释的方法。

  

/ **    在地图视图中添加注释。

     

@note MGLMultiPolylineMGLMultiPolygonMGLShapeCollection和       MGLPointCollection对象目前无法添加到地图视图中。       任何多点,多段线,多面,形状或点集合       指定的对象将被静默忽略。

     

@param批注添加到接收方的批注对象。这个对象       必须符合MGLAnnotation协议。地图视图保留了       注释对象。 * /   -(void)addAnnotation:(id)annotation;

     

/ **    在地图视图中添加注释数组。

     

@note MGLMultiPolylineMGLMultiPolygonMGLShapeCollection对象       目前无法添加到地图视图。 MGLMultiPoint也不能       不是MGLPolylineMGLPolygon实例的对象。任何       多点,多段线,多面或形状收集对象       指定的内容将被忽略。

     

@param注解注释对象的数组。数组中的每个对象       必须符合MGLAnnotation协议。地图视图保留每个       单个注释对象。    * /   -(void)addAnnotations:(NS_ARRAY_OF(id)*)注释;

     

/ **    从地图视图中删除注释,如果选择了注释,则将其取消选择。

     

删除注释对象会使其完全脱离地图视图,    使其无法在地图上显示。因此,您通常会打电话    仅在您要隐藏或删除给定注释时使用此方法。

     

@param注释要删除的注释对象。该对象必须符合       遵守MGLAnnotation协议    * /   -(void)removeAnnotation:(id)annotation;

     

/ **    从地图视图中删除注释数组,取消选择任何选定的    数组中的注释。

     

删除注释对象会使它们与地图视图完全脱离关联,    阻止它们显示在地图上。因此,您通常    仅当您要隐藏或删除给定的注释时,才调用此方法。

     

@param注解要删除的注释对象的数组。中的对象       数组必须符合MGLAnnotation协议。    * /   -(void)removeAnnotations:(NS_ARRAY_OF(id)*)注释;

因此,第一步将是使用上述方法将注释添加到地图视图中。然后MGLMapView将在下面调用其委托方法之一:

func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView?

您需要的只是返回一个适当的视图。 方法。