繁体   English   中英

AGSMAPView 标注未显示在触摸点上

[英]AGSMAPView callout not showing on touch point

我是 ARCGIS 的新手。 任何帮助将不胜感激。 我在 didtap 代表上显示标注像这样

func geoView(_ geoView: AGSGeoView, didTapAtScreenPoint screenPoint: CGPoint, mapPoint: AGSPoint) {
    isFromSearch = false
    MBProgressHUD.showAdded(to: self.view, animated: true)
    self.mapView.identifyLayers(atScreenPoint: screenPoint, tolerance: 12, returnPopupsOnly: false, maximumResultsPerLayer: 10) { (identifyLayerResults: [AGSIdentifyLayerResult]?, error: Error?) in
             //check for errors and ensure identifyLayerResults is not nil
        MBProgressHUD.hide(for: self.view, animated: true)
        if let error = error {
            print(error)
            return
        }
        guard let identifyLayerResults = identifyLayerResults else { return }
             // iterate the identify layer results
        guard identifyLayerResults.count > 0 else {return}
        guard identifyLayerResults[0].sublayerResults.count > 0 else {return}
        guard identifyLayerResults[0].sublayerResults[0].geoElements.count > 0 else {return}

        let result = identifyLayerResults[0].sublayerResults[0].geoElements[0].attributes
        self.identifyLayerResult = identifyLayerResults[0]
        var title: String? = nil
        var subtitle: String? = nil
        if ((result["SiteCode"] as? String) != nil) &&  ((result["SiteName"] as? String) != nil){
            title = (result["SiteCode"] as? String)
            subtitle = (result["SiteName"] as? String)
        }
        else {
            title = (result["company"] as? String)
            subtitle = (result["identifier"] as? String)
        }
        self.mapView.callout.title = title
        self.mapView.callout.detail = subtitle
        self.mapView.callout.show(at: mapPoint, screenOffset: .zero, rotateOffsetWithMap: false, animated: true)

    }
    
}

在此处输入图像描述

第一次一切正常。 但用户也可以使用 REST API 搜索地点,然后 mapview 移动到该点并显示标注

https://******/arcgis/rest/services/Google/MobileiOS3/MapServer/find?

它返回站点,我使用纬度和经度创建 ViewPoint,并显示带有缩小和放大的标注 animation 代码如下

        let pointView = AGSViewpoint(latitude: center.latitude, longitude: center.longitude, scale: 12E7)
        self.mapView.setViewpoint(pointView, duration: 2) { (value) in
            let pointView1 = AGSViewpoint(latitude: center.latitude, longitude: center.longitude, scale: 12E4)
            self.mapView.setViewpoint(pointView1, duration: 2) { (true) in
                let wgs84 = AGSSpatialReference(wkid: 4236)
                let point = AGSPoint(x: center.latitude, y: center.longitude, spatialReference: wgs84)
                let marker = AGSPictureMarkerSymbol(image: UIImage(named: "BluePushpin.png")!)
                marker.leaderOffsetX = 9
                marker.leaderOffsetY = -16
                let graphics = AGSGraphic(geometry: point, symbol: marker, attributes: nil)
                self.mGraphicOverlay.graphics.add(graphics)
                let cgPoint = CGPoint(x: self.mapView.center.x, y: self.mapView.center.y - (self.mapView.callout.frame.height + 33))
                
                print(cgPoint)
                self.mapView.callout.show(at: graphics.geometry as! AGSPoint, screenOffset: cgPoint, rotateOffsetWithMap: false, animated: true)

            }
        }

之后,当我点击 map 时,任何点标注总是显示在左上角虽然第一次 didtap 委托工作正常当我调试代码并打印标注框架时,它总是显示零 x 和零 y

在此处输入图像描述

这里发生了一些事情:

首先,我认为你有错误的空间参考。 您使用的是 4236,但 WGS84 是 4326。

注意,你可以通过引用AGSSpatialReference.wgs84()来避免这种类型的错字,所以你可以这样说:

let point = AGSPoint(x: center.latitude, y: center.longitude, spatialReference: .wgs84())

但是仔细看一下:您还使用纬度作为 X 和经度作为 Y。不幸的是,这令人困惑,但是当您创建x,y点时,您需要指定longitude,latitude ,而不是latitude,longitude

let point = AGSPoint(x: center.longitude, y: center.latitude, spatialReference: .wgs84())

这是一个常见的错误。 我们有一个帮助器 function 来简化使用纬度/经度源数据:

AGSPointMakeWGS84(center.latitude, center.longitude)

您还做了比您需要的更多的工作(尤其是在强制空间参考转换方面),并且正在引入一些可能会出现错误的潜在区域。

因此,假设您实际上需要设置 map 比例两次(我猜您正在缩放到该位置,然后再放大一点以集中注意力),您可以尝试这样的事情,这似乎不太容易出错:

let centerPoint = AGSPointMakeWGS84(center.latitude, center.longitude)
self.mapView.setViewpoint(AGSViewpoint(center: centerPoint, scale: 12E7), duration: 2) { _ in
    self.mapView.setViewpoint(AGSViewpoint(center: centerPoint, scale: 12E4), duration: 2) { _ in
        let marker = AGSPictureMarkerSymbol(image: UIImage(named: "BluePushpin.png")!)
        marker.leaderOffsetX = 9
        marker.leaderOffsetY = -16
        let graphics = AGSGraphic(geometry: centerPoint, symbol: marker, attributes: nil)
        self.mGraphicOverlay.graphics.add(graphics)

        let cgPoint = CGPoint(x: self.mapView.center.x, y: self.mapView.center.y - (self.mapView.callout.frame.height + 33))
        print(cgPoint)
        self.mapView.callout.show(at: centerPoint, screenOffset: cgPoint, rotateOffsetWithMap: false, animated: true)
        
    }
}

我承认我不完全确定你的标注 screenOffset 计算在做什么,但我已经保持原样了。

我可能还建议在为视图设置动画之前添加图形,或者在第一个 animation 之后和第二个之前添加图形(即您正在查看正确的位置但尚未放大一点),但这取决于您。

另外,我可以建议您在ArcGIS Runtime SDK for iOS 论坛上发布此类问题吗? 如果您使用正确的标签,我们会监控这个空间,但您通常会更多地关注您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM