如何使所有坐标适合地图的边界? fitBounds等价?

时间:2017-10-29 18:11:08

标签: ios swift mapbox

我正在使用Mapbox API创建一个正在运行的应用程序,我正在努力设置MGLMapView的界限以适应用户通过运行创建的所有折线。 Mapbox在JavaScript中有一个版本:https://www.mapbox.com/mapbox-gl-js/example/zoomto-linestring/

但我不知道如何使用swift实现它。我找不到fitBounds等价物。

我将每个CLLocationCoordinate2D存储到一个名为pointsArray的数组中,并将其与mapView一起传递给结果视图控制器。

我有找到数组中两点之间最长距离的方法并将其设置为边界,但由于算法为O(n ^ 2),如果我有太多的点,则计算得太长。还有其他情况不适合所有要点。

如果您想看到任何特定代码,请告诉我。不知道要显示什么,因为我没有任何东西可以适应界限。

3 个答案:

答案 0 :(得分:5)

......或者你可以这样做

    mapView?.setVisibleCoordinates(

        coordinates,
        count: UInt(coordinates.count),
        edgePadding: UIEdgeInsetsMake(20, 20, 20, 20),
        animated: true
    )

答案 1 :(得分:1)

你可以做这样的O(n)线性算法:

var flyTo = MKMapRectNull

for coordinate in coordinateArray {
    // convert CLCoordinate to MKMapPoint
    MKMapPoint point = MKMapPointForCoordinate (coordinate1);

    let pointRect = MKMapRectMake(point.x, point.y, 0, 0)
    if MKMapRectIsNull(flyTo) {
        flyTo = pointRect
    } else {
        flyTo = MKMapRectUnion(flyTo, pointRect)
    }    
}

let coordNE = getCoordinateFromMapRectanglePoint(x: flyTo.origin.x, y: MKMapRectGetMaxY(flyTo))
let coordSW = getCoordinateFromMapRectanglePoint(x: MKMapRectGetMaxX(flyTo), y: flyTo.origin.y)
let coordinateBound = MGLCoordinateBoundsMake(coordSW, coordNE)

var edgeInsets = UIEdgeInsetsMake(20, 20, 20, 20)

mapView.setVisibleCoordinateBounds(coordinateBound, edgePadding: edgeInsets, animated: true)

----

class func getCoordinateFromMapRectanglePoint(x: Double, y: Double) -> CLLocationCoordinate2D {
    let swMapPoint = MKMapPointMake(x, y)
    return MKCoordinateForMapPoint(swMapPoint)
}

答案 2 :(得分:0)

这是我的解决方案:

 
mapView.setVisibleCoordinateBounds(generateCoordinatesBounds(forCoordinates: [myCLLocationCoordinate2D]), animated: true)

func generateCoordinatesBounds(forCoordinates coordinates: [CLLocationCoordinate2D]) -> MGLCoordinateBounds {

var maxN = CLLocationDegrees(), maxS = CLLocationDegrees() , maxE = CLLocationDegrees() , maxW = CLLocationDegrees() for coordinates in coordinates { if coordinates.latitude >= maxN || maxN == 0 { maxN = coordinates.latitude } if coordinates.latitude <= maxS || maxS == 0 { maxS = coordinates.latitude } if coordinates.longitude >= maxE || maxE == 0 { maxE = coordinates.longitude } if coordinates.longitude <= maxW || maxW == 0{ maxW = coordinates.longitude } } let offset = 0.001 let maxNE = CLLocationCoordinate2D(latitude: maxN + offset, longitude: maxE + offset) let maxSW = CLLocationCoordinate2D(latitude: maxS - offset, longitude: maxW - offset) return MGLCoordinateBounds(sw: maxSW, ne: maxNE) }