Zoom und Distanz von Koordinaten (MapKit)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zoom und Distanz von Koordinaten (MapKit)

    Jo Heyho Leute,

    ich bins mal wieder - eure Nervensäge ^^

    Ich hab da mal 2 Fragen (sind eher Mathematischernatur xD)

    Ich bastel ja gern mit dem MapKit rum (....) - jedenfalls würde ich gern zwei weitere Funktionen einbauen bzw. verbessern.

    Normalerweise habe ich bereits eine "CenterMap" Funktion für 2 Koordinatenpunkte. (Meine Position und Ziel)

    Diese sah erst so aus:

    Quellcode

    1. MKCoordinateRegion region;
    2. CLLocationDegrees maxLat = -90;
    3. CLLocationDegrees maxLon = -150;
    4. CLLocationDegrees minLat = 90;
    5. CLLocationDegrees minLon = 150;
    6. for(int idx = 0; idx < routes.count; idx++)
    7. {
    8. CLLocation* currentLocation = [routes objectAtIndex:idx];
    9. if(currentLocation.coordinate.latitude > maxLat)
    10. maxLat = currentLocation.coordinate.latitude;
    11. if(currentLocation.coordinate.latitude < minLat)
    12. minLat = currentLocation.coordinate.latitude;
    13. if(currentLocation.coordinate.longitude > maxLon)
    14. maxLon = currentLocation.coordinate.longitude;
    15. if(currentLocation.coordinate.longitude < minLon)
    16. minLon = currentLocation.coordinate.longitude;
    17. }
    18. region.center.latitude = (maxLat + minLat) / 2;
    19. region.center.longitude = (maxLon + minLon) / 2;
    20. region.span.latitudeDelta = maxLat - minLat;
    21. region.span.longitudeDelta = maxLon - minLon;
    22. [mvKarte setRegion:region animated:YES];
    Alles anzeigen



    Danach hab ich das ganz geändert in folgendes:

    Quellcode

    1. _routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x - southWestPoint.x, northEastPoint.y - southWestPoint.y;
    2. -(void) zoomInOnRoute
    3. {
    4. [self.map setVisibleMapRect:_routeRect];
    5. }



    _routeRect ergab sich in dieser Funktion:

    Quellcode

    1. - (void)loadRoute:(NSArray*)route {
    2. // while we create the route points, we will also be calculating the bounding box of our route
    3. // so we can easily zoom in on it.
    4. MKMapPoint northEastPoint;
    5. MKMapPoint southWestPoint;
    6. // create a c array of points.
    7. MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * route.count);
    8. for(int idx = 0; idx < route.count; idx++)
    9. {
    10. // break the string down even further to latitude and longitude fields.
    11. NSString* currentPointString = [route objectAtIndex:idx];
    12. NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
    13. CLLocationDegrees latitude = [[latLonArr objectAtIndex:0] doubleValue];
    14. CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue];
    15. // create our coordinate and add it to the correct spot in the array
    16. CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
    17. MKMapPoint point = MKMapPointForCoordinate(coordinate);
    18. //
    19. // adjust the bounding box
    20. //
    21. // if it is the first point, just use them, since we have nothing to compare to yet.
    22. if (idx == 0) {
    23. northEastPoint = point;
    24. southWestPoint = point;
    25. }
    26. else
    27. {
    28. if (point.x > northEastPoint.x)
    29. northEastPoint.x = point.x;
    30. if(point.y > northEastPoint.y)
    31. northEastPoint.y = point.y;
    32. if (point.x < southWestPoint.x)
    33. southWestPoint.x = point.x;
    34. if (point.y < southWestPoint.y)
    35. southWestPoint.y = point.y;
    36. }
    37. pointArr[idx] = point;
    38. }
    39. // create the polyline based on the array of points.
    40. self.routeLine = [MKPolyline polylineWithPoints:pointArr count:route.count];
    41. _routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x - southWestPoint.x, northEastPoint.y - southWestPoint.y;
    42. // clear the memory allocated earlier for the points
    43. free(pointArr);
    44. }
    Alles anzeigen




    Da ich nun aber das View Rotieren lasse (immer in Fahrtrichtung) fand ich es doof wenn es die größe von 320x460 behielt. Darum hab ich es einfach auf 600x600 vergrößert.

    Nun passt das mit dem setVisibleRect natürlich nicht mehr...

    Hat einer da von euch evtl. nen Tipp für mich ;D?

    Achja mein zweites Problem!!!


    Also wenn der Benutzer es will - agiert das App auch im Hintergrund - sprich es aktualisiert die Koordinaten des Ziels. Jedenfalls würde ich gern ein Funktion ausführen, falls die Ziel Koordinaten sich um 50, 100 oder 200 Meter entfernen von den ursprünglichen Koordinaten des Ziels.


    Ergo ich hab kein Plan wie ich am besten die Distanz zweier Koordinaten Berechne (mitsicherheit gibt es da was vorgefertigtes xD)


    Euer Nax
    Meine Beiträge :whistling: stehen unter der Beerware Lizenz!
  • Öhm...Also ich erzeuge in dem MapKit via OVerlay und 2 Punkten eine Route. Die CenterMaps funktion zoomt die Karte nun so ran das beide Punkte (sowie die route dazwischen) sichtbar ist.

    Diese Funktion hat auch solange gut funktion, solange die Map eine größe von 320x460 hatte.

    Weil ich die Karte drehen lasse, war das jedoch sehr unschön, weil dann bereiche des "Views" "NICHT" mit der Karte gefüllt wurden. War hat nen Rechteck das sich gedreht hat....

    Damit es für den Kunden nicht so damn shit aussieht, habe ich das MapView vergrößert. es ist nun 600x600 groß...der Center des MapView liegt jedoch in der Mitte des übergeordneten Views - ergo der Mittel Punkt der Karte ist immernoch der Mittelpunkt des windows...

    Nun funzt aber das centerMaps nicht mehr wie gewünscht - es zeigt punkt a und Punkt b ausserhalb des Windows aus und an sieht nur noch die route.

    Nun muss das ganze so angepasst werden das Punkt a und Punkt B zu sehen sind!! :D
    Meine Beiträge :whistling: stehen unter der Beerware Lizenz!
  • Also ich würde es in dem Fall eventuell mit sowas wie rudimentärer Mathematik versuchen ?

    Du kennst doch alle Werte: Position der Punkte, Größe der Map, Größe des Bildschirms und den Rotationswinkel. Der Rest ist Unterstufenmathematik.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Nax schrieb:

    Öhm...Also ich erzeuge in dem MapKit via OVerlay und 2 Punkten eine Route. Die CenterMaps funktion zoomt die Karte nun so ran das beide Punkte (sowie die route dazwischen) sichtbar ist.

    Diese Funktion hat auch solange gut funktion, solange die Map eine größe von 320x460 hatte.

    Weil ich die Karte drehen lasse, war das jedoch sehr unschön, weil dann bereiche des "Views" "NICHT" mit der Karte gefüllt wurden. War hat nen Rechteck das sich gedreht hat....

    Damit es für den Kunden nicht so damn shit aussieht, habe ich das MapView vergrößert. es ist nun 600x600 groß...der Center des MapView liegt jedoch in der Mitte des übergeordneten Views - ergo der Mittel Punkt der Karte ist immernoch der Mittelpunkt des windows...

    Nun funzt aber das centerMaps nicht mehr wie gewünscht - es zeigt punkt a und Punkt b ausserhalb des Windows aus und an sieht nur noch die route.

    Nun muss das ganze so angepasst werden das Punkt a und Punkt B zu sehen sind!! :D




    GELÖSCHT !