공공데이터포털의 도로위험지수 api를 사용하였습니다.
시작 좌표와 끝 좌표를 넘겨주면 해당 도로의 도로위험지수를 돌려줍니다.
작은 길가나 골목의 경우 api가 지원을 안해서
{
"resultCode": "10",
"resultMsg": "INVALID_REQUEST_PARAMETER_ERROR"
}
이렇게 "INVALID_REQUEST_PARAMETER_ERROR" 메시지를 출력합니다.
제대로 된 좌표로 요청할 경우
{
"resultCode": "00",
"resultMsg": "NORMAL_CODE",
"items": {
"item": [
{
"index": 1,
"line_string": "(129.066456 35.208912, 129.066456 35.208912)",
"anals_value": "0.00",
"anals_grd": "01"
}
]
},
"totalCount": 1,
"numOfRows": 1,
"pageNo": 1
}
이렇게 제대로 된 값을 줍니다.
저는 anals_grd만 쓰도록 하겠습니다.
api 통신을 위해 Asynctask를 사용하였습니다.
코드가 난잡하지만 이해바랍니다.
private fun getDangerGrade(startLat:String, startLng:String, endLat:String, endLng:String) {
lateinit var temp : String
class getDangerGrade : AsyncTask<Void, Void, Void>(){
override fun doInBackground(vararg params: Void?): Void? {
val stream = URL("http://apis.data.go.kr/B552061/roadDgdgrLink/getRestRoadDgdgrLink?serviceKey=[KEY]" +
"searchLineString=LineString("+
startLng + " " +
startLat + ", " +
endLng + " " +
endLat + ")&vhctyCd=1&type=json&numOfRows=10&pageNo=1").openStream()
val read = BufferedReader(InputStreamReader(stream,"UTF-8"))
temp = read.readLine()
return null
}
override fun onPostExecute(result: Void?) {
val grade : String
super.onPostExecute(result)
val json = JSONObject(temp)
if(json.get("resultCode") != "10") {
val chiefObject = (json["items"] as JSONObject)
val upperArray : JSONArray = chiefObject.getJSONArray("item")
val upperObject = upperArray.getJSONObject(0)
grade = upperObject.getString("anals_grd")
}
else
grade = "none"
}
}
getDangerGrade().execute()
}
처음에는 그저 단순하게 받은 json에서 그대로 get("anals_grd") 했더니 "anals_grd" 값을 찾을 수 없답니다.
자세히 보니 items 하위에 item이 Array입니다.
그래서 item을 따로 JSONArray로 빼준 후 다시 get("anals_grd") 하여 제대로 위험지수를 가져올 수 있었습니다.