06 ธันวาคม 2558

[Android Code] ใช้งาน Google Maps Direction API ให้ง่ายๆขึ้นด้วย Google Direction Library


        โดยปกติแล้วการนำแผนที่ของ Google Maps มาแสดงบนแอปพลิเคชันแอนดรอยด์นั้น ทาง Google จะทำ Library ไว้ให้อยู่แล้ว จึงทำให้สะดวกต่อนักพัฒนาแอนดรอยด์ที่ต้องการนำมาใช้งาน และถ้าต้องการใช้งาน Google Place API ก็มี Library ให้แล้วเช่นกัน

        แต่ทว่าถ้าอยากจะให้แสดงเส้นทางเพื่อนำทางบน Google Maps ก็จะต้องใช้ Google Maps Direction API ซึ่งปัญหาก็คือตอนนี้ทาง Google ยังไม่ได้ Provide เจ้า API ตัวนี้ให้แอนดรอยด์โดยเฉพาะ ดังนั้นจึงต้องใช้วิธีดึงข้อมูลจาก API ผ่าน HTTP แบบตรงๆกันไปก่อน และข้อมูลที่ได้มานั้นก็จะเป็น JSON (หรือ XML) ซึ่งนักพัฒนาก็ต้องมานั่งแยกข้อมูลอีกที ก่อนที่จะทำไปใช้งาน

        ดังนั้นเพื่อให้สะดวกมากขึ้นเจ้าของบล็อกจึงเขียน Library ขึ้นมาเพื่อช่วยให้สามารถเรียกใช้งาน Google Maps Direction API ได้ง่ายขึ้น อย่างน้อยก็จนกว่าทาง Google จะ Provide Library สำหรับแอนดรอยด์มาให้น่ะแหละ

เกี่ยวกับ Google Direction Library

        Google Direction Library ของเจ้าของบล็อกสร้างขึ้นมาเพื่อใช้งานบนแอนดรอยด์โดยเฉพาะ และผูกกับ Google Maps ดังนั้นถ้าตัว Library ก็จะมี Dependencies ของ Google Play Service (Maps) ด้วย นั่นก็หมายความว่า Library ตัวนี้ต้องใช้ Google Play Services ด้วย และเบื้องหลังการทำงานก็จะใช้ Retrofit (2.0), GSON และ Parceler ด้วย

        ก่อนจะนำไปใช้งานก็ขอให้มั่นใจว่า Google Maps ของผู้ที่หลงเข้ามาอ่านสามารถแสดงบนแอพได้ปกติสุขดี แล้วค่อยเอา Library ตัวนี้ไปใช้

        และ Library ตัวนี้ต้องใช้ API Key จาก Google Developer Console ด้วย คล้ายๆกับ Google Maps for Android เลย แต่ทว่าประเภทของ Key จะต่างกันไปหน่อย เพราะว่าของ Google Maps สามารถขอเป็น Android Key ได้เลย เนื่องจากมี Library สำหรับแอนดรอยด์ แต่ Google Direction Library นั้นใช้วิธีการติดต่อผ่าน HTTP ธรรมดาๆ ดังนั้นจึงต้องขอ Key เป็นแบบ Server Key ครับ

        ก่อนจะขอ Server Key ก็อย่าลืมเปิดใช้งาน Google Maps Direction API ก่อนนะ



        ซึ่งขั้นตอนการขอ Server Key ก็เหมือนกับ Android Key เลย เพียงแต่เลือกคนละอันกันเท่านั้น




        จะตั้งชื่อว่าอะไรก็ได้ ขอแค่ให้รู้ก็พอว่ามันคืออะไร ส่วนช่อง IP Address ไม่ต้องกรอกอะไรลงไป ปล่อยโล่งๆไว้นั้นแหละ เอาแล้ว API Key ไปใช้งานได้เลย

การใช้งาน Google Direction Library

        สามารถดึงผ่าน Maven ได้เลย โดยใส่เป็น Dependencies ไว้ใน build.gradle แบบนี้

dependencies {
    ...
    compile 'com.akexorcist:googledirectionlibrary:1.0.4'
}

        และคำสั่งในการเรียกใช้งานก็แสนเรียบง่าย (เพราะความวุ่นวายมันอยู่ตอนที่ข้อมูลส่งกลับมา) โดยรูปแบบคำสั่งที่ง่ายที่สุดจะเป็นแบบนี้

