iPhone SDK içinde MapKit bir rotayı çizme

oy
53

Haritaya iki konum arasında bir rota çizmek istiyorum. Bir tur rehberi gibi bir şey. turist Başka bir konum tıkladığında, ben bir rota çizmek isterler; yanı sıra, geçerli konumdan uzaklığı hakkında bilgilendirmek.

Haritaya çoklu çizgi çizmek için nasıl anlatmak internette siteler farkındayım. Ama, örneklerin çoğunda çeşitli koordinatları ile bir önceden yüklenmiş .csv dosyasını vardı.

Konumu dinamik seçilir seçilmez, Google veya başka bir sağlayıcı koordinatları almak için alternatif bir yolu var mı.

NO, nasıl ben ara koordinatlar bilgileri nereden alıyorsunuz?

iOS 6 bu sorun için herhangi bir doğrudan yol sağlar mı?

Oluştur 14/05/2010 saat 14:37
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
61

Aşağıdaki viewDidLoad(1) iki yer, (2) önceki tüm açıklamaları kaldırmak ve (3) çağrısı kullanıcı tanımlı yardımcı fonksiyonları (rota puan almak ve rota çizmek için) ayarlar.

-(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];
}

Şu şekildedir MKMapViewDelegatebindirme çeken yöntem olup, (IOS 4.0 ve üstü).

