Αντλώντας μια διαδρομή στο MapKit στο iPhone SDK

ψήφοι
53

Θέλω να σχεδιάσετε μια διαδρομή ανάμεσα σε δύο σημεία στο χάρτη. Κάτι σαν ξεναγός. Όταν η τουριστική κλικ άλλη τοποθεσία, θέλω να είναι σε θέση να σχεδιάσετε μια διαδρομή? καθώς και να ενημερώσει σχετικά με την απόσταση από την τρέχουσα θέση.

Γνωρίζω ιστοσελίδες στο διαδίκτυο που λένε πώς να συντάξει polylines στο χάρτη. Όμως, τα περισσότερα από τα παραδείγματα που είχε προεγκατεστημένο αρχείο .csv με διάφορες συντεταγμένες.

Είναι ένας εναλλακτικός τρόπος για να πάρετε τις συντεταγμένες από το Google ή σε οποιοδήποτε άλλο πάροχο, όπως η τοποθεσία έχει επιλεγεί δυναμικά εκεί.

Αν ΟΧΙ, πώς μπορώ να πάρω πληροφορίες για τις ενδιάμεσες συντεταγμένες;

Μήπως iOS 6 παρέχει καμία άμεσος τρόπος για αυτό το πρόβλημα;

Δημοσιεύθηκε 14/05/2010 στις 14:37
πηγή χρήστη
Σε άλλες γλώσσες...                            


9 απαντήσεις

ψήφοι
61

Τα ακόλουθα viewDidLoadθα (1) έθεσε δύο θέσεις, (2) αρθούν όλα τα προηγούμενα σχόλια, και (3) του χρήστη πρόσκληση ορίζονται βοηθητικές λειτουργίες (για να πάρετε τα σημεία της διαδρομής και να σχεδιάσετε τη διαδρομή).

-(void)viewDidLoad
{
    [super viewDidLoad];

    // Origin Location.
    CLLocationCoordinate2D loc1;
    loc1.latitude = 29.0167;
    loc1.longitude = 77.3833;
    Annotation *origin = [[Annotation alloc] initWithTitle:@"loc1" subTitle:@"Home1" andCoordinate:loc1];
    [objMapView addAnnotation:origin];

    // Destination Location.
    CLLocationCoordinate2D loc2;
    loc2.latitude = 19.076000;
    loc2.longitude = 72.877670;
    Annotation *destination = [[Annotation alloc] initWithTitle:@"loc2" subTitle:@"Home2" andCoordinate:loc2];
    [objMapView addAnnotation:destination];

    if(arrRoutePoints) // Remove all annotations
        [objMapView removeAnnotations:[objMapView annotations]];

    arrRoutePoints = [self getRoutePointFrom:origin to:destination];
    [self drawRoute];
    [self centerMap];
}

Η ακόλουθη είναι η MKMapViewDelegateμέθοδος, η οποία αντλεί επικάλυψη (iOS 4.0 και αργότερα).

/* MKMapViewDelegate Meth0d -- for viewForOverlay*/
- (MKOverlayView*)mapView:(MKMapView*)theMapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKPolylineView *view = [[MKPolylineView alloc] initWithPolyline:objPolyline];
    view.fillColor = [UIColor blackColor];
    view.strokeColor = [UIColor blackColor];
    view.lineWidth = 4;
    return view;
}

Η παρακάτω συνάρτηση θα πάρει τόσο τις θέσεις και να προετοιμάσει τη διεύθυνση URL για να πάρετε όλα τα σημεία της διαδρομής. Και φυσικά, θα καλέσει stringWithURL.

/* This will get the route coordinates from the Google API. */
- (NSArray*)getRoutePointFrom:(Annotation *)origin to:(Annotation *)destination
{
    NSString* saddr = [NSString stringWithFormat:@"%f,%f", origin.coordinate.latitude, origin.coordinate.longitude];
    NSString* daddr = [NSString stringWithFormat:@"%f,%f", destination.coordinate.latitude, destination.coordinate.longitude];

    NSString* apiUrlStr = [NSString stringWithFormat:@"http://maps.google.com/maps?output=dragdir&saddr=%@&daddr=%@", saddr, daddr];
    NSURL* apiUrl = [NSURL URLWithString:apiUrlStr];

    NSError *error;
    NSString *apiResponse = [NSString stringWithContentsOfURL:apiUrl encoding:NSUTF8StringEncoding error:&error];
    NSString* encodedPoints = [apiResponse stringByMatching:@"points:\\\"([^\\\"]*)\\\"" capture:1L];

    return [self decodePolyLine:[encodedPoints mutableCopy]];
}

Ο κώδικας που ακολουθεί είναι η πραγματική μαγεία (αποκωδικοποιητή για την απάντηση που πήραμε από το API). Δεν θα τροποποιήσει εν λόγω κώδικα, εκτός αν ξέρω τι κάνω :)

- (NSMutableArray *)decodePolyLine:(NSMutableString *)encodedString
{
    [encodedString replaceOccurrencesOfString:@"\\\\" withString:@"\\"
                                  options:NSLiteralSearch
                                    range:NSMakeRange(0, [encodedString length])];
    NSInteger len = [encodedString length];
    NSInteger index = 0;
    NSMutableArray *array = [[NSMutableArray alloc] init];
    NSInteger lat=0;
    NSInteger lng=0;
    while (index < len) {
        NSInteger b;
        NSInteger shift = 0;
        NSInteger result = 0;
        do {
            b = [encodedString characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lat += dlat;
        shift = 0;
        result = 0;
        do {
            b = [encodedString characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
       } while (b >= 0x20);
        NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lng += dlng;
        NSNumber *latitude = [[NSNumber alloc] initWithFloat:lat * 1e-5];
        NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5];
        printf("\n[%f,", [latitude doubleValue]);
        printf("%f]", [longitude doubleValue]);
        CLLocation *loc = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
        [array addObject:loc];
    }
    return array;
}

Η λειτουργία αυτή θα σχεδιάσετε μια διαδρομή και θα προσθέσει μια επικάλυψη.

- (void)drawRoute
{
    int numPoints = [arrRoutePoints count];
    if (numPoints > 1)
    {
        CLLocationCoordinate2D* coords = malloc(numPoints * sizeof(CLLocationCoordinate2D));
        for (int i = 0; i < numPoints; i++)
        {
            CLLocation* current = [arrRoutePoints objectAtIndex:i];
            coords[i] = current.coordinate;
        }

        self.objPolyline = [MKPolyline polylineWithCoordinates:coords count:numPoints];
        free(coords);

        [objMapView addOverlay:objPolyline];
        [objMapView setNeedsDisplay];
    }
}

Ο κώδικας που ακολουθεί θα επικεντρωθεί ευθυγραμμίσει το χάρτη.

- (void)centerMap
{
    MKCoordinateRegion region;

    CLLocationDegrees maxLat = -90;
    CLLocationDegrees maxLon = -180;
    CLLocationDegrees minLat = 90;
    CLLocationDegrees minLon = 180;

    for(int idx = 0; idx < arrRoutePoints.count; idx++)
    {
        CLLocation* currentLocation = [arrRoutePoints objectAtIndex:idx];

        if(currentLocation.coordinate.latitude > maxLat)
            maxLat = currentLocation.coordinate.latitude;
        if(currentLocation.coordinate.latitude < minLat)
            minLat = currentLocation.coordinate.latitude;
        if(currentLocation.coordinate.longitude > maxLon)
            maxLon = currentLocation.coordinate.longitude;
        if(currentLocation.coordinate.longitude < minLon)
            minLon = currentLocation.coordinate.longitude;
    }

    region.center.latitude     = (maxLat + minLat) / 2;
    region.center.longitude    = (maxLon + minLon) / 2;
    region.span.latitudeDelta  = maxLat - minLat;
    region.span.longitudeDelta = maxLon - minLon;

    [objMapView setRegion:region animated:YES];
}

Ελπίζω ότι αυτό θα βοηθήσει κάποιος.

Απαντήθηκε 12/08/2012 στις 18:21
πηγή χρήστη

ψήφοι
24

Πρόκειται για ένα δύσκολο ένα. Δεν υπάρχει κανένας τρόπος να το κάνουμε αυτό με MapKit: είναι αρκετά εύκολο να σχεδιάσετε γραμμές όταν γνωρίζετε τις συντεταγμένες, αλλά MapKit δεν θα σας δώσει πρόσβαση σε δρόμους ή άλλες πληροφορίες δρομολόγησης. Θα έλεγα ότι θα πρέπει να καλέσετε έναν εξωτερικό API για να πάρετε τα δεδομένα σας.

Παίζω με cloudmade.com API. Ο διακομιστής ρεύμα φορέας θα πρέπει να επιστρέψουν ό, τι χρειάζεστε, και, στη συνέχεια, μπορείτε να σχεδιάσετε ότι πάνω από το χάρτη σας. Ωστόσο, οι διαφορές μεταξύ τους χάρτες της Google και τις OSM χάρτες που χρησιμοποιούνται από Cloudmade μπορεί να σας κάνει να θέλετε να χρησιμοποιήσετε Cloudmade χάρτες σε όλη τη διαδρομή: έχουν ισοδύναμη με MapKit.

PS: Άλλοι φορείς παροχής χαρτογράφησης - Google, Bing, κλπ μπορούν επίσης να παρέχουν ισοδύναμες ροές δεδομένων. Έχω μόλις κοιτάζοντας OSM / Cloudmade πρόσφατα.

PPS: Τίποτα από αυτά δεν είναι ασήμαντο πράγματα αρχάριος! Καλή τύχη!

Απαντήθηκε 14/05/2010 στις 14:59
πηγή χρήστη

ψήφοι
12

Andiih πήρε το σωστό. MapKit δεν θα σας αφήσει να το κάνουμε αυτό. Δυστυχώς, η Google δεν θα σας αφήσει να κάνετε ό, τι θέλετε να κάνουν.

Όταν η Apple ανακοίνωσε MapKit και όλα, επίσης δήλωσε ρητά ότι όλες οι εφαρμογές πλοήγησης θα είναι BYOM: Φέρτε το δικό σας Maps, έτσι ώστε οποιαδήποτε εφαρμογή πλοήγησης χρησιμοποιεί το δικό τους σετ εργαλείων χαρτογράφησης.

Όροι Παροχής Υπηρεσιών της Google θα περιορίσει ακόμα και από εμφάνιση διαδρομής πάνω από τους χάρτες:

http://code.google.com/intl/de/apis/maps/iphone/terms.html

Περιορισμοί Άδειας:

10.9 χρήση της Υπηρεσίας ή του Περιεχομένου με προϊόντα, συστήματα ή εφαρμογές για ή σε σχέση με:

(Α) πλοήγηση σε πραγματικό χρόνο ή καθοδήγησης, που περιλαμβάνουν αλλά δεν περιορίζονται σε turn-by-turn καθοδήγησης που συγχρονίζεται με τη θέση της συσκευής αισθητήρα με δυνατότητα ενός χρήστη?

(Β) οποιαδήποτε συστήματα ή λειτουργίες για αυτόματο ή αυτόνομο έλεγχο της συμπεριφοράς του οχήματος? ή

(Γ) την αποστολή, τη διαχείριση του στόλου, την παρακολούθηση των επιχειρήσεων περιουσιακό στοιχείο, ή παρόμοιες εφαρμογές της επιχείρησης (το API Χαρτών Google μπορεί να χρησιμοποιηθεί για την παρακολούθηση των περιουσιακών στοιχείων (όπως αυτοκίνητα, λεωφορεία και άλλα οχήματα), εφόσον η εφαρμογή εντοπισμού διατίθεται στο κοινό χωρίς χρέωση. Για παράδειγμα, μπορείτε να προσφέρετε μια ελεύθερη, δημόσια εφαρμογή API Χαρτών που εμφανίζει σε πραγματικό χρόνο μέσα μαζικής μεταφοράς ή άλλες πληροφορίες κατάστασης μεταφοράς.

Δυστυχώς, αυτό περιλαμβάνει ό, τι θα θέλατε να κάνετε. Ενδεχομένως μια ημέρα MapKit θα επεκταθεί ώστε να επιτρέπουν σε τέτοιες λειτουργίες ... αν και απίθανο.

Καλή τύχη.

Απαντήθηκε 14/05/2010 στις 19:54
πηγή χρήστη

ψήφοι
5

Μπορεί να θέλετε να ρίξετε μια ματιά σε https://github.com/leviathan/nvpolyline Η λύση αυτή είναι ιδιαίτερα απευθύνεται σε εκδόσεις του iPhone OS πριν από ν.4.0

Αν και μπορεί επίσης να χρησιμοποιηθεί σε Hope ν.4.0 αυτό βοηθά.

Απαντήθηκε 01/07/2010 στις 15:22
πηγή χρήστη

ψήφοι
4

Δοκιμάστε MapKit-Route-Οδηγίες ( GitHub ).

Απαντήθηκε 05/01/2011 στις 08:06
πηγή χρήστη

ψήφοι
3

Απόκτηση και με βάση μια διαδρομή στο χάρτη είναι εξαιρετικά εύκολο με iOS 7 API:

MKDirectionsRequest *directionsRequest = [[MKDirectionsRequest alloc] init];

// Set the origin of the route to be current user location
[directionsRequest setSource:[MKMapItem mapItemForCurrentLocation]];

// Set the destination point of the route
CLLocationCoordinate2D destinationCoordinate = CLLocationCoordinate2DMake(34.0872, 76.235);
MKPlacemark *destinationPlacemark = [[MKPlacemark alloc] initWithCoordinate:destinationCoordinate addressDictionary:nil];
[directionsRequest setDestination:[[MKMapItem alloc] initWithPlacemark:destinationPlacemark]];

MKDirections *directions = [[MKDirections alloc] initWithRequest:directionsRequest];

// Requesting route information from Apple Map services
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
    if (error) {
        NSLog(@"Cannot calculate directions: %@",[error localizedDescription]);
    } else {
        // Displaying the route on the map
        MKRoute *route = [response.routes firstObject];
        [mapView addOverlay:route.polyline];
    }
}];
Απαντήθηκε 14/02/2015 στις 16:46
πηγή χρήστη

ψήφοι
3

Ακριβώς για να διευκρινίσει, μοιάζει υπάρχουν μερικά πράγματα που συζητείται. Ο ένας είναι ένας τρόπος για να πάρετε τις κορυφές μιας διαδρομής και η άλλη είναι να σχεδιάσετε μια επικάλυψη στο χάρτη χρησιμοποιώντας αυτές τις κορυφές. Γνωρίζω τα APIs MapQuest, έτσι έχω μερικές συνδέσεις για τα άτομα κάτω των - Google και Bing έχει ισοδύναμα νομίζω.

1) Να πάρει κορυφές μιας διαδρομής
Αν ψάχνετε για τις νέες συντεταγμένες μιας διαδρομής για να σχεδιάσετε μια επικάλυψη διαδρομή, μπορείτε είτε να χρησιμοποιήσετε μια κλήση υπηρεσία web σε ένα δρομολόγησης υπηρεσία web - υποθέτω ότι χρησιμοποιείτε το JavaScript εδώ για να εμφανιστεί ο χάρτης. Εάν χρησιμοποιείτε εγγενή κώδικα, μπορείτε ακόμα να χτυπήσει μια υπηρεσία web ή μπορείτε να χρησιμοποιήσετε ένα εγγενές κλήση (δηλαδή, το MapQuest iPhone SDK έχει μια εγγενή κλήση διαδρομή σε αυτό).

