반응형


만들고 있는 안드로이드 어플이 네이버 검색 API를 통해 검색 결과로 나온 곳의 좌표를 받아오는데 카텍좌표계라는 것으로 값을 받아오더군요. 그런데 저는 WGS84 좌표계가 필요한 상황이었습니다 ㅠㅠ

이를 어떻게 해야할지..
처음에 열심히 검색을 했습니다. 수학 공식으라도 찾으면 그걸 프로그래밍하면되니깐요.
그러다 변환 공식이 아닌 API를 찾았습니다. 가까운 다음 지도 API좌표계 변환 API가 있더군요^^

좀 더 조사한 결과 네이버는 KTM 좌표계라는 걸 알아냈습니다.
결론 적으로 저는 다음 좌표계 변환 API를 써서 WGS84 좌표계로 변환하면 된다는 말씀!!

다음 API의 요청 주소 예는는 아래와 같습니다.

http://apis.daum.net/maps/transcoord?apikey=key&x=경도&y=위도&fromCoord=KTM&toCoord=WGS84&output=xml

파라미터로 x = 경도, y = 위도, fromCoord = 입력좌표계, toCoord = 출력좌표계, output = 출력형식 이 있네요.

모든 파라미터의 값은 string 형이고,

입,출력 좌표계의 값은 TM, KTM, UTM, CONGNAMUL, WGS84, BESSEL, WTM, WKTM, WUTM, WCONGNAMUL 이 있습니다.
위에 열거된 좌표끼리의 변환이 가능합니다.

출력 형태는 xml json 이 있고 기본은 xml입니다. 기본이 xml이니 받아와서 파싱만 하면 끝이겠군요^^

우선 KTM인 좌표 x=311277, y=552098을 KTM에서 WGS84로 변환하여 xml로 받아오도록 URL을 익스플로러에 보내보면


이렇게 xml로 값을 받아 오는군요 .

그럼 간단히 필요에 따라 아래와 비슷하게 메소드 하나만 만들면 될 것 같네요.^^
제가 만든 코드가 너무 허접하여 고수님들께서 댓글 좀 남겨주시면 감사하겠습니다.
다른 코드들을 보니깐 좌표를 x와 y로 표현한게 많던데 그렇게 하면 경도와 위도가 헷갈려서 힘들더라구요 ㅎㅎ
그래서 저는 longitude와 latitude라고 변수명을 줬습니다.

HashMap과  XmlPullParser를 사용하기 위해 사전에 import시켜줍니다.
import java.util.HashMap;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

그리고 메소드를 만들어 봐요~ ㅋㅋㅋㅋㅋ

 private HashMap<String, String> transCoord(String longitude, String latitude) { 

       private HashMap<String, String> map = new HashMap<String,String>();  //경위도를 넣을 해시에용

       final String key = "key"; //이부분의 발급받은 Key를 넣습니당.
         
       try {
        //다음 API를 사용하여 ㅁㅁㅁ 형식의 좌표를 ㅇㅇㅇ형태로 바꾼다 XML로 받아 와서 파싱한다.
        URL text = new URL("http://apis.daum.net/maps/transcoord?"
              +"apikey=" + key        //apikey
              +"&x=" + longitude                 //원래 좌표계 경도
              +"&y=" + latitude                 //원래 좌표계 위도
              +"&fromCoord=KTM"  //원래 좌표계
              +"&toCoord=WGS84"   //변환한 후 좌표계
              +"&output=xml");        //출력형식
      
     //파서를 생성하고 파싱을 시작해요. 
     XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
     XmlPullParser parser = parserCreator.newPullParser();
     parser.setInput(text.openStream(), null);
     int parserEvent = parser.getEventType();
    while (parserEvent != XmlPullParser.END_DOCUMENT) {
           switch(parserEvent) {
             case XmlPullParser.START_TAG:
                String tag = parser.getName();
                if (tag.compareTo("result") == 0) { //파서가 result 태그를 만나면 x의 y의 속성 값을 각각 longitude,latitude에 넣음.
                      map.put("longitude", parser.getAttributeValue(null, "x"));             
                      map.put("latitude", parser.getAttributeValue(null, "y"));
              }
              break;
            }
        parserEvent = parser.next();
     }
    } catch (Exception e) {
     Log.e("Net", "Error in network call", e);
       }
       return map;
   }

제가 만든 메소드를 사용해서 HashMap 으로 결과를 받아오면 매우 편리할거에요^^ 아마도 ㅎㅎ
더 편리한 방법 제보를 기다립니당~^^
반응형

+ Recent posts