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();
}