我想得到类似图片的东西。 我不知道如何从网址中将图像加载为图标。 网址图片数据包含在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)
}
}
答案 0 :(得分:0)
在大多数地图SDK中,您可以为此使用注释。
MGLMapView
也具有添加或删除注释的方法。
/ ** 在地图视图中添加注释。
@note
MGLMultiPolyline
,MGLMultiPolygon
,MGLShapeCollection
和MGLPointCollection
对象目前无法添加到地图视图中。 任何多点,多段线,多面,形状或点集合 指定的对象将被静默忽略。@param批注添加到接收方的批注对象。这个对象 必须符合
MGLAnnotation
协议。地图视图保留了 注释对象。 * / -(void)addAnnotation:(id)annotation;/ ** 在地图视图中添加注释数组。
@note
MGLMultiPolyline
,MGLMultiPolygon
和MGLShapeCollection
对象 目前无法添加到地图视图。MGLMultiPoint
也不能 不是MGLPolyline
或MGLPolygon
实例的对象。任何 多点,多段线,多面或形状收集对象 指定的内容将被忽略。@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?
您需要的只是返回一个适当的视图。 方法。