Οι περισσότερες από τις υπηρεσίες κατευθύνσεις θα πρέπει να επιστρέψει τα «shapepoints» της διαδρομής, έτσι ώστε να μπορείτε να σχεδιάσετε.

Εδώ είναι μερικά παραδείγματα που χρησιμοποιούν MapQuest- Υπηρεσία Οδηγίες Web, για να πάρει shapepoints (δείτε το αντικείμενο επιστροφής Shape) - http://www.mapquestapi.com/directions/

2) Σχέδιο επικάλυψης
Μόλις έχετε κορυφές σας, θα πρέπει να τους επιστήσει. Νομίζω ότι οι περισσότεροι χάρτη APIs το JavaScript θα έχει τάξη επικάλυψη κάποιου είδους. Εδώ είναι το MapQuest ένα: http://developer.mapquest.com/web/documentation/sdk/javascript/v7.0/overlays#line

3) Να κάνει αυτό με ένα τηλεφώνημα
MapQuest έχουν επίσης ορισμένες λειτουργίες ευκολία να πραγματοποιήσετε την κλήση διαδρομή και να επιστήσει την γραμμή για σας - δεν μπορώ να δημοσιεύσει περισσότερες από δύο συνδέσεις! Έτσι, πηγαίνετε στο παραπάνω σύνδεσμο και να αναζητήσουν «δρομολόγησης» στη γραμμή πλοήγησης στα αριστερά.

Απαντήθηκε 12/03/2012 στις 17:09
πηγή χρήστη

ψήφοι
3

MapQuest έχει ένα SDK που είναι μια αναπτυσσόμενη σε αντικατάσταση των MapKit. Είναι προς το παρόν σε beta, αλλά υπό ενεργό ανάπτυξη.

Επιτρέπει επικαλύψεις, δρομολόγηση, και γεωκωδικοποίηση.

MapQuest iOS Maps API

Απαντήθηκε 05/03/2012 στις 00:45
πηγή χρήστη

ψήφοι
2

Για να ενημερώσετε αυτή την ερώτηση, δεν υπάρχει καμία ανάγκη να εξωτερική apk από το iOS7.

Εδώ μια πολύ απλή και αποτελεσματική λύση:

http://technet.weblineindia.com/mobile/draw-route-between-2-points-on-map-with-ios7-mapkit-api/2/

Ξέρω ότι η ερώτηση ήταν για το iOS 6, αλλά πιστεύω ότι αυτή η λύση θα είναι χρήσιμο για πολλούς ανθρώπους.

Το μόνο πράγμα που λείπει σε αυτό το διάλυμα εφαρμόζει την ακόλουθη μέθοδο εκπρόσωπος για να εμφανιστεί η αρχή και το τέλος pin

-(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
Απαντήθηκε 25/02/2015 στις 08:30
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more