MGIS Open API 지도 Viewer (Android 용 ) -i- Ver1.1
양면인쇄 -ii- Ver1.1
변경이력 변경코드내용변경일자 1.0 초안작성 2012/11/20 1.1 변경된지도서비스로샘플변경 2016/02/02 -iii- Ver1.1
목차 1. 클래스참조... 1 1.1. 클래스... 1 1.1.1. Public Properties... 1 1.1.2. Public Methods... 1 1.2. Overlay... 2 1.2.1. Public Methods... 2 1.3. Geometry... 3 1.3.1. Public Methods... 3 1.4.... 3 1.4.1. Public Properties... 4 1.4.2. Public Methods... 4 2. 튜토리얼... 5 3. MapView SDK 샘플... 13 3.1. 초기화... 14 3.2. 지도서비스선택... 14 3.3. Marker 매쉬업... 17 3.4. Tooltip 매쉬업... 18 3.5. InfoWindow 매쉬업... 19 3.6. Overlay 객체연결... 20 3.7. 거리재기... 21 3.8. 면적재기... 21 3.9. 공간객체매쉬업... 22 3.10. 좌표변환... 25 -iv- Ver1.1
1. 클래스참조 지도표출, 매쉬업도구, 이벤트처리를빠르고손쉽게응용어플리케이션에서활용가능하도록제공되는라이브러리로대표클래스는지도뷰, 매쉬업도구, 이벤가제공됩니다. 본문서에서는대표클래스에대한정의를서술하였고세부참조는제공되는개발용도움말문서를참조바랍니다. package class Description com.mapntech.view.class 지도를표현하는 View 클래스 com.mapntech.overlay Overlay.class 매쉬업도구의최상위인터페이스 com.mapntech.overlay.geo Geometry.class 공간정보를표현하는상위객체 com.mapntech.overlay.view.class 뷰를포함한오버레이객체의최상위객체 1.1. 클래스 Package com.mapntech.view public class extends ViewGroup 지도를표현하는메인클래로 1.1.1. Public Properties Properties Description Defined by DRAWMODE_AREA 그리기모드의면적재기상수값 (static int) DRAWMODE_DISTANCE 그리기모드의거리재기상수값 (static int) 1.1.2. Public Methods Methods (Context context) ViewGroup을상속받은지도뷰객체 (Context context, String key, String servicename) ViewGroup을상속받은지도뷰객체 void setmapcenter(coordinate coord, int level) 지도의중심좌표를셋팅한다. void setmapcenter(double centerx, double centery, int level) 지도의중심좌표를셋팅한다. Defined by -1- Ver1.1
boolean setmapservice(string map) 지도서비스를요청한다 void startdistance(int mode, Paint pt) 그리기모드를셋팅한다. void enddistance() 거리재기 or 면적재기종료 int addoverlay(overlay geo) 오버레이객체를 Map에등록한다. void removeoverlay(overlay geo) Map에등록된오버레이객체를제거한다. boolean removeoverlayall() Map에등록된오버레이모두를삭제한다. Envelope getlimitmbr() 지도의최대전체영역정보를리턴한다. int getnowlevel() 현재레벨의축척정보를리턴한다. double getpixelpermeter() 현재지도축척의 1픽셀의실제거리를리턴 void zoomin() 한단계확대 void addlongtoucheventlistener(longtoucheventlistener oel) 터치이벤트등록 void addmapboundarylistener(mapboundarylistener oel) 지도영역이벤트등록 void addtoucheventlistener(toucheventlistener oel) 터치이벤트등록 void removelongtoucheventlistener(longtoucheventlistener oel) 터치이벤트제거 void removemapboundarylistener(mapboundarylistener oel) 지도영역이벤트제거 void removetoucheventlistener(toucheventlistener oel) 터치이벤트제거 1.2. Overlay Package com.mapntech.overlay public interface Overlay All Known Implementing Classes: Circle, Envelope, Geometry, InfoWindow, Marker,, Point, Polygon, Polyline, Tooltip 매쉬업객체의최상위인터페이스로하위분류로 Geometry, 로구분됩니다. Geometry는 Circle, Point, Polygon, Polyline, Envelope의상위객체로공간데이터를정의하는객체입니다. 는 InfoWindow, Marker, Tooltip 의상위객체로지도위에표현되는 View를정의하는객체입니다. 1.2.1. Public Methods Methods Defined by -2- Ver1.1
Void finallize() 객체리소스반환 Void getdraworder() 현재객체의그려지는순서를리턴 Boolean getvisible() 현재객체가지도에표현되어있는상태를리턴 void setdraworder(int zvalue) 현재객체가지도에드려질때순서를정한다 void setvisible(boolean mode) 현재객체를지도위에표현할지를셋팅 Overlay Overlay Overlay Overlay Overlay 1.3. Geometry Package com.mapntech.overlay.geo public abstract class Geometryextends Objectimplements Overlay Direct Known Subclasses: Circle, Envelope, Point, Polygon, Polyline 공간객체정보를표현하는상위객체 1.3.1. Public Methods Methods Void addcoordinate(coordinate coord) 좌표를추가한다. Void finallize() 객체리소스초기화 Coordinate getcoordinate(int idx) 좌표를리턴한다. int getcoordinatecnt() 좌표갯수를리턴한다. int getdraworder() 현재객체의그려지는순서를리턴 Paint getpaint() 그리기설정객체를리턴한다. Boolean getvisible() 지도뷰에표현상태를리턴한다 Boolean removecoordinate(int idx) 좌표를제거한다. Void setdraworder(int draworder) 현재객체가지도에드려질때순서를정한다. Void setpaint(paint pt) 그리기설정객체를등록한다. Void setvisible(boolean mode) 지도뷰에표현될지를설정한다. Defined by Geometry Geometry Geometry Geometry Geometry Geometry Geometry Geometry Geometry Geometry Geometry 1.4. Package com.mapntech.overlay.view public abstract class extends Objectimplements Overlay Direct Known Subclasses: InfoWindow, Marker, Tooltip 뷰를포함한오버레이객체의최상위객체 -3- Ver1.1
1.4.1. Public Properties Properties Description Defined by static int ATTACH_BOTTOM 자식뷰가왼쪽에위치하는상수 static int ATTACH_TOP 자식뷰가위쪽에위치하는상수 static int ATTACH_RIGHT 자식뷰가오른쪽에위치하는상수 static int ATTACH_BOTTOM 자식뷰가아래에위치하는상수 1.4.2. Public Methods Methods Void finallize() 객체리소스초기화 getchildviewitem() 연결된자식오버레이객체를리턴한다 int getchildviewitemlocation() 자식오버레이의위치리턴 Coordinate getcoord() 오버레이객체의좌표를리턴한다. int getdraworder() 현재객체의그려지는순서를리턴 Int getoffsetx() 현재뷰에중심원점으로부터 X축좌표와매칭되는좌표 Int getoffsety() 현재뷰에중심원점으로부터 Y축좌표와매칭되는좌표 getparentviewitem() 현재오버레이의부모오버레이를리턴한다. RectF getviewarea() 현재오버레이의단말화면상의존재하는영역정보를리턴한다. Boolean getvisible() 오버레이객체의 visible 상태를리턴한다. void setchildviewitem( childviewitem, int mode) 현재오버레이에자식오버레이를셋팅한다. void setcoord(coordinate coord) 오버레이객체좌표를셋팅한다. Void setdraworder(int draworder) 오버레이객체의그리는순서를설정한다. Void setoffset(int offsetx, int offsety) 오버레이객체의화면좌표를기준으로이동한다. Void setoverlayclickeventlistener(overlayclickeventlistener ocel) 클릭이벤트를등록한다. setoverlaytoucheventlistener(overlaytoucheventlistener otel) 터치이벤트를등록한다 void setvisible(boolean mode) 오버레이객체의 visible 을셋팅한다. Defined by -4- Ver1.1
2. 튜토리얼 Android SDK 를다운로드받는과정 1) 안드로이드 SDK 는안드로이드개발자사이트 (http://dev.android.com) 에서다운로드 받을수있습니다. 아래그림은이사이트의초기화면입니다. 위그림을보시면탭모양의메뉴가 7 개있습니다. 그중왼쪽으로부터 2 번째에속하는 SDK 메뉴를클릭하세요. -5- Ver1.1
SDK 메뉴에들어가시면, 위그림과같이 Download the Android SDK 페이지가호출됩니다. 그안에있는테이블이플랫폼별로 Android SDK 를다운로드받을수있는링크들을제공합니다. 사용중인 PC 의운영체제에해당되는링크를클릭하시면, 아래그림과같이파일다운로드창이나타납니다. ' 저장 ' 버튼을클릭하여파일을다운로드합니다. Android SDK 파일을다운로드후에실행합니다. -6- Ver1.1
2) 'Next >' 버튼을눌러다음페이지로넘어갑니다. 만약 JDK 가이미설치되어있다면, '< Back' 버튼을클릭합니다.. 그리고나서다시 'Next >' 버튼을클릭하세요. 그러면아래그림과같이 JDK 가발견됨이확인됩니다. -7- Ver1.1
3) 'Next >' 버튼을클릭하여다음창으로가고설치경로를지정합니다. 아래그림을 보시면, 기본설치경로가 C:\Program Files\Android\android-sdk 입니다. -8- Ver1.1
4) 다음단계는시작메뉴폴더를지정합니다. 설치중화면은아래그림을참고하세요. 5) 설치가완료되면, 아래그림과같이 'Next >' 버튼이활성화됩니다. -9- Ver1.1
6) 마지막페이지에서는설치가완료되었음을알립니다. SDK Manager 를시작할것인지를 묻습니다. Start SDK Manager 를체크하고 'Finish' 버튼을클릭합니다. 7) Android SDK Manager 라는이름의윈도우가아래그림과같이실행됩니다. 설치할 android SDK 를선택합니다. -10- Ver1.1
8) 이후아래그림과같이 Choose Package to Install 창이나타납니다. Install 버튼을 클릭하시면, 설치가시작됩니다. -11- Ver1.1
9) 패키지설치도중아래그림과같이 ADB Restart 를묻는메시지박스가팝업되면 Yes 버튼을클릭후설치가완료됩니다. -12- Ver1.1
3. MapView SDK 샘플 MapViewSDK에서제공되는 API를활용하여샘플프로그램과샘프코드를제공합니다. MapViewSDK.apk 안드로이드폰에복사한후설치합니다. MapViewSDKActivity.java Apk의존재하는 Activity 샘플코드 < 구동초기화면 > -13- Ver1.1
3.1. 초기화지도객체를생성하고해당하는지역에요청되는레벨로이동합니다. 참조 - MapViewSDKActivity.java의 mapinit() 함수참조 // 지도객체를생성합니다. this.map = new MWMap(this, "bf5ab1d4a3294328a5957ac14244eb25", "emap_kor_normal"); //WGS84 좌표를 UTM-K 좌표로좌표변환합니다. conv.setsrctype(geoellips.kwgs84, GeoSystem.kGeographic); conv.setdsttype(geoellips.kgrs80, GeoSystem.kUtmKR); Coordinate utmpoint = conv.conv(new Coordinate(126.977864, 37.566447)); //x, y, 8레벨로지도를이동합니다. map.setmapcenter( utmpoint.getx(), utmpoint.gety(), 8); 3.2. 지도서비스선택다국어지도를선택합니다. 제공되는지도의종류는일반지도 ( 국문, 영문, 일문, 중문간체, 중문번체 ), 항공지도 ( 국문, 영문, 일문, 중문간체, 중문번체 ) 를제공합니다. 참조 - MapViewSDKActivity.java의 onitemselected () 함수참조 @Override public void onitemselected(adapterview<?> arg0, View arg1, int arg2, long arg3) { if(arg2 == 0){ // 국문일반지도선택 map.setmapservice("emap_kor_normal"); else if(arg2 == 1){ // 영문일반지도선택 map.setmapservice("emap_eng_normal"); else if(arg2 == 2){ // 일문일반지도선택 map.setmapservice("emap_jan_normal"); else if(arg2 == 3){ // 중문간체일반지도선택 map.setmapservice("emap_chinag_normal"); -14- Ver1.1
else if(arg2 == 4){ // 중문번체일반지도선택 map.setmapservice("emap_chinab_normal"); else if(arg2 == 5){ // 국문항공지도선택 map.setmapservice("emap_kor_air"); else if(arg2 == 6){ // 영문항공지도선택 map.setmapservice("emap_eng_air"); else if(arg2 == 7){ // 일문항공지도선택 map.setmapservice("emap_jan_air"); else if(arg2 == 8){ // 중문간체항공지도선택 map.setmapservice("emap_chinag_air"); else if(arg2 == 9){ // 중문번체항공지도선택 map.setmapservice("emap_chinab_air"); else if(arg2 == 10){ // 중문번체항공지도선택 map.setmapservice("emap_kor_web_normal"); else if(arg2 == 11){ // 중문번체항공지도선택 map.setmapservice("emap_oldmap1"); else if(arg2 == 12){ // 중문번체항공지도선택 map.setmapservice("emap_oldmap2"); -15- Ver1.1
-16- Ver1.1
3.3. Marker 매쉬업 지도위의지점에이미지또는텍스트로매쉬업합니다. 참조 - MapViewSDKActivity.java의 setmarker () 함수참조 // 지도에등록된오버레이객체전부를제거한다. this.map.removeoverlayall(); Bitmap markerbitmap = this.getbitmap(r.drawable.gpspin); // 마커객체생성 Marker mk = new Marker(new Coordinate(this.centerX, this.centery)," 시작 ",markerbitmap); // 마커객체등록 this.map.addoverlay(mk); // 이미지의중심을원점으로지도좌표와매핑되도록셋팅한다. mk.setoffset(0, -markerbitmap.getheight()/2); // 마커의텍스트사이즈셋팅 mk.settextsize(50); // 텍스트의중심을원점으로지도좌표와매핑되도록셋팅한다. mk.settextoffset(0, mk.gettextsize()/2); // 마터의텍스트칼라를셋팅한다. mk.settextcolor(color.blue); // 마커에터치이벤트를등록한다. mk.setoverlaytoucheventlistener(this); // 심볼의투명도를셋팅한다. mk.setsymbolalpha(200); -17- Ver1.1
3.4. Tooltip 매쉬업지도위의지점에툴팁으로매쉬업합니다. 참조 - MapViewSDKActivity.java의 settooltip () 함수참조 // 지도에등록된오버레이객체전부를제거한다. map.removeoverlayall(); // 툴팁객체를생성한다. Tooltip tt = new Tooltip( new Coordinate(this.centerX+100, this.centery+100)," 첫줄 \r\n 두번째줄.\r\n 세번째줄 \r\n 네번째줄 "); // 툴팁의텍스트사이즈를설정한다 tt.settextcolor(color.blue); // 툴팁의텍스트사이즈를설정한다. tt.settextsize(15); // 툴팁에클릭이벤트를등록한다. tt.setoverlayclickeventlistener(this); // 맵에툴팁을등록한다. map.addoverlay(tt); Tooltip tt1 = new Tooltip(new Coordinate(this.centerX+300, this.centery+300)," 시작아이콘입니다 \r\n 길이테스트. \r\n 세줄테스트 "); tt1.settextsize(20); tt1.setoverlaytoucheventlistener(this); map.addoverlay(tt1); -18- Ver1.1
3.5. InfoWindow 매쉬업지도위의지점에인포윈도우로매쉬업합니다. 참조 - MapViewSDKActivity.java의 setinfobox () 함수참조 // 지도에등록된오버레이객체를제거한다. map.removeoverlayall(); // 텍스트뷰생성 TextView textview = new TextView(this); textview.settext(" 인포박스테스트 "); textview.settextcolor(color.red); textview.settextsize(20); textview.setpadding(0, 0, 0, 0); // 이미지뷰생성 ImageView wifiimage = new ImageView(this); wifiimage.setimageresource(r.drawable.poi_food); // 이미지뷰생성 ImageView g3image = new ImageView(this); g3image.setimageresource(r.drawable.threegs_icon); // 인포박스에삽입하기위한레이아웃정의 LinearLayout innerlayout = new LinearLayout(this); android.widget.linearlayout.layoutparams param = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); innerlayout.setorientation(linearlayout.vertical); innerlayout.addview(textview); innerlayout.addview(wifiimage); innerlayout.addview(g3image); // 인포박스객체생성 InfoWindow iw = new InfoWindow(new Coordinate(this.centerX, this.centery), null, innerlayout, param); // 지도에인포박스등록 map.addoverlay(iw); -19- Ver1.1
3.6. Overlay 객체연결매쉬업객체의연결성정보를설정하여 Overlay 객체와연결합니다. 참조 - MapViewSDKActivity.java의 setoverlayconnect () 함수참조 TextView textview = new TextView(this); textview.settext(" 인포박스테스트 "); textview.settextcolor(color.red); textview.settextsize(20); textview.setpadding(0, 0, 0, 0); Rect margin2 = new Rect(10, 30, 10, 10); ImageView wifiimage = new ImageView(this); wifiimage.setimageresource(r.drawable.wifi_icon); ImageView g3image = new ImageView(this); g3image.setimageresource(r.drawable.threegs_icon); LinearLayout innerlayout = new LinearLayout(this); android.widget.linearlayout.layoutparams param = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); innerlayout.setorientation(linearlayout.vertical); innerlayout.addview(textview); innerlayout.addview(wifiimage); innerlayout.addview(g3image); // 인포박스생성 InfoWindow iw = new InfoWindow(margin2, innerlayout, param); //map.addoverlay(iw); Marker mk3 = new Marker(new Coordinate(this.centerX-200, this.centery-200),null, this.getbitmap(r.drawable.poi_subway)); mk3.setoffset(0, -57/2); mk3.setoverlaytoucheventlistener(this); // 마커에인포박스를등록한다. mk3.setchildviewitem(iw,.attach_left); map.addoverlay(mk3); -20- Ver1.1
3.7. 거리재기지도위에서 Touch를통하여거리를측정합니다. 참조 - MapViewSDKActivity.java의 setstartdistance () 함수참조 /** * 거리재기를시작합니다. */ private void setstartdistance() { // TODO Auto-generated method stub this.map.startdistance(.drawmode_distance, null); 3.8. 면적재기지도위에서 Touch를통하여면적을측정합니다. 참조 - MapViewSDKActivity.java의 setstartarea () 함수참조 /** * 면적재기를시작합니다. */ private void setstartarea(){ this.map.startdistance(.drawmode_area, null); -21- Ver1.1
3.9. 공간객체매쉬업 Point, Polyline, Polygon, Circle, Envelope의공간객체를지도위에매쉬업한다. 참조 - MapViewSDKActivity.java의 setgeometry () 함수참조 // 맵에등록된오버레이객체를모두제거한다. this.map.removeoverlayall(); // 폴리라인그리기속성생성 Paint linept = new Paint(); linept.setstyle(style.stroke); linept.setstrokewidth(4); linept.setantialias(true); linept.setcolor(color.black); linept.setalpha(150); // 폴리라인생성 Polyline line = new Polyline(); // 폴리라인에그리기속성셋팅 line.setpaint(linept); // 맵에폴리라인등록 this.map.addoverlay(line); double tx = this.centerx; double ty = this.centery; line.addcoordinate(new Coordinate(tx-=50, ty-=50)); line.addcoordinate(new Coordinate(tx-=60, ty-=70)); line.addcoordinate(new Coordinate(tx-=10, ty-=50)); line.addcoordinate(new Coordinate(tx-=50, ty-=10)); line.addcoordinate(new Coordinate(tx-=50, ty-=50)); // 원그리기속성생성 Paint circlept = new Paint(); circlept.setstyle(style.fill_and_stroke); -22- Ver1.1
circlept.setstrokewidth(4); circlept.setantialias(true); circlept.setcolor(color.red); circlept.setalpha(50); // 원객체생성 Circle circle = new Circle(new Coordinate(this.centerX,this.centerY), 100); // 원그리기속성셋팅 circle.setpaint(circlept); // 맵에원등록 this.map.addoverlay(circle); // 폴리곤그리기속성생성 Paint polygonpt = new Paint(); polygonpt.setstyle(style.fill); polygonpt.setstrokewidth(4); polygonpt.setantialias(true); polygonpt.setcolor(color.gray); polygonpt.setalpha(100); double tempx = centerx; double tempy = centery; polygon.addcoordinate(new Coordinate(centerX,centerY)); polygon.addcoordinate(new Coordinate(tempx+=100,tempy+=100)); polygon.addcoordinate(new Coordinate(tempx+=200,tempy+=300)); polygon.addcoordinate(new Coordinate(tempx+=400,tempy+=100)); polygon.addcoordinate(new Coordinate(tempx+=50,tempy+=20)); polygon.addcoordinate(new Coordinate(tempx-=400,tempy-=400)); polygon.addcoordinate(new Coordinate(tempx-=400,tempy-=400)); polygon.addcoordinate(new Coordinate(centerX,centerY)); // 직사각형그리기속성생성 Paint recpt = new Paint(); recpt.setstyle(style.fill); -23- Ver1.1
recpt.setstrokewidth(4); recpt.setantialias(true); recpt.setcolor(color.magenta); recpt.setalpha(100); // 직사각형객체생성 Envelope env = new Envelope(centerX -300, centerx -200, centery, centery+100); // 직사각형그리기속성셋팅 env.setpaint(recpt); // 맵에직사각형객체셋팅 this.map.addoverlay(env); map.postinvalidate(); -24- Ver1.1
3.10. 좌표변환단말기의 GPS 에서측위되는좌표를 GRS80 TM 중부원점평면좌표계로변환합니다. 참조 - MapViewSDKActivity.java의 onlocationchanged () 함수참조 @Override public void onlocationchanged(location location) { if(this.nowlocationmode == false){ return; mylocation = location; double latpointt = mylocation.getlatitude(); double lngpointt = mylocation.getlongitude(); Toast toast = Toast.makeText(this, " x= " + lngpointt + ", y = " + latpointt, Toast.LENGTH_SHORT); // TODO Auto-generated method stub // WGS84 경위도좌표를 GRS80 중부원점으로좌표변환 conv.setsrctype(geoellips.kwgs84, GeoSystem.kGeographic); conv.setdsttype(geoellips.kgrs80, GeoSystem.kTmMid); Coordinate utmpoint = conv.conv(new Coordinate(lngPointT, latpointt)); this.map.setmapcenter(utmpoint, 8); -25- Ver1.1