안드로이드 자바

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

teamnova 2023. 1. 27. 12:00
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);
    }


?>

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

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