GoogleDirection.withServerKey(String serverKey)
    .from(LatLng origin)
    .to(LatLng destination)
    .execute(DirectionCallback callback);
        serverKey ก็คือ API Key ที่ขอมาจาก Google Developer Console
        origin คือพิกัดเริ่มต้นที่จะให้นำทาง โดยอยู่ในรูปของคลาส LatLng (ของ Google Maps)
        destination คือพิกัดปลายทางที่จะให้นำทาง
        callback คือ Direction Callback Event ที่จะถูกเรียกเมื่อข้อมูลจาก Google Maps Direction API ส่งกลับมาแล้ว

        เวลาใช้งานจริงๆก็จะเป็นแบบนี้

String serverKey = "AIzaSyDFWdlR5DG1VYXSaMwG62ilxxxxxxxxx";
LatLng origin = new LatLng(37.7849569, -122.4068855);
LatLng destination = new LatLng(37.7814432, -122.4460177);
GoogleDirection.withServerKey(serverKey)
    .from(origin)
    .to(destination)
    .execute(new DirectionCallback() {
        @Override
        public void onDirectionSuccess(Direction direction, String rawBody) {
            // Do something here 
        }

        @Override
        public void onDirectionFailure(Throwable t) {
            // Do something here 
        }
    });

        โดย Callback จะมีสองแบบด้วยกัน คือ Success กับ Failure ถ้ารับข้อมูลได้สำเร็จก็จะได้ Object กลับมาเป็น Direction Instance ก็ดึงข้อมูลจากในนั้นไปใช้งานได้เลย หรือจะเอาเป็นแบบ String ไปใช้งานก็ได้

        แต่ถ้าเกิดข้อผิดพลาดเช่น ไม่ได้เชื่อมต่ออินเตอร์เน็ตหรือ Connection Timeout ก็จะส่งกลับมาเป็น Failure ส่วนสาเหตุก็ให้วิเคราะห์จากใน Throwable Instance ต่อไป เพื่อแสดงข้อความแจ้งให้ผู้ใช้ทราบ

Optional Parameter สำหรับกำหนดข้อมูลที่ต้องการเพิ่มเติม

        นอกจากคำสั่ง withServerKey, from และ to ที่ใช้สำหรับกำหนดข้อมูลที่ต้องการแล้ว ยังสามารถกำหนดอย่างอื่นเพิ่มเติมได้อีกด้วย โดยกำหนดหลังจากคำสั่ง to ก่อนที่จะใช้คำสั่ง execute

        โดยจะมีดังนี้

transportMode(String transportMode)
language(String language)
unit(String unit)
avoid(String avoid)
transitMode(String transitMode)
alternativeRoute(boolean alternative)

Transport Mode

        การกำหนดรูปแบบในการเดินทาง ให้กำหนดค่าโดยใช้ค่าจากคลาส TransportMode

TransportMode.DRIVING
TransportMode.WALKING
TransportMode.BICYCLING
TransportMode.TRANSIT

        ซึ่งเส้นทางก็จะแตกต่างกันไปตามรูปแบบการเดินทาง ถ้าเป็น Bicycling ก็จะมีให้ในบางที่เท่านั้น และถ้าเป็น Transit ก็จะมีเส้นทางแบบ Walking ผสมอยู่ด้วย เพื่อให้เดินไปขึ้นรถโดยสารนั่นเอง

GoogleDirection.withServerKey(serverKey)
    .from(...)
    .to(...)
    .transportMode(TransportMode.WALKING)
    .execute(...);

Language

        กำหนดรูปแบบภาษาของข้อมูลที่ส่งกลับมาจาก Google Maps Direction API ให้กำหนดค่าโดยใช้ค่าจากคลาส Language

