현재 구글 지도 검색에 관한 부분을 공부 하고 있는데요.
책의 예제를 따라서 뉴욕시의 지도를 띄우는 것을 해 봤는데 위치를 현재 자신의 위치로
바꾸고 싶어요 코드에는 좌표값을 입력해 놨는데 자동으로 자기 자신의 자표값을 가져오게 할 순 없는 것인가요?
그리고 화면에 화살표로 표시 되는 부분을 알고자 하는 대상을 자동으로 표시 시키려면 어떻게 해야 하는건가요?
예를 들어 신한은행을 찾고 싶은데 제가 있는 위치가 중심이 되고 거기에서 주변 신한 은행을 화살표로 표시하는 방법 같은겁니다.
MyLocationOverlay 라는 녀석이 있는데, 이걸 MapView에 올리면, 자신의 현재 위치가 지도에 표시됩니다.
그래고 이 녀석이 가진 getMyLocation() 메서드를 호출하면, 현재의 GeoPoint가 반환됩니다.
그러나! 문제는, 호출하는 시점에 따라서, 이 값은 null일 수 있다는 거죠.
MyLocationOverlay는 지도 위에 올라갔는데, 실제 이 것이 GPS나 네트워크 상태에 접근하여 자신의 위치를 조회하는데는 어느정도 시간이 걸리기 때문입니다.
그리고 MyLocationOverlay를 올리고, 새로운 스레드를 생성해서, 일정 간격으로 MyLocationOverlay의 getMyLocation을 호출합니다.
어느 순간 이 메서드가 null이 아닌 값을 반환하면, 그 때가, 자신의 위치를 구한 시점이고, 그 때 MapController로 조작을 하면되는 것입니다.
MyLocationOverlay 말고, LocationManager를 활용하는 방법도 있습니다.
아래는 제가 사용하는 코드의 일부입니다.
/**
* 현재 내 위치로 이동한다.
*
* @param isRequest
*/
private void animateToMyLocation(final boolean isRequest){
new Thread(new Runnable() {
@Override
public void run() {
int i=0;
while(true){
GeoPoint myLocation = mMyLocationOverlay.getMyLocation();
if(myLocation!=null){
mMapController.setZoom(19);
mMapController.animateTo(myLocation);
break;
}
if(++i>=20){
if(isRequest){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, "현재 위치를 조회할 수 없습니다.", Toast.LENGTH_SHORT).show();
}
});
}
break;
}
try{
Thread.sleep(500);
}catch(Exception e){}
}
}
}).start();
}