เริ่มกันที่ไฟล์ pod สิ่งที่ต้องเพิ่มเพื่อการวาดเส้นทางคือ
จากนั้นไปที่ console.developers.google.com แล้ว enable API Google Maps Directions API
เพิ่มอีก 1 ตัว(เป็น3) สำหรับคำนวณเส้นทางผ่าน HTTP โดยสามารถเลือกการเดินทาง
ได้ 4 แบบคือ เดิน จักรยาน รถส่วนตัวและรถประจำทาง
จากนั้นไปที่ main.storyboard เนื่องจากเราจะใช้การ autocomplete ของ google map จึงต้องมีการเปิดหน้าใหม่ขึ้นมาเพื่อค้นหาสถานที่ เมื่อมีการเปิดหน้าใหม่-กลับหน้าเก่า ก็ต้องใช้ navigation controller สร้าง navigation controller ขึ้นมา วาง text field และ button บน text field ปุ่ม 3 ปุ่มสำหรับเลือกโหมดการเดินทาง ตกแต่ง-วางlayoutให้เรียบร้อย ก็จะได้หน้าตาประมาณนี้(ไม่ได้ตกแต่ง)
ระวังลำดับการวางด้วย อย่าให้มันบังกัน
แล้วก็ไปเขียนโค้ดกัน จากที่เรา pod ไฟล์เพิ่มมา 2 อันก็ import มันเข้ามาที่ viewController เลยแล้ว ประกาศ action ให้ปุ่มและ outlet ให้ textfield รอไว้เลย
ที่ class ViewController: เพิ่ม GMSAutocompleteViewControllerDelegate ไป ถ้าเกิด error ไม่ต้องตกใจ GMSAutocompleteViewController ต้องการฟังก์ชั่นมารองรับ 3 ฟังก์ชั่น คือ
didAutocompleteWith จะทำงานเมื่อเราเลือกสถานที่ที่ google autocomplete ให้
wasCancelled จะทำงานเมื่อเรากดยกเลิกที่หน้าค้นหา
สำหรับใน didAutocompleteWith การทำงานจะเป็นดังนี้
-ถ้าเราเลือกช่องจุดเริ่มต้น(From)จะให้ startLocation เก็บค่าสถานที่ที่เราค้นหา
-ถ้าเราเลือกช่องปลายทาง(To)จะให้ endLocation เก็บค่าสถานที่ที่เราค้นหา
-camera ใช้สำหรับเลื่อน view ของเราไปที่จุดเราเลือก(ไม่ใช้ก็ได้)
-.clear() ใช้สำหรับลบจุดหมายและเส้นทางเก่าที่เราเลือกไว้
-ถ้าตำแหน่งเริ่มและปลายทางไม่ใช่ค่าว่างเปล่า ให้เรียกใช้ฟังก์ชั่น drawRoute(จะอธิบายหลังจากนี้)
-ให้ช่องค้นหาที่เราเลือกมีข้อความเป็นสถานที่ที่เราเลือก
***ตัวแปรที่เรายังไม่มีคือ selectedLocation, startLocation, endLocation, selectedTF
จากตัวแปรที่ยังขาดอยู่ ให้เราประกาศเพิ่ม 4 ตัว(locationManager มีอยู่แล้ว) เป็น
จากนั้นเราจะขาดฟังก์ชั่น drawRoute หรือฟังก์ชั่นที่วาดเส้นทางนั่นเอง ก็สร้างฟังก์ชั่นขึ้นมา โดยจะรับค่าเข้า 2 ตัว คือจุดเริ่มต้นและปลายทาง
จากนั้นให้เปลี่ยนค่าตำแหน่งที่รับมาให้เป็น string เพื่อนำไปใช้กับ HTTP
สำหรับ url ตรง json?origin= คือค่า latitude,longtitude ของจุดเริ่มต้นในรูป string
destination= คือค่า latitude,longtitude ของจุดปลายทางในรูป string
mode= คือรูปแบบการเดินทาง(walking, cycling, driving, transit)
***ตัวแปรที่เรายังไม่มีคือ selectedMode ให้ประกาศเพิ่ม var selectedMode = "เลือก 1 โหมด" เป็น
ฟังก์ชั่น drawRoute ยังไม่จบ หลังจากวางจุดเริ่มและปลายทางแล้ว ต่อเป็นก็จะให้วาดเส้นบน view ของเรา(พิมพ์เยอะหน่อยนะ)
สิ่งที่เปลี่ยนได้ก็คือ รูปแบบเส้น GMSPolyline, ความหน้าของเส้น strokeWidth, สีของเส้น strokeColor
แล้วเราก็จะมาโค้ดให้ปุ่มค้นหากัน จากที่ประกาศ action ไว้ตอนแรก(From, To)การทำงานจะคล้ายกัน(มากๆ)
ปุ่ม startLocAction คือจุดเริ่มต้น เมื่อกดแล้วจะเปิดหน้าใหม่ขึ้นมา เป็นหน้าค้นหาสถานที่ของ google ก็ประกาศตัวแปรขึ้นมาให้เป็น GMSAutocompleteViewController()
อย่าลืมให้ autoComplete.delegate = self จากนั้นให้แอพจำค่าว่าเราเลือกช่องจุดเริ่มต้นหรือปลายทาง เนื่องจาก xcode มี didAutocomplete แค่ฟังชั่นเดียว มันแยกไม่ออกว่าเราจะเลือกจุดไหน เลยต้องกำหนดให้มัน ส่วนปุ่มปลายทาง endLocAction โค้ดเหมือนกันเลยแค่เปลี่ยน selectedTF, selectedLocation เป็นตัวปลายทางก็เรียบร้อย
ถึงตอนนี้ถ้าลองรันดู น่าจะได้เส้นแล้วแต่ไม่มีหมุดปักที่ต้นทางและปลายทาง และยังไม่สามารถเลือกโหมดการเดินทางได้
*เกือบลืมไป เราไม่ได้กำหนดค่าเริ่มต้นให้กับ startLocation และ endLocation จะทำให้เกิด error ได้
ต้องไปกำหนดค่าเริ่มต้นในฟังก์ชั่น didUpdateLocations ด้วย
ถึงตอนนี้ถ้าลองรันดู น่าจะได้เส้นแล้วแต่ไม่มีหมุดปักที่ต้นทางและปลายทาง และยังไม่สามารถเลือกโหมดการเดินทางได้
*เกือบลืมไป เราไม่ได้กำหนดค่าเริ่มต้นให้กับ startLocation และ endLocation จะทำให้เกิด error ได้
ต้องไปกำหนดค่าเริ่มต้นในฟังก์ชั่น didUpdateLocations ด้วย
การเลือกโหมดนั้นง่ายมาก จาก action ของปุ่มที่เราประกาศไว้แล้ว ให้ตัวแปร
selectedMode = "โหมดที่เลือก" แล้ว clear() เพื่อลบเส้นเก่าออกจาก view และเรียกใช้ drawRoute เพื่อสร้างเส้นใหม่ตามโหมดการเดินทางที่เราเลือก อยากได้กี่โหมดก็เพิ่มเอาเลย(action ละ 1 โหมด)
ส่วนหมุด น่าจะเคยทำกันไปแล้วในครั้งที่แล้ว เพียงแค่คราวนี้เราสร้างให้เป็นฟังก์ชั่นเพื่อความสะดวกในการใช้
เมื่อได้ฟังก์ชั่นแล้ว ก็เรียกใช้กันตามต้องการได้เลย ในนี้ใส่ไว้ในฟังก์ชั่น drawRoute(ล่างสุด)
เท่านี้ก็เสร็จเรียบร้อยครับ
Comments
Post a Comment