在中國,是不允許使用真實的座標的,所以每個地圖服務商都會對真實的經緯度進行編碼(也可以稱之為加密吧)。舉個例子,比如人民廣場的真實的經緯度室(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座標