[英]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.