Rajz egy útvonalat MapKit iPhone SDK

szavazat
53

Szeretném felhívni az útvonal két hely között a térképen. Olyasmi, mint egy idegenvezető. Amikor a turista rákattint egy másik helyre, azt akarom, hogy képes arra, hogy egy útvonal; valamint tájékoztatja a távolság a jelenlegi helyen.

Tisztában vagyok a helyek az interneten, amelyek megmondják, hogyan kell felhívni vonalláncok térképen. De a legtöbb példa volt előre feltöltött CSV-fájlba különböző koordinátákat.

Van egy másik módja, hogy a koordinátákat a Google vagy bármely más szolgáltató, mivel a helyszín kiválasztásakor dinamikusan.

Ha nem, hogyan jutok az információkat közbülső koordináták?

Nincs iOS 6 nyújt semmilyen közvetlen módon ezt a problémát?

A kérdést 14/05/2010 14:37
a forrás felhasználó
Más nyelveken...                            


9 válasz

szavazat
61

A következő viewDidLoadlesz (1) meghatározott, két helyszínen, (2) távolítsa el az eddigi jelölések, és (3) hívás a felhasználó által meghatározott segítő funkciókat (hogy útvonal pontokat, és felhívni az útvonal).

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

A következő a MKMapViewDelegatemódszer, amely felhívja a overlay (IOS 4.0 és később).

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

Az alábbi függvény kap mind a helyszínek, és előkészíti az URL, hogy minden út pont. És persze, hívja 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]];
}

A következő kód az igazi varázslat (dekóder a választ kaptunk a API). Én nem módosítja a kódot, ha nem tudom, mit csinálok :)

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

Ez a funkció készít egy útvonalat, és adjunk hozzá egy sablont.

- (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 következő kód középre igazítsa a térképet.

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

Remélem ez segít valaki.

Válaszolt 12/08/2012 18:21
a forrás felhasználó

szavazat
24

Ez egy trükkös egy. Nincs módja, hogy a MapKit: ez elég könnyű felhívni a sorok, ha tudod, hogy a koordinátákat, de MapKit nem kapsz hozzáférést az utak vagy más routing információk. Azt mondanám, meg kell hívni egy külső API-hoz kap az adatokat.

Már játszik cloudmade.com API. A vektor patak szerver vissza kell térnie, amire szüksége van, és akkor lehet felhívni, hogy több mint a térképen. Ugyanakkor közötti eltérések Google térképek és a OSM térképek által használt cloudmade tehet a használni kívánt cloudmade térképek egészen: vannak olyan egyenértékű MapKit.

PS: Egyéb térképezés szolgáltatók - Google, Bing, stb is egyenértékű adatokat táplálja. Épp most néztem OSM / Cloudmade közelmúltban.

PPS: Egyik ez triviális újszülött cucc! Sok szerencsét!

Válaszolt 14/05/2010 14:59
a forrás felhasználó

szavazat
12

Andiih azon igaza van. MapKit nem engedhetem meg. Sajnos a Google nem engedi, hogy tegye, amit akar csinálni sem.

Amikor az Apple bejelentette MapKit és minden, ők is határozottan kijelentette, hogy minden navigációs alkalmazás lenne BYOM: Bring Your Own Maps, így minden navigációs alkalmazás saját készlet térképészeti eszközöket.

Google szolgáltatási feltételek korlátozhatja a még megjelenítését útvonalak tetején a térképek:

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

Licenc korlátozások:

10.9 a Szolgáltatás vagy elégedett bármilyen termékek, rendszerek, vagy az alkalmazásokat, vagy azokkal kapcsolatban:

(A) valós idejű navigáció vagy útmutatás, beleértve, de nem kizárólagosan a turn-by-turn útvonalvezetési hogy szinkronban legyen a helyzet egy felhasználó érzékelővel ellátott eszköz;

(B) bármely rendszer vagy funkció automatikus vagy autonóm a jármű viselkedését; vagy

(C) az elszállítást flotta menedzsment, üzleti nyomon követése, vagy hasonló vállalati alkalmazások (Google Maps API használható a pálya eszközök (például az autók, buszok és egyéb járművek), amíg a nyomkövető alkalmazás számára rendelkezésre bocsátják a nyilvánosság nélkül díjat. például akkor felajánl egy ingyenes, nyilvános Maps API megvalósítása, amely megjeleníti a valós idejű tömegközlekedési vagy más közlekedési állapot információt.

Sajnos, ez magában foglalja, hogy mit szeretne csinálni. Remélhetőleg egy nap MapKit bővül, hogy az ilyen funkciók ... bár nem valószínű.

Sok szerencsét.

Válaszolt 14/05/2010 19:54
a forrás felhasználó

szavazat
5

Érdemes egy pillantást https://github.com/leviathan/nvpolyline Ez a megoldás különösen célozza iPhone OS verziók előtt v.4.0

Bár ez is lehet használni v.4.0 Remélem ez segít.

Válaszolt 01/07/2010 15:22
a forrás felhasználó

szavazat
4

Próbálja MapKit-Route-Directions ( GitHub ).

Válaszolt 05/01/2011 08:06
a forrás felhasználó

szavazat
3

Beszerzése és a rajz egy útvonalat a térképen szuper könnyű 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];
    }
}];
Válaszolt 14/02/2015 16:46
a forrás felhasználó

