我正在使用Mapbox API创建一个正在运行的应用程序,我正在努力设置MGLMapView的界限以适应用户通过运行创建的所有折线。 Mapbox在JavaScript中有一个版本:https://www.mapbox.com/mapbox-gl-js/example/zoomto-linestring/
但我不知道如何使用swift实现它。我找不到fitBounds等价物。
我将每个CLLocationCoordinate2D存储到一个名为pointsArray的数组中,并将其与mapView一起传递给结果视图控制器。
我有找到数组中两点之间最长距离的方法并将其设置为边界,但由于算法为O(n ^ 2),如果我有太多的点,则计算得太长。还有其他情况不适合所有要点。
如果您想看到任何特定代码,请告诉我。不知道要显示什么,因为我没有任何东西可以适应界限。
答案 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)
}