2017-03-10 3 views
1

Ich habe eine iOS-App mit einer Ansicht, die ein paar verschiedene Beschriftungen sowie eine kleine MKMapView enthält.Zoom MKMapView zum Anpassen von Polylinien und Anmerkungsstiften - Horizontale Ausrichtung

In der Kartenansicht habe ich eine Reiseroute (mit einer Polylinie) gezeichnet und zwei Anmerkungsstifte hinzugefügt, eine am Anfang der Route und die andere am Ende der Route.

Alles, was ich versuche, ist, die Karte Zoom/Rotation zu ändern, so dass die Polylinie und zwei Anmerkungsstifte, passen Sie die Größe der Kartenansicht. Alles, was ich versucht habe, ist jedoch gescheitert.

Mein Ansatz

1) die Polylinie in der Kartenansicht hinzufügen.

2) Verwenden Sie setVisibleMapRect, um die Kartenansicht so anzupassen, dass die Polylinie in die Karte passt. (Ich habe auch einige Padding hinzugefügt, indem Sie den Parameter Kanteneinsätze verwenden).

3) Verwenden Sie MKMapCamera, um die Drehung der Karte zu ändern, sodass die Polylinien + Pins horizontal dargestellt werden.

Hier ist mein Code:

// Convert the preview string to a 
// MKPolyline map direction object. 
MKPolyline *map_data = [self polyline_with_encoded_string:[trip preview]]; 

// Add the polyline to the map view. 
[main_map addOverlay:map_data]; 

// Set the display area around the polyline. 
[main_map setVisibleMapRect:[map_data boundingMapRect] edgePadding:UIEdgeInsetsMake(28.0, 28.0, 28.0, 28.0) animated:YES]; 

// Calculate the current clockwise degree. 
double degree = [self calculate_bearing_angle:[trip.startPoint latitude] :[trip.startPoint longitude] :[trip.stopPoint latitude] :[trip.stopPoint longitude]]; 

// Change the degree to the approriate 
// trip polyline degree (anti-clockwise). 

if ((degree >= 0) && (degree <= 90)) { 
    degree = (270 + degree); 
} 

else if ((degree > 90) && (degree <= 180)) { 
    degree = (270 - (degree - 90)); 
} 

else if ((degree > 180) && (degree <= 270)) { 
    degree = (360 - (degree - 180)); 
} 

else if ((degree > 270) && (degree <= 360)) { 
    degree = (90 + degree); 
} 

// Rotate the map so that the trip polyline 
// fits horizontally rather than vertically. 
MKMapCamera *map_camera = [[main_map camera] copy]; 
[map_camera setHeading:degree]; 
[main_map setCamera:map_camera animated:YES]; 

ich die folgende Methode bin mit dem Winkel der Polylinie, um herauszufinden:

-(double)calculate_bearing_angle:(double)start_lat :(double)start_lon :(double)end_lat :(double)end_lon { 

    // Get the seperate latitude/longitude values. 
    double from_lat = DEGREES_TO_RADIANS(start_lat); 
    double from_lon = DEGREES_TO_RADIANS(start_lon); 
    double to_lat = DEGREES_TO_RADIANS(end_lat); 
    double to_lon = DEGREES_TO_RADIANS(end_lon); 

    // Calculate the bearing angle. 
    double degree = RADIANS_TO_DEGREES(atan2(sin(to_lon - from_lon) * cos(to_lat), cos(from_lat) * sin(to_lat) - sin(from_lat) * cos(to_lat) * cos(to_lon - from_lon))); 

    if (degree >= 0) { 
     return degree; 
    } 

    else { 
     return (360 + degree); 
    } 
} 

ich alles versucht haben, aber so oder so ist das Endergebnis dass bestimmte Polylinien in bestimmten Winkeln in den richtigen horizontalen Winkel gedreht werden und andere nicht .... was für eine Erde mache ich falsch? Oder gibt es einen besseren Ansatz für dieses Problem?

Alles, was ich tun möchte, ist, dies zu ändern:

enter image description here

... dazu:

enter image description here

+0

warum übergeben Sie einen Breitengrad zu DEGREES_TO_RADIANS? –

Antwort

0

ich für mich in Ihrem Problem arbeiten, hatte Methode [[self.map camera] setHeading:90.f]; funktioniert wie beabsichtigt, also ist vielleicht Ihr Problem in der Berechnung des Radianten und des letzteren Prozesses, aber vielleicht hängt Ihr Problem auch mit der Kopie der Kamera zusammen. Ich benutze diese Methode direkt auf der Kamera und arbeite großartig. Ich hoffe, das hilft Ihnen

+0

Ich weiß, dass Code funktioniert, mein Problem besteht darin, den entsprechenden Grad neu zu berechnen, dass die Karte auch gedreht werden sollte. – Supertecnoboff

+1

Ahh ok @Supertecnoboff Ich werde weiter recherchieren, wenn ich etwas Hilfreiches finde werde ich als Update posten –

Verwandte Themen