February 22, 2012

แปลง Latitude, Longitude ให้เป็น Address


ก่อนหน้า iOS 5.0 เราจะ Reverse Geocoding (แปลง latitude, longitude ให้กลายเป็น Address) ด้วยการใช้ MKReverseGeocoder (entry เก่า) ซึ่งถ้าหากว่ากด link เข้าไปดู API reference แล้วจะพบว่า MKReverseGeocoder นั้นถูก deprecated แล้วใน iOS 5.0 และทาง Apple เองก็ได้แนะนำให้ใช้ CLGeocoder แทน

เราจะใช้ method – reverseGeocodeLocation:completionHandler: ในการหาชื่อสถานที่จาก latitude, longitude วิธีใช้งานก็คือสร้าง geocoder object ขึ้นมา และเตรียม CLLocation ไว้ให้พร้อม จากนั้นก็ call method ได้เลย

CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocation *location = [[CLLocation alloc] initWithLatitude: latitude longitude: longitude];
[geocoder reverseGeocodeLocation: location
               completionHandler: ^(NSArray *placemarks, NSError *error){
                   NSLog(@"placemarks = %@", placemarks);
                   NSLog(@"error = %@", error);
   }];

ก่อนใช้งาน อย่าลืม link CoreLocation.framework ด้วยแล้วก็อย่าลืม

#import <CoreLocation/CLGeocoder.h>

นอกจาก CLGeocoder จะหาชื่อสถานที่จาก latitude, longitude (เรียกว่า Reverse-geocoder) ได้แล้ว มันยังสามารถแปลงชื่อสถานที่ให้กลายเป็น latitude, longitude ได้อีกด้วย (เรียกเท่ๆ ว่า Forward-geocoder) ทำอย่างไรนั้นก็อ่านได้จาก API reference เองได้เลย :)

สำหรับข้อตกลงในการใช้ CLGecoder นั้น ทาง Apple กำหนดแนวทางการใช้งานไว้ 4 ข้อหลักๆ ดังนี้
  1. ณ ตำแหน่งใดๆ ให้ส่ง request ไปแค่ครั้งเดียวก็พอ
  2. ให้พยายาม reuse ใช้ผลลัพธ์เดิม ไม่ต้องส่งที่เดิมไปขอตำแหน่งซ้ำๆ 
  3. หากต้องการให้โปรแกรมมีการอัพเดทสถานที่โดยอัตโนมัติ (เช่นกำลังเคลื่อนที่อยู่) ให้รอจนกว่าจะมีการเปลี่ยนตำแหน่งที่อยู่อย่างมีนัยยะสำคัญก่อน ไม่ต้องถึงกับขยับนิดขยับหน่อยก็ขอข้อมูลอยู่เรื่อยๆก็ได้
  4. ถ้าเป็นไปได้ อย่าขอตำแหน่งหากผู้ใช้งานยังไม่อยากรู้ หรือขอไปผู้ใช้งานก็ไม่รู้อยู่ดี เช่นโปรแกรมยังไม่ได้เปิดหน้าที่จะต้องแสดงผลลัพธ์ของการขอ หรือโปรแกรมกำลังรันอยู่ใน background เป็นต้น