Tech. Forum 개발자들을 위한 정보 공유의 장입니다
닫기

Tech.Forum

시점을 현재 위치로 이동시키는 방법 관련해서 질문드립니다

#1

제가 현재 위치 표시해 주는 예제를 조금 수정해서
현재 위치가 바뀔때마다 시점이 따라 다니는게 아니라 ‘btnCurlocation’ 버튼을 눌렀을 때만 중앙에 오게끔 하고싶은데 방법을 잘 모르겠습니다. 어떤식으로 해결 해야할지 도움 부탁드립니다
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout linearLayoutTmap = (LinearLayout) findViewById(R.id.linearLayoutTmap);

    // 버튼 선언
    Button btnZoomIn = (Button)findViewById(R.id.btnZoomIn);
    Button btnZoomOut = (Button)findViewById(R.id.btnZoomOut);
    Button btnCurlocation = (Button)findViewById(R.id.btnCurlocation);
    Button btnStart = (Button)findViewById(R.id.btnStart);
    Button btnStop = (Button)findViewById(R.id.btnStop);

    tmap = new TMapView(this);

    tmap.setSKTMapApiKey(TMAP_API_KEY);

    linearLayoutTmap.addView(tmap);

    tmap.setIconVisibility(true);//현재위치로 표시될 아이콘을 표시할지 여부를 설정합니다.

    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED){

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 1); //위치권한 탐색 허용 관련 내용
        }
        return;
    }
    setGps();

    // 줌 인
    btnZoomIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.MapZoomIn();
        }
    });
    // 줌 아웃
    btnZoomOut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.MapZoomOut();
        }
    });

    btnCurlocation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        }
    });
}

private final LocationListener mLocationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        //현재위치의 좌표를 알수있는 부분
        if (location != null) {
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            tmap.setLocationPoint(longitude, latitude); // 현재위치로 표시될 좌표의 위도, 경도를 설정합니다.
            tmap.setIconVisibility(true);
            //tmap.setCenterPoint(longitude, latitude,true); // 현재 위치로 이동
            Log.d("TmapTest",""+longitude+","+latitude);
        }

    }

    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

public void setGps() {
    final LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,1,mLocationListener);
}

}

0 Likes

#2

안녕하세요.
T map API 운영담당자입니다.

현재위치가 바꼈을때 setCenterPoint()함수가 호출되지 않고,
btnCurlocation을 클릭 하셨을때 setCenterPoint()함수를 실행 시키도록
작성하시면 될것같습니다.

감사합니다.

0 Likes

#3

setTrackingMode 사용해서 해결했습니다.

혹시 출발 버튼을 누르면 그 시점부터 위도,경도 값이 바뀔 때마다 Polyline을 이용해서 이동 경로를 나타내고 싶은데 비슷한 예제가 있을까요…?
Polyline 예제가 출발지와 목적지가 정해지면 그 경로를 선으로 나타내주는 것들 뿐이라 어떤 식으로 구현해야 할지 감이 안잡히네요…

0 Likes

#4

안녕하세요.
T map API 운영담당자입니다.

선그리기 예제에서 마지막에 addTMapPolyLine()함수로 Polyline을 지도에 생성이후,
파라미터 값으로 들어간 TmapPolyLine에 위경도가 바뀔때 마다 이동 경로의 좌표를
addLinePoint() 함수에 파라미터로 넣어서 사용하시게 되면,
기존의 TmapPolyLine 객체에 새로운 좌표로 선이 이어지게 됩니다.

아래의 링크를 참고하시면 도움이 되실겁니다.


[선그리기 Sample]
http://tmapapi.sktelecom.com/main.html#android/sample/androidSample.sample5

[addLinePoint Doc]
http://tmapapi.sktelecom.com/main.html#android/docs/androidDoc.TMapPolyLine_addLinePoint


감사합니다.

0 Likes

#5

알려주신 방법으로 해봤는데 Polyline도 생성되지 않고 그냥 위치만 이동되네요
혹시 말씀해주신 방식의 예시 코드 작성 부탁드려도 될까요…

0 Likes

#6

안녕하세요
T map API 운영담당자입니다.

아래의 예시는 버튼을 클릭하면 Polyline에 현재좌표를 추가하여 주는 것 입니다.
이를 이용하여, 현재 위치가 변경되면 호출되는 onLocationChange함수와 적용하여
작성하시면 도움이 되실겁니다.
링크와 예시는 아래에 남겨놓겠습니다.


EX)
ArrayList alTMapPoint = new ArrayList();
alTMapPoint.add( new TMapPoint(37.570841, 126.985302) ); // SKT타워
alTMapPoint.add( new TMapPoint(37.551135, 126.988205) ); // N서울타워
alTMapPoint.add( new TMapPoint(37.579600, 126.976998) ); // 경복궁

    tMapPolyLine = new TMapPolyLine();
    tMapPolyLine.setLineColor(Color.BLUE);
    tMapPolyLine.setLineWidth(2);
    for( int i=0; i<alTMapPoint.size(); i++ ) {
        tMapPolyLine.addLinePoint( alTMapPoint.get(i) );
    }
    mMapView.addTMapPolyLine("Line1", tMapPolyLine);

버튼 클릭 이벤트 {
TMapPoint tmppoint = mMapView.getCenterPoint();
tMapPolyLine.addLinePoint(new TMapPoint(tmppoint.getLatitude(), tmppoint.getLongitude()));
}

[onLocationChange Doc]
http://tmapapi.sktelecom.com/main.html#android/docs/androidDoc.TMapGpsManager_onLocationChange


감사합니다.

0 Likes

#7

알려주신대로 해보려고 노력해봤는데
뭘 잘못 생각하고 있는건지 진전이 없습니다…
`public class MainActivity extends AppCompatActivity {
private final String TMAP_API_KEY ="";
TMapView tmap;
boolean check = false;
double latitude;
double longitude;
TMapPoint lastLocation;
TMapPolyLine tMapPolyLine;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LinearLayout linearLayoutTmap = (LinearLayout) findViewById(R.id.linearLayoutTmap);

    // 버튼 선언
    Button btnZoomIn = (Button)findViewById(R.id.btnZoomIn);
    Button btnZoomOut = (Button)findViewById(R.id.btnZoomOut);
    Button btnCurlocation = (Button)findViewById(R.id.btnCurlocation);
    Button btnStart = (Button)findViewById(R.id.btnStart);
    Button btnStop = (Button)findViewById(R.id.btnStop);

    tmap = new TMapView(this);

    tmap.setSKTMapApiKey(TMAP_API_KEY);

    linearLayoutTmap.addView(tmap);

    tmap.setIconVisibility(true);//현재위치로 표시될 아이콘을 표시할지 여부를 설정합니다.

    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED){

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 1); //위치권한 탐색 허용 관련 내용
        }
        return;
    }
    setGps();

    // 줌 인
    btnZoomIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.MapZoomIn();
        }
    });
    // 줌 아웃
    btnZoomOut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.MapZoomOut();
        }
    });
    // 내 위치로 이동
    btnCurlocation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.setTrackingMode(true);
        }
    });
    // 기록 시작
    btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TMapPolyLine tMapPolyLine = new TMapPolyLine();
            tMapPolyLine.setLineColor(Color.RED);
            tMapPolyLine.setLineWidth(2);
            tmap.addTMapPolyLine("Path", tMapPolyLine);
        }
    });
    // 기록 종료
    btnStop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            check = false;
        }
    });
}

private final LocationListener mLocationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        //현재위치의 좌표를 알수있는 부분
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
            tmap.setLocationPoint(longitude, latitude); // 현재위치로 표시될 좌표의 위도, 경도를 설정합니다
            Log.d("TmapTest",""+longitude+","+latitude);
        }
            lastLocation = new TMapPoint(location.getLatitude(),location.getLongitude());
            drawPath();
    }
    public void onProviderDisabled(String provider) {
    }
    public void onProviderEnabled(String provider) {
    }
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

public void setGps() {
    final LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,1,mLocationListener);
}

public void drawPath() {
    ArrayList<TMapPoint> alTMapPoint = new ArrayList<TMapPoint>();
    alTMapPoint.add(lastLocation);
}

}
`

전체 코드인데 어디부터 건드려야 할까요… 너무 막막하고 어렵네요

0 Likes

#8

안녕하세요
T map API 운영담당자입니다.

문의주신 소스코드를 토대로 순서대로 답변 드리겠습니다.

1.먼저 작성하신 소스코드를 보면, 위에서 문의에 대해 답변드린 addLinePoint() 함수를 찾을수 없습니다.
addLinePoint() 함수를 사용하지 않으시면 PolyLine을 그리기위한 좌표가 없어, 정상적으로
그려지지 않습니다. 사용법과 이와관련된 자료는 위의 답변들을 참고하여 주시기 바랍니다.

2.btnStart 버튼을 누르게 되면, PolyLine을 그리기 시작하는 것으로 보입니다.
이때, addTMapPolyLine() 함수를 통해 PolyLine을 파라미터로 넣으실때, 함수 내부의 변수가 아닌,
전역 변수로 넣으셔야 됩니다. 이와 관련해서는 자바 기초인 [자바 변수 스코프]를
숙지 하여 주시기 바랍니다.

현재 위치 변경을 위한 Gps세팅과 onLocationChanged 이벤트에 관해서는 아래의
샘플 링크를 참고하시면 도움이 되실겁니다.


[SDK 다운로드 Sample]
http://tmapapi.sktelecom.com/main.html#android/sample/androidSample.sdk_download


감사합니다.

0 Likes

#9

질문이 몇가지 있는데요…

  1. 기록 시작을 누르고 선을 그리는 과정까지는 되었는데 선이 첨부한 그림과 같이 그려집니다


    세번째 이동부터 처음 출발한 지점와 현재 지점이 이어지게 되는데 중단점을 걸고 디버깅해봐도 어느 부분이 잘못된지 모르겠네요

  2. 기록 종료 버튼을 누르고 다시 기록 시작을 했을 때 이전 경로가 그대로 나타나는데 어떻게 해결해야 하나요?

  3. 폴리라인 선을 빨간색으로 설정했는데 파란색과 빨간색이 섞인 듯한 색으로 표현이 됩니다 어떤 문제인가요?

현재 코드입니다
`public class MainActivity extends AppCompatActivity {
private final String TMAP_API_KEY ="";
TMapView tmap;
boolean check = false;
double latitude;
double longitude;
TMapPoint lastLocation;
TMapPolyLine polyLine = new TMapPolyLine();
ArrayList alTMapPoint = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LinearLayout linearLayoutTmap = (LinearLayout) findViewById(R.id.linearLayoutTmap);

    // 버튼 선언
    Button btnZoomIn = (Button)findViewById(R.id.btnZoomIn);
    Button btnZoomOut = (Button)findViewById(R.id.btnZoomOut);
    Button btnCurlocation = (Button)findViewById(R.id.btnCurlocation);
    Button btnStart = (Button)findViewById(R.id.btnStart);
    Button btnStop = (Button)findViewById(R.id.btnStop);

    tmap = new TMapView(this);

    tmap.setSKTMapApiKey(TMAP_API_KEY);

    linearLayoutTmap.addView(tmap);

    polyLine.setLineColor(Color.RED);
    polyLine.setLineWidth(3);

    tmap.setIconVisibility(true);//현재위치로 표시될 아이콘을 표시할지 여부를 설정합니다.



    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED){

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 1); //위치권한 탐색 허용 관련 내용
        }
        return;
    }
    setGps();

    // 줌 인
    btnZoomIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.MapZoomIn();
        }
    });
    // 줌 아웃
    btnZoomOut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.MapZoomOut();
        }
    });
    // 내 위치로 이동
    btnCurlocation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.setTrackingMode(true);
        }
    });
    // 기록 시작
    btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.addTMapPolyLine("Path", polyLine);
            check = true;
        }
    });
    // 기록 종료
    btnStop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tmap.removeTMapPolyLine("Path");
            check = false;
        }
    });
}

private final LocationListener mLocationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        //현재위치의 좌표를 알수있는 부분
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
            tmap.setLocationPoint(longitude, latitude); // 현재위치로 표시될 좌표의 위도, 경도를 설정합니다
            Log.d("TmapTest", "" + longitude + "," + latitude);
        }
        if (check == true) {
            lastLocation = new TMapPoint(location.getLatitude(), location.getLongitude());
            alTMapPoint.add(new TMapPoint(location.getLatitude(),location.getLongitude()));
            for(int i = 0; i<alTMapPoint.size(); i++)
            {
                polyLine.addLinePoint(alTMapPoint.get(i));
            }
        }
    }
    public void onProviderDisabled(String provider) {
    }
    public void onProviderEnabled(String provider) {
    }
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

public void setGps() {
    final LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,1,mLocationListener);
}

}
`

계속 질문이 너무 많아서 죄송합니다…

0 Likes

#10

안녕하세요
T map API 운영담당자입니다.

원하시는 기능이 현재 버튼을 누르시면 전에 있던 경로가 삭제 되는 기능인
것으로 보입니다. 이와 관련해서 removeTMapPolyLine()함수 또는, removeAllTMapPolyLine()함수를
사용하시면 될것 같습니다.
아래의 링크를 참고하시면 도움이 되실겁니다.


[removeTMapPolyLine]
http://tmapapi.sktelecom.com/main.html#android/docs/androidDoc.TMapView_removeTMapPolyLine

[removeAllTMapPolyLine]
http://tmapapi.sktelecom.com/main.html#android/docs/androidDoc.TMapView_removeAllTMapPolyLine


감사합니다.

0 Likes

#11

해당 함수를 사용하면 폴리라인이 제거가 되긴 하지만 기록 시작 버튼을 다시 누르게 되면 제거되었던 폴리라인이 다시 표시되네요…

0 Likes

#12

안녕하세요
T map API 운영담당자입니다.

기존에 polyLine을 초기화 하지않아서 생기는 오류입니다.
초기화후 사용하시면 됩니다.

감사합니다.

0 Likes

#13

위에 첫번째 질문과 세번째 질문도 답변이 가능하실까요?

0 Likes

#14

안녕하세요
T map API 운영담당자입니다.

작성하신 문의 순서대로 첫번째와 세번째를 말씀하시는것 이면, 중앙이동과 PolyLine객체 생성과
관련해서는 이미 답변을 하였습니다.

또는, 바로위에 문의를 말씀하시는 것이면,
첫번째 좌표를 반복해서 addLinePoint() 함수를 호출하여서 그런것으로 보입니다.
직접 작성하신 코드를 확인하여 주시기 바랍니다.
다음으로, 선의 색상이 보라색이 된것은 바깥쪽선(BULE)과 안쪽선의 색깔(RED)이 겹쳐서
그렇습니다. setOutLineColor()함수를 통해 바깥쪽선도 같은 색상을 지정하시면,
겹친색이 나오지 않을겁니다.
아래의 링크를 참고하시면 도움이 되실겁니다.


[setOutLineColor Doc]
http://tmapapi.sktelecom.com/main.html#android/docs/androidDoc.TMapPolyLine_setOutLineColor


감사합니다.

0 Likes