본문 바로가기

프로그래밍/iOS

[ios] 네이버 맵 테스트 주소->위,경도/ 위경도->주소

애플 맵 테스트할 때 같이 테스트해본 자료 

애플 맵 테스트는 이쪽 

2015/04/08 - [프로그래밍/iOS] - [ios] 주소->위, 경도로 위,경도 ->주소로





 

1. 주소를 위도, 경도로

 

- 요청

 NSString* string = @"검색 할 주소";

 //url변환

NSString* rawURL = [NSString stringWithFormat:@"http://openapi.map.naver.com/api/geocode.php?key=8ba22c62effbad53bf0795d0d44072c4&encoding=utf-8&coord=latlng&query=%@",string]; 

    NSString* encodingString = [rawURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL* url = [NSURL URLWithString:encodingString];

//주소 변환 요청

    NSURLRequest* request = [NSURLRequest requestWithURL:url];

    NSError* error = nil;

    NSData* response = nil;

    response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];

    if (error) { //에러인경우

        NSLog(@"%@",[error description]);

        

    }

    else //에러가 아닌 경우

    {

        //xml 파싱 요청

        NSXMLParser* parser  = [[NSXMLParser alloc] initWithData:response]; 

        [parser setDelegate:self];

        [parser parse];

    }

 

- 델리게이트 함수들

// xml 파싱 함수들

- (void) parser:(NSXMLParser *)parser

didStartElement:(NSString *)elementName

   namespaceURI:(NSString *)namespaceURI

  qualifiedName:(NSString *)qName

     attributes:(NSDictionary *)attributeDict

{

    if ([elementName isEqualToString:@"x"]) //x 좌표인 경우

    {

        isX = YES;

    }

    if ([elementName isEqualToString:@"y"]) //y 좌표인 경우

    {

        isY = YES;

    }

    if ([elementName isEqualToString:@"address"]) //주소 인 경우

    {

        isAddress = YES;

    }

}

//위와 셋트 위 함수는 해당하는 엘리멘트를 찾은 경우, 아래는 찾기가 끝난경우

//여기선 BOOL변수로 해당 위치에 도달했음만을 알리기 위해 YES, NO 처리

- (void) parser:(NSXMLParser *)parser

  didEndElement:(NSString *)elementName

   namespaceURI:(NSString *)namespaceURI

  qualifiedName:(NSString *)qName

{

    if ([elementName isEqualToString:@"x"])

    {

        isX = NO;

    }

    if ([elementName isEqualToString:@"y"])

    {

        isY = NO;

    }

    if ([elementName isEqualToString:@"address"])

    {

        isAddress = NO;

    }

}

//해당 엘리먼트에서 내용을 찾은 경우 해당 array에 복사

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    if (isX) {

        [xArray addObject:string];

        isX = NO;

    }

    if (isY) {

        [yArray addObject:string];

        isY = NO;

    }

    if (isAddress)

    {

        [addressArray addObject:string];

    }

}

 

//이번엔 사용하지 않음

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock

//<!CDATA> 형식의 자료를 넣는다.

{

//    if (isAddress)

//    {

//        address = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];

//    }

}

 

- (void) parserDidEndDocument:(NSXMLParser *)parser

{

    //파싱이 끝나면 불러오는 이벤트.

    if ([xArray count] == 0 ||[yArray count] == 0||[addressArray count] == 0) //결과값이 없을 경우

    {

        NSLog(@"검색결과가 존재하지 않습니다.");

        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"검색결과" message:@"검색결과가 존재하지 않습니다." delegate:self cancelButtonTitle:@"확인" otherButtonTitles:nil, nil];

        [alert show];

        return ;

    }

    //결과값중 첫번째 결과 값 사용

    float x = [[xArray objectAtIndex:0] floatValue]; //x좌표

    float y = [[yArray objectAtIndex:0] floatValue]; //y좌표

    NSArray* address = [addressArray objectAtIndex:0]; //주소

    //결과 array 비움

    [xArray removeAllObjects];

    [yArray removeAllObjects];

    [addressArray removeAllObjects];

    //맵에 해당 위치 표시

    [_mapView findPlacemarkAtLocation:NGeoPointMake(x, y)];

    NMapOverlayManager *mapOverlayManager = [_mapView mapOverlayManager];

    NMapPOIdataOverlay *poiDataOverlay = [mapOverlayManager createPOIdataOverlay];

    [poiDataOverlay initPOIdata:1];

    [poiDataOverlay addPOIitemAtLocation:NGeoPointMake(x, y) title:@"검색결과"  type:NMapPOIflagTypePin iconIndex:0 withObject:nil];

    [poiDataOverlay endPOIdata];

    [poiDataOverlay showAllPOIdata];

 

}

빨간색으로 설정한 부분이 주소가 들어갈 곳  NSString을 넣어도 된다.

파란색으로 설정한 부분이 결과 위, 경도

 

 

2. 위도, 경도를 주소로


- 요청

 float lat = -33.86;

 float lng = 151.20;

 

 [_mapView findPlacemarkAtLocation:NGeoPointMake(lat, lng)]; 

 

- 델리게이트 함수

//요청 시 결과물을 전달하는 delegate

#pragma mark - MMapReverseGeocoderDelegate

- (void) location:(NGeoPoint)location didFindPlacemark:(NMapPlacemark *)placemark

{

    //지도에 표시

    if (_mapPOIdataOverlay

    {

        NMapPOIitem *poiItem = [[_mapPOIdataOverlay poiData] objectAtIndex:0];

        if (NGeoPointIsEquals([poiItem location], location)) {

            [poiItem setTitle:[placemark address]];

            [_mapPOIdataOverlay selectPOIitemAtIndex:0 moveToCenter:NO];

        }

    }

 

}

빨간색으로 표시한 부분이 각각 위도, 경도가 들어가는 위치

파란색으로 표시한 부분이 주소를 NSString으로 저장하는 방법이다.