当前位置: 首页 > 知识库问答 >
问题:

带有Mapbox和SwiftUI的空白地图

翟默
2023-03-14

我尝试将Mapbox与SwiftUI结合使用。

我https://stackoverflow.com/a/56551675/5653544应用了这个答案,也遵循了mapbox教程。

所以我有一个MapView.swift视图:

import SwiftUI
import Mapbox

extension MGLPointAnnotation {
    convenience init(title: String, coordinate: CLLocationCoordinate2D) {
        self.init()
        self.title = title
        self.coordinate = coordinate
    }
}

struct MapView: UIViewRepresentable {
    @Binding var annotations: [MGLPointAnnotation]

    private let mapView: MGLMapView = MGLMapView(frame: .zero, styleURL: MGLStyle.streetsStyleURL)

    // MARK: - Configuring UIViewRepresentable protocol

    func makeUIView(context: UIViewRepresentableContext<MapView>) -> MGLMapView {
        mapView.delegate = context.coordinator
        return mapView
    }

    func updateUIView(_ uiView: MGLMapView, context: UIViewRepresentableContext<MapView>) {
        updateAnnotations()
    }

    func makeCoordinator() -> MapView.Coordinator {
        Coordinator(self)
    }

    // MARK: - Configuring MGLMapView

    func styleURL(_ styleURL: URL) -> MapView {
        mapView.styleURL = styleURL
        return self
    }

    func centerCoordinate(_ centerCoordinate: CLLocationCoordinate2D) -> MapView {
        mapView.centerCoordinate = centerCoordinate
        return self
    }

    func zoomLevel(_ zoomLevel: Double) -> MapView {
        mapView.zoomLevel = zoomLevel
        return self
    }

    private func updateAnnotations() {
        if let currentAnnotations = mapView.annotations {
            mapView.removeAnnotations(currentAnnotations)
        }
        mapView.addAnnotations(annotations)
    }

    // MARK: - Implementing MGLMapViewDelegate

    final class Coordinator: NSObject, MGLMapViewDelegate {
        var control: MapView

        init(_ control: MapView) {
            self.control = control
        }

        func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {

            let coordinates = [
                CLLocationCoordinate2D(latitude: 37.791329, longitude: -122.396906),
                CLLocationCoordinate2D(latitude: 37.791591, longitude: -122.396566),
                CLLocationCoordinate2D(latitude: 37.791147, longitude: -122.396009),
                CLLocationCoordinate2D(latitude: 37.790883, longitude: -122.396349),
                CLLocationCoordinate2D(latitude: 37.791329, longitude: -122.396906),
            ]

            let buildingFeature = MGLPolygonFeature(coordinates: coordinates, count: 5)
            let shapeSource = MGLShapeSource(identifier: "buildingSource", features: [buildingFeature], options: nil)
            mapView.style?.addSource(shapeSource)

            let fillLayer = MGLFillStyleLayer(identifier: "buildingFillLayer", source: shapeSource)
            fillLayer.fillColor = NSExpression(forConstantValue: UIColor.blue)
            fillLayer.fillOpacity = NSExpression(forConstantValue: 0.5)

            mapView.style?.addLayer(fillLayer)

        }

        func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
            return nil
        }

        func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
            return true
        }

    }

}

我的ContentView.swift调用MapView:

import SwiftUI
import Mapbox

struct ContentView: View {

    @State var annotations: [MGLPointAnnotation] = [
        MGLPointAnnotation(title: "Mapbox", coordinate: .init(latitude: 37.791434, longitude: -122.396267))
    ]

    var body: some View {
        MapView(annotations: $annotations).centerCoordinate(.init(latitude: 37.791293, longitude: -122.396324)).zoomLevel(16)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我还创建了一个~/。带有mapbox令牌的mapbox文件,该令牌由我的mapbox帐户获取。但我有一张空白地图:

当我下载并运行mapbox示例时,它工作正常,所以我认为这不是因为我的Xcode版本。有人知道为什么我自己创建项目时无法加载地图吗?

Xcode版本: 11.3

地图盒版本:5.3。0

共有1个答案

严朝明
2023-03-14

您需要在信息中设置您的MGLMapboxAccessToken。普利斯特。

 类似资料:
  • 我一直在使用mapbox户外光栅瓷砖服务器处理传单地图。Mapbox有一些现成的样式,其中大部分都列在这个答案中。这个的代码/url是这样的: 我喜欢这种风格。但我的问题是,我试图添加一个图像。我希望imageoverlay位于地图地形图形之上,但位于标签之下。所以我所做的就是进入mapbox studio创建这两种样式-基本上是户外样式,标签分开: 没有标签 仅标签 旧样式在左侧,带有分离图层的

  • 我最近安装了Eclipse,版本是Eclipse IDE for Enterprise Java和Web Developers(包括孵化组件)版本:2021-03(4.19.0)构建ID:20210312-0638操作系统:Windows 10,v.10.0,x86_64/win32 Java版本:16 Windows Builder还安装了1.9.5版本并已更新 我创建了一个新Java项目,并将

  • 问题内容: 我正在使用python比较2个文件,如下所示: 目前,我正在通过脚本(从列中删除空格)之前运行文件。 s的示例: 有办法做到这一点并为我节省一步吗? 问题答案: 您可以使用.str.strip()在Pandas中整个系列: 这将消除导致/在后的空格中柱都与 或者,您可以修改行以同时使用 您似乎正在尝试删除包含数字的字符串中的空格。您可以通过以下方式做到这一点:

  • 1)创建新项目。 2)选定的谷歌地图创建。 3)调试google_maps_api.xml所遵循的步骤。 5)AndroidManifest.xml

  • 问题内容: 我有一个HTML表单- 使用PHP,我正在将表单的数据发送到MySQL数据库中。表格上某些问题的答案都有复选框。显然,用户不必勾选一个问题的所有复选框。我还想将其他问题(包括广播组)设为可选。 但是,如果我提交带有空框,单选组等的表单,则会收到一长串的“未定义索引”错误消息。 我该如何解决?谢谢。 问题答案: 未选中的单选或复选框元素未提交,因为它们不被视为成功。因此,您必须检查是否使

  • 这真的快把我逼疯了。我已经做了以下工作: 将我的包名+SHA1(调试密钥库)+SHA1(发布密钥库)添加到Google Developer的控制台。 已启用用于Android的地图SDK。API密钥有Android应用程序限制 从Firebase控制台将google-services.json添加到我的应用程序 添加了必要的权限: 将API键添加到清单文件-从Google Developer Co