2012-10-22 12 views
5

में ज़ूम किए जाने पर रूट लाइन सड़कों का पालन करें, मैंने सरल एप्लिकेशन लिखा जो मैपकिट पर दो स्थानों के बीच मार्ग खींचता है। मैं Google मानचित्र एपीआई का उपयोग कर रहा हूं। मैंने ऑनलाइन संसाधनों का उपयोग किया था और यहां Google का अनुरोध करने के लिए मैं जिस कोड का उपयोग कर रहा हूं:मैपकिट -

_httpClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://maps.googleapis.com/"]]; 
    [_httpClient registerHTTPOperationClass: [AFJSONRequestOperation class]]; 
    [_httpClient setDefaultHeader:@"Accept" value:@"application/json"]; 

    NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; 
    [parameters setObject:[NSString stringWithFormat:@"%f,%f", coordinate.latitude, coordinate.longitude] forKey:@"origin"]; 
    [parameters setObject:[NSString stringWithFormat:@"%f,%f", endCoordinate.latitude, endCoordinate.longitude] forKey:@"destination"]; 
    [parameters setObject:@"true" forKey:@"sensor"]; 

    NSMutableURLRequest *request = [_httpClient requestWithMethod:@"GET" path: @"maps/api/directions/json" parameters:parameters]; 
    request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];  
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){ 
     NSInteger statusCode = operation.response.statusCode; 

     if (statusCode == 200) 
     { 
      NSLog(@"Success: %@", operation.responseString); 
     } 
     else 
     { 
      NSLog(@"Status code = %d", statusCode); 
     } 
    } 
             failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
              NSLog(@"Error: %@", operation.responseString); 

             } 
    ]; 

    [_httpClient enqueueHTTPRequestOperation:operation]; 

यह बेकार ढंग से काम करता है।

LA - Chicago route zoomed out

लेकिन: जब मैं इस चलाने के लिए और ला और शिकागो के बीच मार्ग दिखाने के लिए प्रयास करते हैं, यह इस प्रकार की तरह लग रहा है। जब मैं सड़क के स्तर के लिए नक्शे ज़ूम है, तो यहां मार्ग की तरह लग रहा है:

LA - Chicago route zoomed in

क्या किसी को पता है कि मैं कैसे प्राप्त कर सकते हैं कि मार्ग मैं ड्राइंग हूँ सड़कों इस प्रकार जब नक्शा ज़ूम इन करता है? मैं सड़कों के माध्यम से सटीक पथ दिखाने के लिए मार्ग चाहता हूं। मुझे नहीं पता कि Google को मेरे अनुरोध में कुछ अतिरिक्त पैरामीटर जोड़ने की आवश्यकता है या नहीं।

कोई भी मदद या सलाह बहुत अच्छी होगी। अग्रिम में बहुत धन्यवाद!


[संपादित करें # 1: जोड़ना अनुरोध URL और गूगल से प्रतिक्रिया]

ऊपर कोड से आपरेशन वस्तु बनाने के बाद मेरा अनुरोध URL ऐसा दिखाई देगा:

http://maps.googleapis.com/maps/api/directions/json?sensor=true&destination=34%2E052360,-118%2E243560&origin=41%2E903630,-87%2E629790 

बस पेस्ट कि अपने ब्राउज़र पर यूआरएल और आप जेएसओएन डेटा देखेंगे जो Google मेरे कोड में प्रतिक्रिया के रूप में भेजता है।


[# 2 संपादित करें: गूगल से जवाब पार्स और पथ निर्माण]

- (void)parseResponse:(NSData *)response 
{ 
    NSDictionary *dictResponse = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:nil]; 
    NSArray *routes = [dictResponse objectForKey:@"routes"]; 
    NSDictionary *route = [routes lastObject]; 

    if (route) 
    { 
     NSString *overviewPolyline = [[route objectForKey: @"overview_polyline"] objectForKey:@"points"]; 
     _path = [self decodePolyLine:overviewPolyline]; 
    } 
} 

- (NSMutableArray *)decodePolyLine:(NSString *)encodedStr 
{ 
    NSMutableString *encoded = [[NSMutableString alloc] initWithCapacity:[encodedStr length]]; 
    [encoded appendString:encodedStr]; 
    [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\" 
           options:NSLiteralSearch 
            range:NSMakeRange(0, [encoded length])]; 
    NSInteger len = [encoded 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 = [encoded 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 = [encoded 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]; 

     CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]]; 
     [array addObject:location]; 
    } 

    return array; 
} 
+0

