簡體   English   中英

iOS Mapbox SDK-如何將MGLPointAnnotation標記添加到地圖圖層

[英]iOS Mapbox SDK - How to add MGLPointAnnotation markers into a map layer

我需要找到一種將標記從MGLPointAnnotation轉換為MGLShapeSource或類似方法的方法,以便將標記添加到地圖圖層並完全控制例如如何在地圖上顯示和聚類標記。

我正在使用MapBox SDK v5.2構建iOS應用。 該應用程序在內部生成標記(標題,字幕,坐標和圖標圖像名稱),並且在點擊時標記會在地圖上顯示並帶有標注。 使用在創建標記MGLPointAnnotation()並使用添加到地圖mapView.addAnnotation()

但是,為了完全控制標記的顯示方式(例如,基於縮放級別對標記進行聚類或將其切換為ON / OFF),我需要將標記添加到Map圖層,例如使用MGLShapeSource ,然后添加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)

您可以創建一個MGLShapeSource陣列MGLPointAnnotationMGLPointFeature對象。 從那里,您可以添加一個類似於此集群示例的集群層。

如果還要為每個點分配文本或其他數據,請使用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網站上可以找到有關如何顯示包含信息的標注的示例 似乎handleMapTap方法可能包含您要查找的內容。

本質上,您將查詢用戶點擊的地圖。 訪問所選功能的屬性,然后顯示包含該信息的標注。 上面的示例使用UILabel來顯示信息。

如果要使用默認標注,請參見動態樣式交互點示例上的handleMapTap方法。 此示例還從運行時加載的JSON數據創建形狀源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM