기록

androidStudio/java/공공데이터 api 사용하기 본문

Moblie/Android

androidStudio/java/공공데이터 api 사용하기

youngyin 2022. 1. 24. 12:00

1. 공공데이터 api 발급받기

해당 프로젝트에서는 서울시 가로수 위치정보 (좌표계: WGS1984)를 사용하였다. 

- 회원가입

- 로그인

- api key 발급

https://data.seoul.go.kr/dataList/OA-1325/S/1/datasetView.do

 

2. key 등록하기

여러 서비스 api를 사용하기에 keys.xml 파일에 key 값을 저장하였다. 

이후 .gitignore에 keys.xml 를 등록하여 키값이 github에 의해 추적되지 않도록 했다.

// res/values/keys.xml
<resources>
    <string name="SEOUL_GAROSU_API_KEY">MY_API_KEY</string>
</resources>

3. 데이터를 담아둘 클래스 만들기

api에 담긴 정보 중 필요한 데이터만 사용한다.

public class TreeApiData {
    public static String STRING_GU_NM = "GU_NM";
    public static String STRING_TRE_IDN = "TRE_IDN";
    public static String STRING_WDPT_NM = "WDPT_NM";
    public static String STRING_LNG = "LNG";
    public static String STRING_LAT = "LAT";

    String GU_NM; // 구명
    String TRE_IDN; // 수목고유번호
    String WDPT_NM; // 가로명
    String LNG; // 경도
    String LAT; // 위도

    public TreeApiData(String GU_NM, String TRE_IDN, String WDPT_NM, String LNG, String LAT) {
        this.GU_NM = GU_NM;
        this.TRE_IDN = TRE_IDN;
        this.WDPT_NM = WDPT_NM;
        this.LNG = LNG;
        this.LAT = LAT;
    }

    @Override
    public String toString() {
        return "TreeApiData{" +
                "GU_NM='" + GU_NM + '\'' +
                ", TRE_IDN='" + TRE_IDN + '\'' +
                ", WDPT_NM='" + WDPT_NM + '\'' +
                ", LNG='" + LNG + '\'' +
                ", LAT='" + LAT + '\'' +
                '}';
    }
}

4. 데이터 받아와서 파싱하기

  • usesCleartextTraffic
// AndroidManifest.xml
<application
        android:usesCleartextTraffic="true"
        .../>

위 설정을 해주지 않으면 아래와 같은 오류가 발생한다.

java.io.IOException: Cleartext HTTP traffic to openapi.nature.go.kr not permitted

  • Thread

데이터를 불러올 때에는 Main에서 바로 요청해서는 안된다.

  • 데이터 형태 확인

아래에서 사용해야 할 데이터는 GeoInfoOfRoadsideTreeW>row에 위치하고 있다.

데이터 구조

  • 코드 작성하기
public static ArrayList<TreeApiData> treeApiDataList;
public void getTreeData(){
    new Thread(){
        @Override
        public void run(){
            // 쿼리 작성하기
            String seoul_garosu_api_key = getString(R.string.SEOUL_GAROSU_API_KEY);
            String dataType = "json";
            String GU_NM = "중구";
            String dataCount = "10";
            String queryUrl = "http://openAPI.seoul.go.kr:8088/"+seoul_garosu_api_key+
                    "/"+dataType+"/GeoInfoOfRoadsideTreeW/1/"+dataCount+"/"+GU_NM;

            try {
                // 데이터 받아오기
                URL url = new URL(queryUrl);

                InputStream is = url.openStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader reader = new BufferedReader(isr);

                StringBuffer buffer = new StringBuffer();
                String line = reader.readLine();
                while (line != null) {
                    buffer.append(line + "\n");
                    line = reader.readLine();
                }

                // 데이터 파싱하기
                String jsonString = buffer.toString();
                JSONObject jsonObject = new JSONObject(jsonString);
                JSONObject GeoInfoRoadsideTree = jsonObject.getJSONObject("GeoInfoOfRoadsideTreeW");
                JSONArray row = GeoInfoRoadsideTree.getJSONArray("row");

                treeApiDataList = new ArrayList<TreeApiData>();
                for (int i=0; i<row.length();i++){
                    JSONObject item = row.getJSONObject(i);
                    treeApiDataList.add(new TreeApiData(
                            item.getString(TreeApiData.STRING_GU_NM),
                            item.getString(TreeApiData.STRING_TRE_IDN),
                            item.getString(TreeApiData.STRING_WDPT_NM),
                            item.getString(TreeApiData.STRING_LNG),
                            item.getString(TreeApiData.STRING_LAT)
                    ));
                }

                Log.e("mapActivity", treeApiDataList.toString());

            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }.start();
}

5. 결과

로그 확인

Comments