szavazat
3

Csak tisztázni, úgy néz ki, van egy pár dolog, a tárgyalások folynak. Az egyik módja, hogy a csúcsok egy útvonalat, a másik pedig, hogy dolgozzon egy overlay térkép segítségével azok a pontok. Tudom, hogy a MapQuest API-kat, úgyhogy van néhány link azoknak az alábbiakban - a Google és a Bing van ekvivalens azt hiszem.

1) Első csúcsai egy útvonal
Ha keres az új koordinátáit egy utat, hogy dolgozzon egy útvonalat overlay, vagy használhatja egy webes szolgáltatás hívást egy routing webes szolgáltatás - Gondolom, te a JavaScript ide megjeleníti a térképen. Ha használja a natív kód, akkor is megüt egy webes szolgáltatás, vagy használhatja a natív hívás (azaz a MapQuest iPhone SDK natív útvonal hívás benne).

A legtöbb irányból szolgáltatások vissza kell térnie a „shapepoints” az útvonalat úgy, hogy rajzolhat.

Íme néhány példa segítségével MapQuest- Directions Web Service kap shapepoints (lásd a Shape visszatérési objektum) - http://www.mapquestapi.com/directions/

2) Rajz overlay
Miután a csúcsokat, meg kell felhívni őket. Azt hiszem, a legtöbb JavaScript API térkép lesz overlay osztály néhány sort. Itt a MapQuest egy: http://developer.mapquest.com/web/documentation/sdk/javascript/v7.0/overlays#line

3) Csinálni egy hívás
MapQuest is van néhány kényelmi funkciók, hogy az útvonal hívást, és húzzuk meg a határt az Ön számára - nem tudok küldeni több mint két linket! Így megy a fenti linkre és keresse a „routing” a navigációs sáv a bal oldalon.

Válaszolt 12/03/2012 17:09
a forrás felhasználó

szavazat
3

MapQuest egy SDK-t a leváltására irányuló MapKit. Ez jelenleg béta, de fejlesztés alatt.

Ez lehetővé teszi, rátétek, útválasztó és geokódoláshoz.

MapQuest iOS Maps API

Válaszolt 05/03/2012 00:45
a forrás felhasználó

szavazat
2

Ha frissíteni ezt a kérdést, nincs szükség külső apk óta iOS7.

Itt egy nagyon egyszerű és hatékony megoldást:

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

Tudom, hogy a kérdés az volt iOS 6, de úgy vélem, hogy ez a megoldás hasznos lesz sok ember számára.

Az egyetlen dolog hiányzik ez a megoldás megvalósítása a következő küldött, hogy jelenítse meg a kezdő és záró csapot

-(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
Válaszolt 25/02/2015 08:30
a forrás felhasználó

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