iOS基於百度地圖的開發(6)——google座標轉換成百度座標

來源:互聯網
上載者:User

在中國,是不允許使用真實的座標的,所以每個地圖服務商都會對真實的經緯度進行編碼(也可以稱之為加密吧)。舉個例子,比如人民廣場的真實的經緯度室(LON, LAT),那麼百度提供的經緯度為(LON_B, LAT_B),google提供的經緯度為(LON_G, LAT_G)。在地圖上的顯示結果如下:

  LON, LAT LON_B, LAT_B LON_G, LAT_G
百度地圖 顯示位置不是人民廣場 顯示位置是人民廣場 顯示位置不是人民廣場
google地圖 顯示位置不是人民廣場 顯示位置不是人民廣場 顯示位置是人民廣場

所以,只能在百度地圖上使用百度的經緯度,在Google地圖上使用Google的經緯度,否則顯示的位置不正確。在使用相應地圖時,比如要放置一個POI Annotation,那麼這個點的座標必須是該地圖的座標。反過來,比如百度地圖自己搜尋出來了POI,那麼這些POI都是百度座標,所以使用者此時擷取到的座標是百度座標。

百度提供了介面,可以將真實的經緯度和Google經緯度轉換成百度經緯度(也稱之為將真實座標和Google座標轉換成百度座標)。可以在http://dev.baidu.com/wiki/static/map/API/examples/?v=1.3&0_6#0&6上進行測試。

下面是從google座標轉換成百度座標的代碼。

//同步請求

+ (CLLocationCoordinate2D)shiftCoordinateFromGoogleToBaidu:(CLLocationCoordinate2D)googleCoordinate{    NSString *urlString =[[NSString stringWithFormat:@"http://api.map.baidu.com/ag/coord/convert?from=2&to=4&x=%f&y=%f", googleCoordinate.longitude, googleCoordinate.latitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//如果轉換GPS到百度則from=0        NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];        [request setURL:[NSURL URLWithString:urlString]];    [request setHTTPMethod:@"GET"];        NSHTTPURLResponse *urlResponse = nil;                       NSError *error = [[NSError alloc] init];    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];    NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];    NSLog(@"result:::: %@",result);    SBJsonParser *parser = [[SBJsonParser alloc] init];    NSDictionary* memblist=[parser objectWithString:result error:nil];        NSString* X=[[memblist objectForKey:@"x"] retain];    NSString* Y=[[memblist objectForKey:@"y"] retain];    NSString *stringValue = X;    Byte inputData[[stringValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];    [[stringValue dataUsingEncoding:NSUTF8StringEncoding] getBytes:inputData];    size_t inputDataSize = (size_t)[stringValue length];    size_t outputDataSize = EstimateBas64DecodedDataSize(inputDataSize);    Byte outputData[outputDataSize];//prepare a Byte[] for the decoded data    Base64DecodeData(inputData, inputDataSize, outputData, &outputDataSize);    NSData *theData = [[NSData alloc] initWithBytes:outputData length:outputDataSize];    NSString *resultX = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];        CLLocationCoordinate2D newCoordinate;    newCoordinate.longitude=[resultX doubleValue];    [theData release];    [resultX release];    stringValue = Y;    Byte inputData1[[stringValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];    [[stringValue dataUsingEncoding:NSUTF8StringEncoding] getBytes:inputData1];    inputDataSize = (size_t)[stringValue length];    outputDataSize = EstimateBas64DecodedDataSize(inputDataSize);    Byte outputData1[outputDataSize];    Base64DecodeData(inputData1, inputDataSize, outputData1, &outputDataSize);    theData = [[NSData alloc] initWithBytes:outputData1 length:outputDataSize];    resultX = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];    newCoordinate.latitude=[resultX doubleValue];    return newCoordinate;}

//非同步請求:

- (void)shiftCoordinateFromGoogleToBaidu:(CLLocationCoordinate2D)googleCoordinate{    static CLLocationCoordinate2D newCoordinate;    NSString *urlString =[[NSString stringWithFormat:@"http://api.map.baidu.com/ag/coord/convert?from=2&to=4&x=%f&y=%f", googleCoordinate.longitude, googleCoordinate.latitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];        NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];        [request setURL:[NSURL URLWithString:urlString]];    [request setHTTPMethod:@"GET"];    NSOperationQueue* operationQueue=[[NSOperationQueue alloc]init];    [NSURLConnection sendAsynchronousRequest:request                                        queue:operationQueue                            completionHandler:^(NSURLResponse*urlResponce,NSData*responseData,NSError*error)     {         if(error)         {             NSLog(@"error:\n%@",error);             return ;         }                  NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];         SBJsonParser *parser = [[SBJsonParser alloc] init];         NSDictionary* memblist=[parser objectWithString:result error:nil];             NSString* X=[[memblist objectForKey:@"x"] retain];         NSString* Y=[[memblist objectForKey:@"y"] retain];         NSString *stringValue = X;         Byte inputData[[stringValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];         [[stringValue dataUsingEncoding:NSUTF8StringEncoding] getBytes:inputData];         size_t inputDataSize = (size_t)[stringValue length];         size_t outputDataSize = EstimateBas64DecodedDataSize(inputDataSize);         Byte outputData[outputDataSize];//prepare a Byte[] for the decoded data         Base64DecodeData(inputData, inputDataSize, outputData, &outputDataSize);         NSData *theData = [[NSData alloc] initWithBytes:outputData length:outputDataSize];         NSString *resultX = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];                  newCoordinate.longitude=[resultX doubleValue];         [theData release];         [resultX release];         stringValue = Y;         Byte inputData1[[stringValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];         [[stringValue dataUsingEncoding:NSUTF8StringEncoding] getBytes:inputData1];         inputDataSize = (size_t)[stringValue length];         outputDataSize = EstimateBas64DecodedDataSize(inputDataSize);         Byte outputData1[outputDataSize];         Base64DecodeData(inputData1, inputDataSize, outputData1, &outputDataSize);         theData = [[NSData alloc] initWithBytes:outputData1 length:outputDataSize];         resultX = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];         newCoordinate.latitude=[resultX doubleValue];         NSLog(@"Coordinate:%f,%f",newCoordinate.longitude,newCoordinate.latitude);                  //在這雷根據轉換後的經緯度進行後續邏輯處理     }     ];    [operationQueue release];}

其中用到了JSON和Base64Transcode包,可以到網上搜尋一下。

iOS基於百度地圖的開發(1)——使用者當前位置

iOS基於百度地圖的開發(2)——擷取POI

iOS基於百度地圖的開發(3)——地址搜尋

iOS基於百度地圖的開發(4)——路徑搜尋

iOS基於百度地圖的開發(5)——核心問題匯總

iOS基於百度地圖的開發(6)——google座標轉換成百度座標

iOS基於百度地圖的開發(7)——百度座標轉換成Google座標

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.