GoogleApi에서 Direction Api를 활용해 출발점과 목적지의 위도 경도를 알 때, 지도 위에 나타내는 과정
비용
월 $200지원
1000번당 5달러 ->최대 40,000회 사용가능
한계점
도보,자동차 경로는 안나오고 대중교통을 활용한 경로를 알려줌(mode가 transit으로만 가능) 대신, 미국 등의 나라에서는 도보, 자전거 경로 지원
따라서, 현위치에서 역, 정류장까지의 경로는 직선으로 나오는 한계점
-->보완점으로 정류장, 역까지의 경로는 NaverApi-Direction 활용할 예정
제공방식
Rest Api
코드
출발점과 목적지를 LatLng 객체로 매개변수로 받아 URL을 반환
fun getDirectionUrl(origin: LatLng, dest: LatLng): String {
return "https://maps.googleapis.com/maps/api/directions/json?origin=${origin.latitude},${origin.longitude}&destination=${dest.latitude},${dest.longitude}&mode=transit&departure_time=now&language=ko&key=YOUR_KEY"
}
URL을 매개변수로 받아 지도 위에 PolyLine그리는 inner class Code
MainActivity.map은 MainActivity에서 변수 map은 compaion object의 한 요소로 타입은 GoogleMap lateinit var map: GoogleMap
AsyncTask를 상속받은 클래스의 instance가 execute()를 실행시 비동기 실행한다. RestApi 호출하는 경우, 무조건 비동기로 처리해야한다. AsyncTask말고 동기적으로 처리하고 싶으면 retrofit2를 활용하여 enque실행한다.
여기서는 Okhttp 라이브러리를 활용해 url을 호출함
inner class GetDirection(var url: String) : AsyncTask<Void, Void, List<List<LatLng>>>() {
override fun doInBackground(vararg p0: Void?): List<List<LatLng>> {
val client = OkHttpClient()
val request = Request.Builder().url(url).build()
val response = client.newCall(request).execute()
val data = response.body?.string()
val result = ArrayList<List<LatLng>>()
try {
val obj = Gson().fromJson(data,GoogleMapDTO::class.java)
val path = ArrayList<LatLng>()
var onlyFirst=0
for (i in 0 until obj.routes[0].legs[0].steps.size) {
if(obj.routes[0].legs[0].steps[i].travel_mode=="WALKING"&&onlyFirst==0){
MainActivity.walkingTime=obj.routes[0].legs[0].steps[i].duration.text
onlyFirst++
}
path.addAll(decodePolyline(obj.routes[0].legs[0].steps[i].polyline.points))
}
result.add(path)
} catch (e: Exception) {
e.printStackTrace()
}
return result
}
override fun onPostExecute(result: List<List<LatLng>>?) {
if (result != null) {
val lineoption=PolylineOptions()
for(i in result.indices){
lineoption.addAll(result[i])
.width(15f)
.color(Color.BLUE)
.geodesic(true)
}
MainActivity.polyline=MainActivity.map.addPolyline(lineoption)
}
}
}
Rest Api Response로 Polyline이 주어지는데 이를 해독하여 지도 위에 나타내는 함수
inner class GetDirection를 보면 decodePolyline로 polyline의 point를 해독함
fun decodePolyline(encoded:String):List<LatLng>{
val poly=ArrayList<LatLng>()
var index=0
var len=encoded.length
var lat=0
var lng=0
while(index<len){
var b:Int
var shift=0
var result=0
do{
b=encoded[index++].toInt() - 63
result=result or (b and 0x1f shl shift)
shift+=5
}while(b>=0x20)
val dlat=if(result and 1 !=0) (result shr 1).inv() else result shr 1
lat+=dlat
shift=0
result=0
do{
b=encoded[index++].toInt() -63
result=result or (b and 0x1f shl shift)
shift+=5
}while(b>=0x20)
val dlng=if(result and 1 !=0) (result shr 1).inv() else result shr 1
lng+=dlng
val latLng=LatLng(lat.toDouble()/1E5,lng.toDouble()/1E5)
poly.add(latLng)
}
return poly
}
실행 코드
위 코드의 전체 class 이름이 Direcion_Finder
var direction = Direction_Finder()
var url = direction.getDirectionUrl(startLocation!!, endLocation!!)
direction.GetDirection(url).execute()
GooleApi Direcion의 활용
설명
GoogleApi에서 Direction Api를 활용해 출발점과 목적지의 위도 경도를 알 때, 지도 위에 나타내는 과정
비용
월 $200지원
1000번당 5달러 ->최대 40,000회 사용가능
한계점
도보,자동차 경로는 안나오고 대중교통을 활용한 경로를 알려줌(mode가 transit으로만 가능)
대신, 미국 등의 나라에서는 도보, 자전거 경로 지원
따라서, 현위치에서 역, 정류장까지의 경로는 직선으로 나오는 한계점
-->보완점으로 정류장, 역까지의 경로는 NaverApi-Direction 활용할 예정
제공방식
Rest Api
코드
출발점과 목적지를 LatLng 객체로 매개변수로 받아 URL을 반환
URL을 매개변수로 받아 지도 위에 PolyLine그리는 inner class Code
MainActivity.map은 MainActivity에서 변수 map은 compaion object의 한 요소로 타입은 GoogleMap
lateinit var map: GoogleMap
AsyncTask를 상속받은 클래스의 instance가 execute()를 실행시 비동기 실행한다. RestApi 호출하는 경우, 무조건 비동기로 처리해야한다. AsyncTask말고 동기적으로 처리하고 싶으면 retrofit2를 활용하여 enque실행한다.
여기서는 Okhttp 라이브러리를 활용해 url을 호출함
Rest Api Response로 Polyline이 주어지는데 이를 해독하여 지도 위에 나타내는 함수
inner class GetDirection를 보면 decodePolyline로 polyline의 point를 해독함
실행 코드
위 코드의 전체 class 이름이 Direcion_Finder
Response Json 형태