Language.GERMAN
Language.ENGLISH
Language.KOREAN
Language.JAPAN
...

        โดยข้อมูลที่ได้ก็จะเป็นภาษาที่ต้องการ แต่ทว่าก็ต้องคำนึงถึงสถานที่ด้วย เพราะควรจะเป็นภาษาที่ตรงกับพื้นที่ของเส้นทางนั้นๆ เช่น นักพัฒนาต้องการข้อความภาษาไทยในต่างประเทศ ก็อาจจะไม่ได้เป็นภาษาไทยเสมอไป เพราะไม่รองรับในประเทศนั้นๆ เป็นต้น

GoogleDirection.withServerKey(serverKey)
    .from(...)
    .to(...)
    .language(Language.THAILAND)
    .execute(...);

Unit


        กำหนดหน่วยของระยะทางที่จะแสดงในข้อมูล ให้กำหนดค่าโดยใช้ค่าจากคลาส Unit

Unit.METRIC
Unit.IMPERIAL
        METRIC  หน่วยกิโลเมตรและเมตร
        IMPERIAL ก็จะได้เป็นหน่วยไมล์และฟุต

GoogleDirection.withServerKey(serverKey)
    .from(...)
    .to(...)
    .unit(Unit.METRIC)
    .execute(...);

Avoid

        กำหนดว่าจะหลีกเลี่ยงเส้นทางแบบไหน ให้กำหนดค่าโดยใช้ค่าจากคลาส AvoidType

AvoidType.TOLLS
AvoidType.HIGHWAYS
AvoidType.FERRIES
AvoidType.INDOOR
        TOLLS  หลีกเลี่ยงเส้นทางที่ต้องใช้ทางด่วน
        HIGHWAYS หลีกเลี่ยงเส้นทางที่ต้องใช้ทางหลวง
        FERRIES หลีกเลี่ยงเส้นทางที่ต้องเดินทางด้วยเรือ
        INDOOR หลีกเลี่ยงเส้นทางที่ต้องเดินทางภายในอาคารหรือที่ร่ม

        ซึ่งคำสั่งนี้สามารถกำหนดได้มากกว่าหนึ่งอย่าง เพียงแค่กำหนดค่าที่ต้องการซ้ำลงไป เพราะตัวคำสั่งเป็นการ Add ค่าเข้าไปจากของเดิม

GoogleDirection.withServerKey(serverKey)
    .from(...)
    .to(...)
    .avoid(AvoidType.FERRIES)
    .avoid(AvoidType.INDOOR)
    .execute(...);

Transit Mode

        กำหนดประเภทของรถโดยสารที่ต้องการ เมื่อกำหนดเส้นทางเป็นแบบ Transit ให้กำหนดค่าโดยใช้ค่าจากคลาส TransitMode

TransitMode.BUS
TransitMode.SUBWAY
TransitMode.TRAIN
TransitMode.TRAM
TransitMode.RAIL
        BUS  เลือกเป็นเส้นทางของรถบัส
        SUBWAY เลือกเป็นเส้นทางของรถไฟใต้ดิน
        TRAIN เลือกเป็นเส้นทางของรถไฟ
        TRAM เลือกเป็นเส้นทางของรถราง
        RAIL เลือกเป็นเส้นทางของรถไฟ, รถราง และรถไฟใต้ดิน (รวม SUBWAY, TRAIN และ TRAM)

        ซึ่งคำสั่งนี้สามารถกำหนดได้มากกว่าหนึ่งอย่าง เพียงแค่กำหนดค่าที่ต้องการซ้ำลงไป เพราะตัวคำสั่งเป็นการ Add ค่าเข้าไปจากของเดิม

GoogleDirection.withServerKey(serverKey)
    .from(...)
    .to(...)
    .transitMode(TransitMode.TRAIN)
    .transitMode(TransitMode.BUS)
    .transitMode(TransitMode.SUBWAY)
    .execute(...);

Alternative Route

        กำหนดให้ส่งข้อมูลเส้นทางมามากกว่าหนึ่งเส้นทาง (ถ้ามี) โดยปกติแล้วตัว Google Maps Direction API จะส่งข้อมูลเส้นทางที่ดีที่สุดเท่านั้น แต่ถ้ากำหนดเป็นแบบ Alternative ก็จะส่งข้อมูลเส้นทางที่ที่เหมาะสมทั้งหมดมาให้

