【问题标题】:How to get centre of the route map using GoogleMaps sdk如何使用 GoogleMaps sdk 获取路线图的中心
【发布时间】:2017-05-01 05:46:27
【问题描述】:

我想在路线图的中心显示图像。 以下是用于起点和终点之间路线的代码:

        let camera1 = GMSCameraPosition.camera(withLatitude: 45.4654, longitude:9.1859, zoom: 0.0)
        self.mapView = GMSMapView.map(withFrame: cell.mapView.bounds, camera: camera1)

 Alamofire.request(url, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil)
        .validate()
        .responseJSON { response in
            switch response.result {
            case .success:
                print(response.result.value!)
                print("Validation Successful")
                let dictResponse = response.result.value as! NSDictionary
                print(dictResponse)
                 let aryRoutes = dictResponse .value(forKey:"routes" ) as! NSArray
                print(aryRoutes)

                var aryOverViewPolyLines :NSArray = []
                aryOverViewPolyLines = aryRoutes .value(forKey: "overview_polyline") as! NSArray
                print(aryOverViewPolyLines)
                let strPoints = (aryOverViewPolyLines.value(forKey: "points") as! NSArray).object(at: 0)
                let polygon = GMSPolygon()
                polygon.path = GMSPath(fromEncodedPath: strPoints as! String)
                print(strPoints)
                let rectangle = GMSPolyline.init(path: polygon.path)
                rectangle.strokeWidth = 2.0
                rectangle.strokeColor = .white
                rectangle.map = self.mapView

                let mapBounds = GMSCoordinateBounds(path: polygon.path!)
                self.mapView.animate(with: GMSCameraUpdate.fit(mapBounds, withPadding: 150.0))



                case .failure(let error):
                print(response.result.value!)
                print(error)
            }
    }

关于如何解决这个问题的任何建议。

【问题讨论】:

    标签: ios iphone google-maps swift3


    【解决方案1】:

    @mnabaa 的解决方案通过在折线上找到中间路径来工作。但是,有些路径的距离可能比其他路径长得多。因此,根据路线的不同,Mnabaa 的解决方案返回的点最终可能会比点 B 更接近点 A。下面的扩展考虑了这个问题:

    extension GMSPolyline {
        var middlePoint: CLLocationCoordinate2D? {
            guard let path = path else {
                return nil
            }
            var intermediatePoints: [CLLocationCoordinate2D] = []
            for coordinateIndex in 0 ..< path.count() - 1 {
                let startCoordinate = path.coordinate(at: coordinateIndex)
                let endCoordinate = path.coordinate(at: coordinateIndex + 1)
                let startLocation = CLLocation(latitude: startCoordinate.latitude, longitude: startCoordinate.longitude)
                let endLocation = CLLocation(latitude: endCoordinate.latitude, longitude: endCoordinate.longitude)
                let pathDistance = endLocation.distance(from: startLocation)
                let intervalLatIncrement = (endLocation.coordinate.latitude - startLocation.coordinate.latitude) / pathDistance
                let intervalLngIncrement = (endLocation.coordinate.longitude - startLocation.coordinate.longitude) / pathDistance
                for intervalDistance in 0 ..< Int(pathDistance) {
                    let intervalLat = startLocation.coordinate.latitude + (intervalLatIncrement * Double(intervalDistance))
                    let intervalLng = startLocation.coordinate.longitude + (intervalLngIncrement * Double(intervalDistance))
                    let circleCoordinate = CLLocationCoordinate2D(latitude: intervalLat, longitude: intervalLng)
                    intermediatePoints.append(circleCoordinate)
                }
            }
            return intermediatePoints[intermediatePoints.count / 2]
        }
    }
    

    它基于article by Dylan Maryk

    【讨论】:

      【解决方案2】:
      func mapView(_ mapView: GMSMapView, didTap overlay: GMSOverlay) {
          if let route = overlay as? GMSPolyline{
      
              let coordinate = route.path!.coordinate(at: (route.path!.count()-1) / 2)
              route.customMapInfoMarker!.position = CLLocationCoordinate2D(latitude: coordinate.latitude, longitude: coordinate.longitude)
              route.customMapInfoMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5)
              route.customMapInfoMarker.map = mapView
              route.customMapInfoMarker.iconView = // YOUR CUSTOM IMAGEVIEW HERE
          }
      }
      

      扩展 GMSPolyline

      extension GMSPolyline{
      
          fileprivate struct AssociatedKey {
              static var infoMarker = GMSMarker()
          }
          var customMapInfoMarker: GMSMarker! {
              get {
                  if let marker = objc_getAssociatedObject(self, &AssociatedKey.infoMarker) as? GMSMarker {
                      return marker
                  }
                  return GMSMarker()
              }
              set (newValue){
                  if let newValue = newValue {
                      objc_setAssociatedObject(
                          self,
                          &AssociatedKey.infoMarker,
                          newValue,
                          objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        相关资源
        最近更新 更多