본문 바로가기
Study/Android

좌표계 변환하기

by Answer Choi 2015. 4. 28.
반응형


좌표계 변환 소스(Google drive)

좌표계 변환 소스(Git Hub)


미세먼지 측정앱을 만들때 GPS로 현위치에서 가장 가까운 측정소 정보를 찾을 때, 흔히 쓰이는


WGS방식의 좌표가 아니라 TM좌표라 좌표계를 변환해야 합니다.ㅠ


좌표계 변환 공식을 찾아보니 제대로 된 공식을 찾지 못했고, API를 찾아보니 다음 로컬API에 있네요.


일단 API를 사용하려면 등록해서 API key를 받아야 합니다.


다음 좌표계 변환 API


API의 파라메터값은 아래와 같습니다.



일단 테스트를 위해 브라우져 하나를 열고 샘플 예제를 실행해 봅니다.

1
2
3
4
5
6
7
https://apis.daum.net/local/geo/transcoord?
apikey={apikey}
&fromCoord=WTM
&y=-4388.879299157299
&x=160710.37729270622
&toCoord=WGS84
&output=json
cs


apikey는 발급 받은걸 적으시면 됩니다.(괄호는 제거)


fromCoord는 알고있는 좌표계


toCoord는 변환할 좌표계


x와 y는 좌표(x가 경도, y가 위도가 되겠죠)


output은 출력할 포맷입니다. xml과 json이 있습니다.


출력된 값입니다.


잘되니 이제 제가 원하는 변환을 시도~

1
2
3
4
5
6
7
https://apis.daum.net/local/geo/transcoord?
apikey=본인의 APIKEY
&fromCoord=wgs
&y=33.453
&x=126.577
&toCoord=TM
&output=xml
cs

저는 wgs좌표를 tm좌표로 그리고 xml타입으로 출력했습니다.



이제 안드로이드 앱으로 적용을 시켜 보겠습니다.


앱 레이아웃입니다.


젤 위에 스피너로 좌표계 타입 설정하고, 가운데는 좌표값, 세번째는 가져오는 버튼입니다.


버튼을 누르시면 하단에 변환된 좌표가 표시됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
void getThread(){    
    String x,y;    
    if(xGrid!=null&&yGrid!=null){        
        x=xGrid.getText().toString();
        y=yGrid.getText().toString();
        GetTransCoordThread.active=true;
        GetTransCoordThread getCoordthread=new GetTransCoordThread(false,x,y,from,to);    //스레드생성
        getCoordthread.start();    //스레드 시작
    }else{        
        Toast.makeText(getApplication(),"좌표값이 모두 입력되지 않았습니다.",Toast.LENGTH_SHORT).show();    
    }
}
cs


스레드를 시작하는 부분입니다. 


스레드 클래스로 x,y좌표와 좌표계를 보냅니다.


1
2
3
4
5
6
7
8
public static void  TransCoordThreadResponse(String x,String y) {    //대기정보 가져온 결과값
        if(x.equals("NaN")||y.equals("NaN")){
            resultText.setText("좌표값이 잘못 입력되었거나 해당값이 없습니다.");
        }else{
 
            resultText.setText("변환된 좌표값은 "+x+","+y+"입니다.");
        }
    }
cs


이 부분은 파싱을 하고 넘겨준 값입니다.


파싱결과 잘못된 좌표의 경우 NaN으로 표기 되므로 잘못된 값이 아닌경우만 값을 표시해 줍니다.


풀파서로 파싱하는 부분입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
while(eventType!= XmlPullParser.END_DOCUMENT){  //문서의 끝이 아닐때
    switch(eventType){
    case XmlPullParser.START_TAG:   //'<'시작태그를 만났을때
        String tag = xpp.getName();
        if (tag.compareTo("result"== 0) { // x의 y의 속성 값을 각각 getX,getY에 넣음.
            getX=xpp.getAttributeValue(null"x");
            getY=xpp.getAttributeValue(null"y");
            parserEnd=true;
        }
        break;
    }
    eventType=xpp.next();
}
cs


앱 실행모습입니다.



아래는 잘못된 값을 입력했을 경우 입니다.



반응형

인기글