GoogleDirection.withServerKey(serverKey)
    .from(...)
    .to(...)
    .alternativeRoute(true)
    .execute(...);


        โดยทั้งหมดนี้สามารถกำหนดร่วมกันได้ตามต้องการ อยากจะหลีกเลี่ยงเส้นทางแบบไหน อยากเดินทางแบบไหน ก็กำหนดพร้อมๆกันได้เลย

GoogleDirection.withServerKey(serverKey)
    .from(...)
    .to(...)
    .transportMode(TransportMode.TRANSIT)
    .transitMode(TransitMode.BUS)
    .unit(Unit.METRIC)
    .execute(...);


รูปแบบข้อมูลที่ส่งกลับมา

        เมื่อข้อมูลถูกส่งกลับมาจาก Google Maps Direction API ก็จะส่งกลับมาในรูปของคลาส Direction ซึ่งข้อมูลก็จะค่อนข้างซับซ้อนพอสมควร แต่หลักๆที่ใช้งานก็จะมีดังนี้

ตรวจสอบสถานะของข้อมูล

        เนื่องจากข้อมูลก็มีปัญหาได้ในบางครั้ง ดังนั้นควรตรวจสอบสถานะของข้อมูลก่อนว่าเป็นอะไร เพื่อที่ว่าจะได้จัดการให้ถูกต้องตามแต่ละเงื่อนไข ซึ่งคลาส Direction ก็จะมีคำสั่ง getStatus() ไว้ให้ดึงมาตรวจสอบอยู่แล้ว

@Override
public void onDirectionSuccess(Direction direction) {
    String status = direction.getStatus();
    // Do something
}

        สำหรับเงื่อนไขทั้งหมดก็จะอยู่ในคลาส RequestResult ซึ่งมีทั้งหมดดังนี้

RequestResult.OK
RequestResult.NOT_FOUND
RequestResult.ZERO_RESULTS
RequestResult.MAX_WAYPOINTS_EXCEEDED
RequestResult.INVALID_REQUEST
RequestResult.OVER_QUERY_LIMIT
RequestResult.REQUEST_DENIED
RequestResult.UNKNOWN_ERROR

        OK ข้อมูลถูกต้อง มีเส้นทางที่ต้องการ ผ่านฉลุย ลุยต่อได้เลย
        NOT_FOUND ตำแหน่งพิกัดที่ระบุไม่ถูกต้อง
        ZERO_RESULTS ไม่มีเส้นทางที่ต้องการค้นหา
        MAX_WAYPOINTS_EXCEEDED กำหนด Waypoints มากเกินกำหนด ซึ่งใน Library นี้จะไม่มีปัญหานี้ เพราะว่าตอนนี้ยังไม่ได้เพิ่มคำสั่งให้กำหนด Waypoints ได้
        INVALID_REQUEST กำหนด Parameter ในการค้นหาเส้นทางไม่ถูกต้อง ซึ่งใน Library นี้จะไม่มีปัญหานี้เช่นกัน
        OVER_QUERY_LIMIT ใช้งาน Google Maps Direction API เกินโควต้า ซึ่งการใช้งานฟรีจะให้อยู่ที่ 2,500 Request ต่อวันเท่านั้น สามารถกำหนดใน Google Developer Console เพื่อจ่ายเงินสำหรับ Request ที่เกินโควต้าได้
        REQUEST_DENIED ถูกยกเลิกข้อมูล อาจจะเพราะกำหนด API Key ผิด
        UNKNOWN_ERROR เป็นข้อผิดพลาดที่ไม่สามารถระบุได้ ให้ลองเรียกใช้งานคำสั่งใหม่อีกครั้ง

        ซึ่ง Status ที่ส่งมาให้นั้นเป็น String จึงสามารถเทียบกับแต่ละเงื่อนไขได้เลย

@Override
public void onDirectionSuccess(Direction direction) {
    String status = direction.getStatus();
    if(status.equals(RequestResult.OK)) {
        // Do something
    } else if(status.equals(RequestResult.NOT_FOUND)) {
        // Do something
    }
}

        หรืออยากจะเปรียบเทียบง่ายๆว่าข้อมูลสำเร็จมั้ยก็มีคำสั่ง isOK ให้ใช้เลยนะ

@Override
public void onDirectionSuccess(Direction direction) {
    if(direction.isOK()) {
        // Do something
    }
}

Route

        เส้นทางทั้งหมดจากต้นทางไปจนถึงปลายทาง ในกรณีที่มีเส้นทางที่สามารถเดินทางได้มากกว่าหนึ่งเส้นทางก็สามารถเลือกได้ แต่ตอนส่งข้อมูลไปที่ Google Maps Direction API ต้องกำหนดด้วยว่าขอข้อมูลเป็นแบบ Alternative Route

Waypoint

        เนื่องจาก Google Maps Direction API นั้นสามารถกำหนดเส้นทางแบบต่อเนื่องได้ เช่น เดินทางจากบ้านไปร้านอาหาร แล้วเดินทางไปที่ทำงานต่อ จากเส้นทางตั้งแต่ต้นทางไปถึงปลายทาง ตำแหน่งระหว่างทางจะเรียกว่า Waypoint นั่นเอง


        ซึ่งใน Library ตัวนี้ยังไม่สามารถกำหนด Waypoint ได้ ดังนั้นข้อมูลที่ได้จึงข้ามเรื่องนี้ไปได้เลยจ้า (ไว้อัพเดทเพิ่มเข้ามาให้)

Leg

        เป็นคำที่ Google Maps Direction API ใช้เรียกเส้นทางจากจุดหนึ่งไปถึงอีกจุดหนึ่ง ในกรณีที่มี Waypoint ด้วย ก็จะมี Leg มากกว่าหนึ่งเช่นกัน


        แต่เพราะ Library นี้ไม่มี Waypoint เพราะงั้น Leg ก็จะเหลือแค่อันเดียวนะ

Step

        เป็นขั้นตอนการเดินทาง เพราะในการนำทางก็จะต้องมีบอกว่าเดินทางไปทางไหน เลี้ยวตรงไหน นั่นล่ะเค้าเรียกว่า Step ซึ่งในหนึ่งเส้นทางก็อาจจะประกอบไปด้วยหลายๆ Step ขึ้นอยู่กับว่าเส้นทางในการเดินทางนั้นซับซ้อนแค่ไหน


      จากภาพตัวอย่างข้างต้นจะเห็นว่ามีทั้งหมด 7 Step

การดึงข้อมูลเส้นทาง

        ข้อมูลเส้นทางที่ส่งมาทุกครั้ง ถ้ามีสถานะเป็น OK ก็จะมีข้อมูล Route อย่างน้อย 1 ชุด (ถ้ากำหนดเป็น Alternative Route ก็อาจจะได้ Route มากกว่า 1 ชุด) โดย Route จะอยู่ในรูปของ Array


        ซึ่งใน Route 1 ชุดก็จะมี Leg 1 ชุด (เพราะ Library นี้ยังกำหนด Waypoint ไม่ได้) ถึงแม้ว่า Leg จะมีแค่ 1 ชุด แต่ก็อยู่ในรูป Array นะ

        และใน Leg 1 ชุดก็จะมี Step อย่างน้อยหนึ่งชุด ยิ่งเส้นทางซับซ้อนมากเท่าไรก็ยิ่งเยอะมากเท่านั้น

        ถ้าต้องการดึง Route มาใช้งาน สมมติว่ามี Route แค่ตัวเดียวก็จะใช้คำสั่งแบบนี้

Route route = direction.getRouteList().get(0);

        และถ้าต้องการดึง Leg ที่อยู่ใน Route ก็จะคล้ายๆกันเลย

Route route = direction.getRouteList().get(0);
Leg leg = route.getLegList().get(0);

        เนื่องจาก Step มักจะมีมากกว่า 1 ตัว ดังนั้นก็ให้ดึงมาทั้ง List ซะ

Route route = direction.getRouteList().get(0);
Leg leg = route.getLegList().get(0);
List<stepList> = leg.getStepList();

        ซึ่งในแต่ละ Step ก็จะมีพิกัดเริ่มต้นและปลายทางของ Step นั้นๆที่สามารถดึงออกมาเป็นคลาส LatLng ที่ใช้ใน Google Maps ได้เลย