मैं इस पुस्तकालय का उपयोग कर रहा हूं। यह मेरे लिए अच्छा काम कर रहा है। https://github.com/kadirpekel/MapWithRoutes –

उत्तर

1

ऐसा लगता है कि गूगल आपको सभी अंक देने का नहीं है, या आप सभी बिंदुओं को नहीं देख रहे। दरअसल, मैं प्लेमार्क्स के बीच पोलीलाइनों की अपेक्षा करता हूं, न केवल आपके जैसे प्लेसमार्क (सीधी रेखा के साथ)।

जवाब में
  • चेक DirectionsStatus अगर आप सीमित हैं
  • json डेटा Google वापस भेजता है कि प्रदान करें देखने के लिए।

मुझे यकीन नहीं है कि वे Google द्वारा उपयोग किए गए एक से मूल रूप से अलग मर्केटर प्रक्षेपण का उपयोग करते हैं।

+0

उत्तर के लिए धन्यवाद, सिरिल। मेरे प्रश्न में संपादन # 1 देखें, मैंने वहां आपके द्वारा पूछे गए डेटा प्रदान किए हैं। – uerceg

+0

संपादन # 2 में मैंने सोर्स कोड जोड़ा जो Google से जवाब देता है और पथ बनाता है। मैंने अब ड्राइविंग से चलने के तरीके को बदलने की कोशिश की और दिलचस्प बात यह है कि हालांकि Google से जेएसओएन प्रतिक्रिया स्पष्ट रूप से ड्राइविंग मोड की तुलना में बड़ी है, फिर भी मैं रास्ते में चलने के लिए अंत में 205 निर्देशांक प्राप्त करता हूं, और ड्राइविंग के लिए मुझे 203 निर्देशांक मिलते हैं पथ। अजीब। – uerceg

+0

दुर्भाग्य से मुझे आपकी मदद करने के लिए दिशा-निर्देश API का पर्याप्त ज्ञान नहीं है। मुझे लगता है कि दस्तावेज में यह वाक्य एक महत्वपूर्ण तत्व है: "overview_polyline में एक ऑब्जेक्ट होता है जिसमें एन्कोडेड पॉइंट्स की एक सरणी होती है जो परिणामी दिशाओं के अनुमानित (चिकनी) पथ का प्रतिनिधित्व करती है।" एक छोटे से मार्ग के साथ एक ही अनुरोध का प्रयास करें और देखें कि यह अधिक सटीक है, या बेहतर है, फिर भी एनवाई या एलए में वास्तव में स्क्वायर रूट आज़माएं, यह देखने के लिए कि क्या आपका मार्ग बेहतर हो जाता है जब आप निकट मार्ग का अनुरोध करते हैं। –

0

मुझे विश्वास है कि MapKit द्वारा प्रयोग किया जाता प्रक्षेपण गूगल मैप्स द्वारा प्रयोग किया जाता है कि से अलग है। MapKit uses Cylindrical Mercator, जबकि Google uses a variant of the Mercator Projection

बीच सिस्टम समन्वय परिवर्तित यद्यपि आप सामान्य रूप से जब आप करने के लिए और अन्य समन्वय प्रणाली से बदलने की आवश्यकता अक्षांश और देशांतर मानों का उपयोग कर मानचित्र पर अंक निर्दिष्ट, वहाँ बार हो सकता है। उदाहरण के लिए, ओवरले के आकार को निर्दिष्ट करते समय आप आमतौर पर मानचित्र बिंदुओं का उपयोग करते हैं।

Apple से उद्धरित: