gpt4 book ai didi

ios - MapBox - 检测 zoomLevel 变化

转载 作者:可可西里 更新时间:2023-10-31 23:59:46 25 4
gpt4 key购买 nike

我怎样才能简单地检测缩放级别的变化?可能吗?

我只需要在缩放级别不够时隐藏我的注释 View 。

regionDidChange:animated: 不适合我使用。还有其他办法吗?

我需要在这里隐藏我的标签:

enter image description here

并在此处显示它们:

enter image description here

这是我目前对标签所做的:

class CardAnnotation: MGLPointAnnotation {    var card: Card    init(card: Card) {        self.card = card        super.init()        let coordinates = card.border.map { $0.coordinate }        let sumLatitudes = coordinates.map { $0.latitude }.reduce(0, +)        let sumLongitudes = coordinates.map { $0.longitude }.reduce(0, +)        let averageLatitude = sumLatitudes / Double(coordinates.count)        let averageLongitude = sumLongitudes / Double(coordinates.count)        coordinate = CLLocationCoordinate2D(latitude: averageLatitude, longitude: averageLongitude)    }    required init?(coder aDecoder: NSCoder) {        fatalError("init(coder:) has not been implemented")    }}
var annotations = [CardAnnotation]()
mapView.addAnnotations(annotations)

最佳答案

两个主要ways to add overlays对于 MGLMapView,运行时样式 API 更适合文本标签,也更适合根据缩放级别改变外观。当您这样做时,您也可以使用相同的 API 创建多边形。

首先为要在其中添加阴影的区域创建多边形要素:

var cards: [MGLPolygonFeature] = []
var coordinates: [CLLocationCoordinate2D] = […]
let card = MGLPolygonFeature(coordinates: &coordinates, count: UInt(coordinates.count))
card.attributes = ["address": 123]
// …
cards.append(card)

在 map 加载完成后运行的任何方法中,例如 MGLMapViewDelegate.mapView(_:didFinishLoading:),将包含这些功能的形状源添加到当前样式:

let cardSource = MGLShapeSource(identifier: "cards", features: cards, options: [:])
mapView.style?.addSource(cardSource)

形状源就位后,创建一个样式层,将多边形要素呈现为紫红色填充:

let fillLayer = MGLFillStyleLayer(identifier: "card-fills", source: cardSource)
fillLayer.fillColor = NSExpression(forConstantValue: #colorLiteral(red: 0.9098039216, green: 0.8235294118, blue: 0.9647058824, alpha: 1))
mapView.style?.addLayer(fillLayer)

然后创建另一个样式层,在每个多边形要素的质心处呈现标签。 (MGLSymbolStyleLayer 自动计算质心,计算不规则形状的多边形。)

// Same source as the fillLayer.
let labelLayer = MGLSymbolStyleLayer(identifier: "card-labels", source: cardSource)
// Each feature’s address is an integer, but text has to be a string.
labelLayer.text = NSExpression(format: "CAST(address, 'NSString')")
// Smoothly interpolate from transparent at z16 to opaque at z17.
labelLayer.textOpacity = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)",
[16: 0, 17: 1])
mapView.style?.addLayer(labelLayer)

自定义这些样式图层时,请特别注意 MGLSymbolStyleLayer 上的选项,这些选项控制附近的符号是否因碰撞而自动隐藏。您可能会发现自动碰撞检测无需指定 textOpacity 属性。


当您创建源时,您可以传递给 MGLShapeSource 初始化程序的选项之一是 MGLShapeSourceOption.clustered。但是,为了使用该选项,您必须创建 MGLPointFeature,而不是 MGLPolygonFeature。幸运的是,MGLPolygonFeature 有一个 coordinate 属性,无需手动计算即可找到质心:

var cardCentroids: [MGLPointFeature] = []
var coordinates: [CLLocationCoordinate2D] = […]
let card = MGLPolygonFeature(coordinates: &coordinates, count: UInt(coordinates.count))
let cardCentroid = MGLPointFeature()
cardCentroid.coordinate = card.coordinate
cardCentroid.attributes = ["address": 123]
cardCentroids.append(cardCentroid)
// …
let cardCentroidSource = MGLShapeSource(identifier: "card-centroids", features: cardCentroids, options: [.clustered: true])
mapView.style?.addSource(cardCentroidSource)

此集群源只能与 MGLSymbolStyleLayerMGLCircleStyleLayer 一起使用,不能与 MGLFillStyleLayer 一起使用。 This example更详细地展示了如何使用聚类点。

关于ios - MapBox - 检测 zoomLevel 变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50471924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com