【问题标题】:iOS Mapbox SDK - How to add MGLPointAnnotation markers into a map layeriOS Mapbox SDK - 如何将 MGLPointAnnotation 标记添加到地图图层中
【发布时间】:2019-10-03 04:39:17
【问题描述】:

我需要找到一种方法将标记从 MGLPointAnnotation 转换为 MGLShapeSource 或类似的,以便将标记添加到地图图层并完全控制如何在地图上显示和聚集它们,例如.

我正在使用 MapBox SDK v5.2 构建一个 iOS 应用程序。 该应用程序在内部生成标记(标题、副标题、坐标和图标图像名称),并且在点击时标记会显示在地图上并带有标注。标记使用MGLPointAnnotation() 创建并使用mapView.addAnnotation() 添加到地图中。

但为了完全控制标记的显示方式,例如根据缩放级别对它们进行聚类或打开/关闭它们,我需要将标记添加到地图图层,例如使用 @987654326 @ 然后是 style.addSource()style.addLayer()

问题是我找不到从MGLPointAnnotationMGLShapeSource 或类似的转换器的方法。 我对此进行了调查,但我能想到的唯一解决方案是将标记信息包含在GeoJSON 文件中。但我想避免这种情况,因为标记是在应用程序运行时在应用程序内生成的,而不是从外部只读 GeoJSON 文件中生成的。

如何创建单个 poi 的示例:

let poi1 = MGLPointAnnotation()
         poi1.coordinate = CLLocationCoordinate2D(latitude: 38.788534, longitude: -9.494489)
         poi1.title = "poi1"
         poi1.subtitle = "This is the text for poi1"
         poiTitleImage[poi1.title!] = "icon1"

mapView.addAnnotation(poi1)

【问题讨论】:

    标签: ios mapbox-ios


    【解决方案1】:

    您可以使用array of MGLPointAnnotationMGLPointFeature 对象创建MGLShapeSource。从那里,您可以添加一个类似于 clustering example 的集群层。

    如果您还想为每个点分配文本或其他数据,请使用MGLPointFeature 对象,然后将文本分配为属性值。

    例如:

            var features = [MGLPointFeature]()
            for _ in 1...100 {
                let point = MGLPointFeature()
    
                let lat = Double(arc4random_uniform(180) / 2)
                let lon = Double(arc4random_uniform(360) / 2)
    
                point.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)
                point.attributes["title"] = "\(lat) \(lon)"
                features.append(point)
            }
            let source = MGLShapeSource(identifier: "clusteredFeatures",
                                        features: features,
                                        options: [.clustered: true, .clusterRadius: 20])
            style.addSource(source)
    
    

    可以在Mapbox website 上找到如何呈现包含信息的标注的示例。 handleMapTap 方法似乎包含您要查找的内容。

    基本上,您将查询用户点击的地图。访问所选要素的属性,然后显示包含该信息的标注。上例使用UILabel 来显示信息。

    如果您想使用默认标注,请参阅 dynamically style interactive points 示例中的 handleMapTap 方法。此示例还从运行时加载的 JSON 数据创建形状源。

    【讨论】:

    • 是的,我们可以将以这种方式生成的点添加到层中,我之前已经在代码上测试过您所指的聚类示例。我描述的问题不同:我需要能够使用标注注释向图层添加点;这意味着地图显示由各种图标图像表示的聚集点,没有文本标签;当用户点击可见图标(未聚集)时,会出现带有标题和副标题的标注。
    • 您是在问如何存储标题/字幕信息?如果是这样,我可以在我的回答中详细说明。
    • 您好,是的,还有关于使用哪个图像的信息 - 请参阅本文开头的我的代码。谢谢。
    • 请看我的回复。我添加了另一个示例,该示例显示了与您想要的类似的行为。
    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多