LatLng start = step.getStartLocation().getCoordination();
LatLng end = step.getEndLocation().getCoordination();

        แต่เพื่อให้ง่ายขึ้น เจ้าของบล็อกจึงทำให้มันสามารถดึงค่าจาก Leg ออกมาเป็น LatLng Array ได้เลย จะได้ไม่ต้องไปใช้ For วนดึงค่าทีละตัว

ArrayList<LatLng> pointList = leg.getDirectionPoint();

        และพิเศษสุดสำหรับการเดินทางแบบ Transit ก็จะพบว่า Step นั้นสามารถมี Step อยู่ซ้อนข้างในอีกชั้นได้


        เพราะว่าการเดินทางแบบ Transit นั้นจะมี Walking ผสมอยู่ด้วย ดังนั้นจึงมีการบอก Step แยกให้สำหรับ Walking ด้วย ซึ่งก็คือ Step ที่ซ้อนอยู่ใน Step นั่นเอง


        ซึ่งสามารถรู้ได้ว่า Step ไหนเป็นการเดินทางแบบไหนก็ให้ตรวขสอบ Travel Mode ของ Step นั้นๆ

String travelMode = step.getTravelMode();
        แล้วก็เอาไปเปรียบกับค่าในคลาส TransportMode อีกที

        ถ้าต้องการตำแหน่งของแต่ละ Step ก็สามารถดึง Section Point ออกมาจาก Leg เพื่อใช้งานได้เลย โดยส่งออกมาเป็น LatLng Array

ArrayList<LatLng> sectionList = leg.getSectionPoint();

        ถ้าต้องการระยะทางหรือระยะเวลาในการเดินทางของเส้นทางทั้งหมดก็สามารถดึงข้อมูลได้จาก Leg เลย

Info distanceInfo = leg.getDistance();
Info durationInfo = leg.getDuration();
String distance = distanceInfo.getText();
String duration = durationInfo.getText();

        แต่ถ้าอยากระยะทางหรือระยะเวลาในการเดินทางของแต่ละ Step ก็ให้ดึงข้อมูลจากแต่ละ Step ได้เลย

Info distanceInfo = step.getDistance();
Info durationInfo = step.getDuration();
String distance = distanceInfo.getText();
String duration = durationInfo.getText();

       ถ้าอยากรู้ว่าต้องเดินทางไปทิศทางไหนก็ให้ดึงข้อมูลจาก Maneuver ที่อยู่ในแต่ละ Step แล้วเอาไปเปรียบเทียบกับค่าที่อยู่ในคลาส Maneuver อีกที หรือถ้าต้องการเป็นข้อความที่ใช้แสดงให้ผู้ใช้เห็นเลย สามารถดึงจาก HTML instruction ได้เลย

String maneuver = step.getManeuver();
String instruction = step.getHtmlInstruction();
        แต่ว่า Instruction อยู่ในรูป HTML นะ ถ้าเอาไปแสดงก็อย่าลืม Format ให้เป็น HTML ด้วยนะ

อยากจะเอา Step ทั้งหมดไปแสดงบน Google Maps

        สำหรับการวาดเส้นทางบน Google Maps จะต้องวาดเป็น Polyline โดยอยู่ในรูปของคลาส PolylineOptions ซึ่งใน Library ตัวนี้สามารถดึง LatLng Array แล้วแปลงเป็น PolylineOptions ได้ทันที เพราะมีคลาส DirectionConverter ให้ใช้งานแล้ว

ArrayList<LatLng> directionPositionList = leg.getDirectionPoint();
PolylineOptions polylineOptions = DirectionConverter.createPolyline(this, directionPositionList, 5, Color.RED);
googleMap.addPolyline(polylineOptions);

        โดย 5 คือขนาดของเส้นในหน่วย DP และ Color.RED คือกำหนดเส้นเป็นสีแดง

        จากตัวอย่างข้างต้นก็จะได้เส้นทางออกมาเป็นแบบนี้


        แต่ถ้าการเดินทางเป็นแบบ Transit จะแตกต่างจากปกติเสียหน่อย เพราะมันผสมระหว่าง Transit กับ Walking ซึ่งคงไม่เหมาะซักเท่าไรถ้าแสดงเส้นทางเป็นเส้นแบบเดียวกันหมดเลย ดังนั้นจึงมีขั้นตอนเพิ่มเติมนิดหน่อยสำหรับการเดินทางแบบ Transit ครับ

       การเดินทางแบบ Transit ให้ดึงค่า Step List ออกมาแทน แล้วใช้คำสั่งจากในคลาส DirectionConverter เพื่อแปลงข้อมูลเส้นทางแบบ Transit ให้ออกมาเป็น PolylineOptions Array แล้วจึงนำไปแปะลงบน Google Maps