/* 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;
}

Aşağıdaki fonksiyonu her iki konumu almak ve tüm güzergah noktalarını almak için URL'yi hazırlayacaktır. Ve tabii ki, stringWithURL arayacak.

/* 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]];
}

Aşağıdaki kodu (biz API var yanıtı için dekoder) gerçek sihir. Ben ne yapıyorum biliyor sürece bu kodu değiştirmek olmaz :)

- (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;
}

Bu fonksiyon, bir rotayı çekecek ve bir bindirme katacak.

- (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];
    }
}

Aşağıdaki kod haritasını hizaya ortalar.

- (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];
}

Bu kimse yardımcı olacağını umuyoruz.

Cevap 12/08/2012 saat 18:21
kaynak kullanıcı

oy
24

Bu ilginç bir olay. Eğer koordinatlarını biliyorsanız çizgiler çizmek için yeterince kolay, ama MapKit yollara veya diğer yönlendirme bilgilere erişim vermeyecektir: Orada MapKit ile bunu yapmak için hiçbir yoludur. Ben size veri almak için harici API çağrısı gerekir söyleyebilirim.

Ben cloudmade.com API ile oynuyoruz. Vektör akışı sunucusu neye ihtiyacınız dönmelidir ve sonra da harita üzerinde o çizebilirsiniz. Ancak, Google haritaları ve arasındaki farklılıklar OSM onlar MapKit için bir eş: CloudMade tarafından kullanılan haritaların sen CloudMade Maps, tüm yolu kullanmak istiyorum yapabilir.

Not: Diğer haritalama sağlayıcıları - Google, Bing, vb da eşdeğer veri akışlarını sağlayabilir. Son zamanlarda OSM / CloudMade bakarak oldum.

PPS: Bunların hiçbiri önemsiz acemi işi! İyi şanslar!

Cevap 14/05/2010 saat 14:59
kaynak kullanıcı

oy
12

Andiih en doğru söylemiş. MapKit Buna izin vermez. Maalesef, Google ya ne yapmak istediğini yapmasına izin vermez.

Kendi Haritalar getir, böylece herhangi bir navigasyon uygulaması haritalandırma araçlarının kendi kümesi kullanır: Elma MapKit ve tüm açıkladığında, onlar da açık bir şekilde herhangi seyir uygulamaları BYOM olacağını ifade etti.

Google'ın Hizmet Şartları bile haritaların üstünde yolları gösteren kısıtlıyor:

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

Lisans Kısıtlamaları:

10.9 veya bağlantılı olarak herhangi bir ürün, sistem veya uygulamalarla Hizmeti veya İçeriği:

(A) gerçek zamanlı navigasyon veya dahil rota yönlendirme değil turn-by-turn bir kullanıcının sensör etkin cihazının konumuna senkronize edilir hedefe gidişi sınırlı;

(B) aracın hareket otomatik veya bağımsız kontrolü için herhangi bir sistem veya işlev veya

(C) dağıtımı, filo yönetimi, iş varlık takibi veya benzeri kurumsal uygulamalar (Google Maps API otomobiller, otobüsler veya diğer araçlar gibi varlıkları (izlemek için kullanılabilir) sürece izleme uygulaması olarak olmaksızın kamuya açık yapılır şarjı. Örneğin, gerçek zamanlı toplu taşıma veya diğer ulaşım durum bilgilerini görüntüleyen bir ücretsiz, halka açık Maps API Uygulama sunabilir.

Ne yazık ki, bu Yapmanız ne istiyorsunuz içerir. Umarım bir gün MapKit muhtemel rağmen ... böyle özelliklere izin verecek şekilde genişletilecektir.

İyi şanslar.

Cevap 14/05/2010 saat 19:54
kaynak kullanıcı

oy
5

Sen de bir göz atmak isteyebilirsiniz https://github.com/leviathan/nvpolyline v.4.0 öncesinde Bu çözüm özellikle iPhone OS sürümleri yöneliktir

o da v.4.0 Hope kullanılabilse de bu yardımcı olur.

Cevap 01/07/2010 saat 15:22
kaynak kullanıcı

oy
4

Deneyin MapKit-Rota-Yol ( GitHub ).

Cevap 05/01/2011 saat 08:06
kaynak kullanıcı

oy
3

Alma ve harita üzerinde bir rota çizerek iOS 7 API ile süper kolaydır:

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];
    }
}];
Cevap 14/02/2015 saat 16:46
kaynak kullanıcı

oy
3

Bir kaç şey tartışılıyor var gibi Sadece netleştirmek için görünüyor. Biri rota köşelerini almak için bir yoldur ve diğer kişiler köşeleri kullanarak harita üzerinde bir bindirme çekmektir. Ben MapQuest API'leri biliyorum, bu yüzden aşağıda olanlar için bazı bağlantılar var - Google ve Bing bence eşdeğerleri var.

1) Bir rotanın köşeleri alınıyor
bir rota bindirme çizmek için bir rotanın yeni koordinatlar arıyorsanız, bir yönlendirme web hizmeti için bir web hizmeti çağrısı kullanabilirsiniz ya - Sana burada JavaScript kullanıyorsanız varsayarak yaşıyorum haritayı görüntülemek. Eğer yerel kod kullanıyorsanız, hala bir web hizmeti vurabilir veya bir yerli çağrısını kullanabilirsiniz (yani, MapQuest iPhone SDK içinde bir yerli rota görüşmesi var).

Çizdiğiniz böylece tarifi hizmetlerin çoğu rotanın "shapepoints" dönmelidir.

İşte shapepoints almak için MapQuest- Tarifi Web Service kullanarak bazı örneklerdir (Şekil dönüş nesnesi bakınız) - http://www.mapquestapi.com/directions/

2) Bir bindirme Çizim
size köşeleri edindikten sonra, bunları çizmek gerekiyor. Ben en çok JavaScript haritası API'leri çeşit bir bindirme sınıf var olacağını düşünüyorum. İşte MapQuest tek: http://developer.mapquest.com/web/documentation/sdk/javascript/v7.0/overlays#line

3) Bir çağrıyla de genişlemiş
MapQuest da rota arama yapmak ve sizin için çizgi çizmek için bazı konfor fonksiyonlarını var - ikiden fazla bağlantıları yazılan olamaz! Yani yukarıdaki linke gidin ve soldaki gezinme çubuğunda "yönlendirme" arayın.

Cevap 12/03/2012 saat 17:09
kaynak kullanıcı

oy
3

MapQuest MapKit için bir drop-in yerine var bir SDK vardır. Bu şu anda beta, ama aktif geliştirilme aşamasındadır.

Bu bindirmeleri, yönlendirme ve coğrafi kodlama sağlar.

MapQuest iOS Maps API

Cevap 05/03/2012 saat 00:45
kaynak kullanıcı

oy
2

Bu soruyu güncellemek için -iOS7 beri dış apk'de gerek yoktur.

İşte çok basit ve etkili bir çözüm:

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

Ben soru iOS 6 ilgiliydi biliyorum ama bu çözüm birçok kişi için yararlı olacağına inanıyoruz.

Bu çözümde tek eksik başlangıç ​​ve bitiş pimini görüntülemek için aşağıdaki temsilci yöntemi uyguluyor

-(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
Cevap 25/02/2015 saat 08:30
kaynak kullanıcı

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