微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI MapKit UIViewRepresentable MKLocalSearch 区域不起作用和集群

如何解决SwiftUI MapKit UIViewRepresentable MKLocalSearch 区域不起作用和集群

我有一个应用程序,它是具有 SwiftUI 生命周期的 SwiftUI 应用程序。我已经设置了一个 MKMapView 作为 UIViewRepresentable。对于其中一项功能用户点击屏幕上的两个位置 映射并输入搜索条件以在由两次点击确定的区域内查找地点。

地图有效,水龙头的注释有效,我确实从 MKLocalSearch 但结果不完整,不反映我所在的地区 已在请求中设置。充其量,我从大致中心得到一组结果 该地区的。边缘很少或没有。我是否似乎并不重要 创建一个圆形或矩形区域。而且我的大小似乎并不重要 使区域。我只是在终点没有得到有效的结果。

除了显示问题的必需品外,我已经删除了所有内容,所以这个 可以运行代码来演示。将光标置于文本字段中并点击返回,然后 点击齿轮将结果打印到控制台

地图如下:

struct MapView: UIViewRepresentable {

    typealias UIViewType = MKMapView

    @State private var myMapView: MKMapView?
    @State private var sfCoord = CLLocationCoordinate2D(latitude: 37.7749,longitude: -122.4194)

    class Coordinator: NSObject,MKMapViewDelegate {
        var control: MapView

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

        func mapView(_ mapView: MKMapView,didAdd views: [MKAnnotationView]) {
            if let annotationView = views.first {
                if let annotation = annotationView.annotation {
                    if annotation is MKUserLocation {
                        let region = MKCoordinateRegion(center: annotation.coordinate,latitudinalMeters: 5000,longitudinalMeters: 5000)
                        mapView.setRegion(region,animated: true)
                    }//if user
                }//if annotation
            }//if views  first
        }//did add
    }//class

    func makeUIView(context: Context) -> MKMapView {
    
        let map = MKMapView()
        map.showsUserLocation = true
        map.delegate = context.coordinator
    
        dispatchQueue.main.async {
            self.myMapView = map
        }
    
        return map
    
    }//make ui view

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }//coord

    func updateUIView(_ view: MKMapView,context: Context) {

    }//update ui view

}//struct

以及带有支持文件的 ContentView:

struct ContentView: View {

    @State private var search = "Coffee"    
    @State private var myLandmarks: [MyLandmark] = [MyLandmark]()
    @State private var mapView: MapView?

    var body: some View {

        NavigationView {
            ZStack(alignment: .top) {
                MapView()
                    .ignoresSafeArea()
                TextField("Search",text: $search,onEditingChanged: { _ in })
                {
                    self.getNearbyMyLandmarks()
                }
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()
                .offset(y: -20)
            } //z
            .navigationBarItems(leading:    Button(action: {
                self.printMyLandmarks()
            }) {
                Image(systemName: "gear")
                    .resizable()
                    .frame(width: 25,height: 25,alignment: .center)
            },trailing:    Button(action: {
                self.search = "Coffee"
            }) {
                Image(systemName: "arrow.counterclockwise.circle")
                    .resizable()
                    .frame(width: 25,alignment: .center)
            }
            )//nav bar items
        }//nav
        .navigationViewStyle(StackNavigationViewStyle())

    }//body
}// content view

private extension ContentView {

    private func getNearbyMyLandmarks() {
    
        let request = MKLocalSearch.Request()
        request.naturalLanguageQuery = search

        let sfRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 37.7749,longitude: -122.4194),latitudinalMeters: 100000,longitudinalMeters: 100000)
    
        request.region = sfRegion

        let search = MKLocalSearch(request: request)
        search.start { (response,error) in
        
            if let response = response {
                let mapItems = response.mapItems
                self.myLandmarks = mapItems.map {
                    MyLandmark(mapItem: $0)
                }
            }
        }
    }//get nearby landmarks

    //used of testing only
    func printMyLandmarks() {
        let sfCoord = CLLocationCoordinate2D(latitude: 37.7749,longitude: -122.4194)
        for m in 0..<self.myLandmarks.count {
            print(myLandmarks[m].name + "," + distanceFromCenter(center: sfCoord,site: myLandmarks[m].coordinate))
        }
    }//print my landmarks

    func distanceFromCenter(center: CLLocationCoordinate2D,site: CLLocationCoordinate2D) -> String {
    
        let centerLocation = CLLocation(latitude: center.latitude,longitude: center.longitude)
        let siteLocation = CLLocation(latitude: site.latitude,longitude: site.longitude)
    
        let distanceInMeters: Double = siteLocation.distance(from: centerLocation)
        let distanceString = String(format: "%.0f",distanceInMeters)
    
        return distanceString
    }//distance from center
}//extension Content View

struct MyLandmark {

    let mapItem: MKMapItem

    var id: UUID {
        return UUID()
    }

    var name: String {
        self.mapItem.placemark.name ?? "No Name Listed"
    }

    var coordinate: CLLocationCoordinate2D {
        self.mapItem.placemark.coordinate
    }

}//struct my landmark

控制台针对两个不同的区域范围显示以下内容(第 119 行)

一个包含 10 万米的列表:

皮特咖啡,31672 嬉皮酒,31796 早鸟咖啡公司,31707 星巴克,31573 安娜的家庭咖啡店,32050 Aj 的咖啡,32959 Brewja咖啡,26822 星巴克,31480 咖啡厅 4,30126 怡安咖啡,31241 佛罗多乔的咖啡和茶,28427 皮特咖啡,31642 Snappy's 咖啡馆,31613 星巴克,32015 阿特拉斯咖啡馆,31855 邓肯,32050 佐卡罗咖啡馆,24113 星巴克,31334 潘帕斯咖啡馆,31647 星巴克,30666 甜甜圈快递,32026 星巴克,32827 星巴克,30370 星巴克,29164 Valley Java 有机咖啡和茶,30348

1000 米区域的第二个列表:

SimplexiTea,237 蓝瓶咖啡,371 仪式咖啡烘焙机,455 Mavelous Coffee Bar 和 Little Griddle,122 城市仪式,576 全明星咖啡厅,412 皮特的咖啡,272 水星咖啡馆,445 库迈加,317 六分仪咖啡烘焙机,633 星球咖啡馆 SF,293 菲尔兹咖啡,734 视镜咖啡,985 爪哇咖啡馆,115 尼娜的咖啡馆,219 La Boulangerie,526 娜雅甜品咖啡厅,549 四桶咖啡,900 咖啡文化,436 V 咖啡厅,603 星巴克,309 星巴克,256 约翰尼甜甜圈,564 佛卡夏市场和面包店,645

我希望我在这里遗漏了一些简单的东西。我收到的结果显然是 无用。任何指导将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。