List<Step> stepList = direction.getRouteList().get(0).getLegList().get(0).getStepList();
ArrayList<PolylineOptions> polylineOptionList = DirectionConverter.createTransitPolyline(this, stepList, 5, Color.RED, 3, Color.BLUE);
for (PolylineOptions polylineOption : polylineOptionList) {
    googleMap.addPolyline(polylineOption);
}

        สำหรับคำสั่ง createTransitPolyline นั้นจะสามารถกำหนดเส้นทางของ Transit กับ Walking แยกกันได้ จากในตัวอย่างจะกำหนดให้เส้นทาง Transit มีขนาด 5dp เป็นสีแดง ส่วนเส้นทาง Walking มีขนาด 3dp เป็นสีน้ำเงิน


        ในแต่ละ Step ของการเดินทางแบบ Transit จะสามารถดึงข้อมูลรายละเอียดของรถโดยสารนั้นๆเพิ่มเติมได้ โดยจะอยู่ในรูปของคลาส TransitDetail

TransitDetail transitDetail = step.getTransitDetail();

        ซึ่งภายในคลาส TransitDetail ก็จะประกอบข้อมูลต่างๆไม่ว่าจะเป็นตำแหน่งที่ขึ้น/ลงรถโดยสาร ช่วงเวลาที่รถโดยสารมาถึงและถึงจุดหมาย และมีรายละเอียดเกี่ยวกับรถโดยสารนั้นๆเพื่อนำมาแสดงผลภายในแอพอีกด้วย โดยจะอยู่ในคลาส Line

StopPoint arrivalStopPoint = transitDetail.getArrivalStopPoint();
StopPoint departureStopPoint = transitDetail.getDepartureStopPoint();
TimeInfo arriveTimeInfo = transitDetail.getArrivalTime();
TimeInfo departureTimeInfo = transitDetail.getDepartureTime();
String headSign = transitDetail.getHeadsign();
String stopNumber = transitDetail.getStopNumber();
Line transitLine = transitDetail.getLine();

มีอะไรใหม่ในเวอร์ชัน 1.0.5

        เจ้าของบล็อกได้อัปเดตไลบรารีตัวนี้เป็นเวอร์ชัน 1.0.5 แล้ว ซึ่งมีการแก้บั๊กและเพิ่มคลาส GoogleDirectionConfiguration เข้าไปเพื่อให้สามารถตั้งค่าบางอย่างสำหรับไลบรารีได้

แสดง Log เมื่อมีเรียกดึงข้อมูลเส้นทาง

GoogleDirectionConfiguration.getInstance().setLogEnabled(true);

        ถ้าไม่มีการกำหนดค่าในคำสั่งนี้ จะมีค่า Default เป็น False

ใช้ Custom OkHttpClient ของผู้ที่หลงเข้ามาอ่าน

      เพื่อให้ผู้ที่หลงเข้ามาอ่านสามารถปรับเปลี่ยนการทำงานของ OkHttpClient ได้ตามใจชอบ

OkHttpClient client = ....
GoogleDirectionConfiguration.getInstance().setCustomClient(client);

        กำหนดค่าดังกล่าวเพียงแค่ครั้งเดียว ก่อนที่จะเรียกใช้คำสั่งดึงข้อมูลเส้นทาง

Demo

        สามารถไปดาวน์โหลดลองดูกันก่อนได้ที่
        Demo App for Google Direction Library [Play Store]

Source Code

        ถ้าอยากลองศึกษา Source Code ของ Library ตัวนี้ก็เข้าไปส่องใน GitHub กันได้เลยจ้า
        Google Direction Library [GitHub]

Reference Documentation

        Intro : The Google Maps Directions API {Google Developers]




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium