본문 바로가기
안드로이드 자바

[Android][Java] Retrofit으로 위치 데이터를 받아와 네이버 marker 추가하기

by teamnova 2023. 1. 27.
728x90

retrofit을 통해 arraylist형태로 데이터를 받아서 마커를 삽입해보겠습니다.

 

결과

 

순서

1. onCreate()

2. onMapReady()

3. call retrofit method

4. setMarker method

5. response

 

 

참고 글

https://stickode.tistory.com/655

 

[Java][Android] 네이버 지도 - 숫자 마커 만들기(롱클릭 이벤트)

안녕하세요. 이번 시간에는 지도 위에 숫자 마커를 찍어보도록 하겠습니다. 원하는 결과는 이렇습니다. https://navermaps.github.io/android-map-sdk/guide-ko/ Home · 네이버 지도 안드로이드 SDK No results matching

stickode.tistory.com

이 숫자마커를 롱클릭이 아닌, DB에서 받아와 set해주겠습니다.

 

 

1. onCreate()

@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.stickode_test);

    mapView = findViewById(R.id.map_stickode);
    tv_markerNum = (TextView)findViewById(R.id.tv_markerNum); // 마커에 삽입될 숫자뷰


    // 네이버 지도 초기화
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(this); // 네이버지도에서 반환되는 콜백함수를 자신(this)으로 지정하는 역할
                                        // Async : 비동기(로 NaverMap객체를 얻는다)


}

 

 

2. onMapReady()

// NaverMap객체가 준비되면 콜백메소드를 호출한다.
@Override
public void onMapReady(@NonNull NaverMap naverMap) { //지도의 작동을 다룸

    Log.e(TAG, "onMapReady() 입장");
    네이버Map = naverMap;


    //현재위치 GPS
    locationSource = new FusedLocationSource(Map2_stickodeTest.this, LOCATION_PERMISSION_REQUEST_CODE); //권한요청객체생성(GPS)
    naverMap.setLocationSource(locationSource); //현재위치
    naverMap.setLocationTrackingMode(LocationTrackingMode.Follow); //트래킹모드를 선언해야 위치오버레이가 보임
    

    retrofit_getLocationMarker(네이버Map, "365"); //방번호 넣어주기

    tv_markerNum.setVisibility(View.GONE); //사용 다 했으니 숨기기
   
}

 

 

3. call retrofit method

private void retrofit_getLocationMarker(NaverMap naverMap, String myRoom_no) {

    Log.e(TAG, "retrofit마커get() 메소드 입장// myRoom_no : "+myRoom_no);

    Sharing 마커불러오기 = retrofit객체().create(Sharing.class);   // Sharing라는 interface에서 recyclerviewRecord()메소드로 보낸다.
    Call<ArrayList<getMarker>> call = 마커불러오기.markerArraylistGet2(myRoom_no); // Call<ArrayList<getMarker>> : 데이터를 받아오는 곳


    //네트워킹 시도
    call.enqueue(new Callback<ArrayList<getMarker>>() { //enqueue : 비동기식 통신을 할 때 사용/ execute: 동기식
        @SuppressLint({"SetTextI18n", "NotifyDataSetChanged", "ClickableViewAccessibility"})
        @Override
        public void onResponse(Call<ArrayList<getMarker>> call, @NonNull Response<ArrayList<getMarker>> response) {


            //ㅡㅡㅡㅡㅡㅡㅡㅡ
            // 응답받은 배열
            //ㅡㅡㅡㅡㅡㅡㅡㅡ
            ArrayList<getMarker> items = response.body(); // 대입하는 순간 SerializedName에 따라 이름따라 값이 들어가짐 !! 중요

            마커셋팅(naverMap, items); //지도뷰에 마커삽입

        }

        @Override
        public void onFailure(Call<ArrayList<getMarker>> call, Throwable t) {
            Log.e("onFailure : ", t.getMessage());
        }
    });

}

 

 

3-1. interface

public interface Sharing {

    //위치공유방 참여자가 경로마커 보기
    @FormUrlEncoded
    @POST("iamhere/markerList_get2.php")
    Call<ArrayList<getMarker>> markerArraylistGet2(

            @Field("Room_no") String Room_no //방번호(쉐어드저장)를 보내면 RouteMaarker테이블에서 row를 추출하겠지

    );

}

 

 

3-2. model

public class getMarker {

//  [
//     {
//            "arrLat": "37.48503839980235",
//            "arrLng": "126.9683922068462"
//      },
//     {
//            "arrLat": "37.48503839980235",
//            "arrLng": "126.9683922068462"
//      }
//  ]         다음과 같은 형태로 받아와짐

    @Expose
    @SerializedName("arrLat")
    public double arrLat; 

    @Expose
    @SerializedName("arrLng")
    public double arrLng;

    public double getArrLat() {
        return arrLat;
    }

    public double getArrLng() {
        return arrLng;
    }

    public getMarker(double arrLat, double arrLng) {
        this.arrLat = arrLat;
        this.arrLng = arrLng;
    }
}

 

3-3. retrofit instance

private Retrofit retrofit객체() {

    retrofit2.Retrofit retrofit = new retrofit2.Retrofit.Builder() //Retrofit 인스턴스 생성
            .baseUrl("http://15.164.~~/")  //baseUrl 등록
            .client(createOkHttpClient()) //네트워크 통신 로그보기(서버로 주고받는 파라미터) - 생략가능
            .addConverterFactory(GsonConverterFactory.create())  //http통신시에 주고받는 데이터형태를 변환시켜주는 컨버터를 지정한다. Gson, Jackson 등이 있다. Gson 변환기 등록
            .addConverterFactory(ScalarsConverterFactory.create())
            .build();

    return retrofit;
}

 

 

4. setMarker method

//서버에서 받아온 위도경도를 지도에 뷰로 뿌리기
private void 마커셋팅(NaverMap naverMap, ArrayList<getMarker> 위도경도리스트) {

    Log.e(TAG, "마커셋팅() 들어옴 ");

    for (int i=0; i<위도경도리스트.size(); i++) { //마커리스트가 null인 경우가 있어서 마커위도리스트를 기준으로 삼음

        Log.e(TAG, "마커셋팅() i : "+i);

        Marker marker = new Marker(); //다시 마커객체 생성해서 다시 위치에 삽입함
        marker.setPosition(new LatLng(위도경도리스트.get(i).getArrLat(), 위도경도리스트.get(i).getArrLng())); //static변수로 액티비티가 파괴되어도 사용할 수 있게함
        marker.setWidth(90);
        marker.setHeight(90);
        marker.setMap(naverMap); //다시 대입한다 /해야 보임
        tv_markerNum.setText(String.valueOf(i+1)); //인덱스+1해야 자연수가 나옴
        marker.setIcon(OverlayImage.fromView(tv_markerNum)); //숫자먼저 set하고 뷰를 삽입한다.

    }

}

 

 

5. response

<?php
    include 'db.php'; //비밀번호 보호차원에서 include로 불러옴


    $방번호 = $_POST['Room_no']; //방번호가 쉐어드에 저장되어있어서 꺼져도 꺼내서 서버로 받을 수 있음
              

    $sql_select="select * from RouteMarker where Room_no = '$방번호'"; //해당 방에 찍힌 마커들이 조회됨 (0~20개)
    // $sql_select="select * from RouteMarker where Room_no = '$방번호'"; //해당 방에 찍힌 마커들이 조회됨 (0~20개)
    $result=mysqli_query($db,$sql_select); //방이름 중복체크
    $num = mysqli_num_rows($result); //경로마커 갯수가 1개 이상이면 배열보내기
    

    $경로마커들 = array();
    while($row = mysqli_fetch_array($result)){ //row 한 줄 한 줄 반복해서 배열에 담는다.

        array_push($경로마커들, array('arrLat'=>$row['Lat'],
                                     'arrLng'=>$row['Lng'] ));
    }

    if($num > 0) {
        echo json_encode($경로마커들, JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
    
    } else {
        array_push($경로마커들, array('Room_mapCapture'=>"없음")); //배열의 첫번째에 "없음"을 넣는다.
        echo json_encode($경로마커들, JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
    }


?>

본인이 생성한 테이블에 맞게 쿼리를 날립니다. 

'$경로마커들' 안에 위도, 경도 값이 담겨있습니다.