ก่อนจะดาวน์โหลดโค้ดตัวอย่าง ขอเกริ่นเบื้องต้นเกี่ยวกับพิกัด GPS ในรูปภาพ
โดยอุปกรณ์สำหรับถ่ายภาพในปัจจุบันจะมีความสามารถในการทำการบันทึก
ตำแหน่ง GPS ของอุปกรณ์ในขณะถ่ายภาพ ลงในรูปภาพ ตามที่ผู้ใช้กำหนดได้
ซึ่งถ้าหากมีการใช้งาน จะทำให้เราสามารถระบุตำแหน่งพิกัดของภาพนั้นในภายหลัง
หรือแม้แต่นำข้อมูลพิกัดนี้ไปใช้ประโยชน์อื่นๆ ต่อไป
ข้อมูล EXIF headers หรือที่เรียกว่า meta data (ชุดข้อมูล) ที่ถูกสร้างและบันทึกจากอุปกรณ์
ถ่ายภาพนี้ สามารถคำสั่ง PHP ในการอ่านค่าได้ ด้วยคำสั่งง่ายๆ ดังนี้
ไฟล์ demo_index.php
<?php $exif = exif_read_data('picgps++.jpg', 0, true); echo "<pre>"; print_r($exif); echo "</pre>"; ?>
ตัวอย่างผลลัพธ์เมื่อเราทดสอบรันโค้ดข้อมูลที่รูปภาพที่ GPS tag
Array ( [FILE] => Array ( [FileName] => picgps++.jpg [FileDateTime] => 1488908121 [FileSize] => 168398 [FileType] => 2 [MimeType] => image/jpeg [SectionsFound] => ANY_TAG, IFD0, COMMENT, GPS ) [COMPUTED] => Array ( [html] => width="900" height="674" [Height] => 674 [Width] => 900 [IsColor] => 1 [ByteOrderMotorola] => 1 ) [IFD0] => Array ( [XResolution] => 96/1 [YResolution] => 96/1 [ResolutionUnit] => 2 [YCbCrPositioning] => 1 [GPS_IFD_Pointer] => 90 ) [COMMENT] => Array ( [0] => CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 85 ) [GPS] => Array ( [GPSVersion] => [GPSLatitudeRef] => N [GPSLatitude] => Array ( [0] => 14/1 [1] => 20/1 [2] => 36840/1837 ) [GPSLongitudeRef] => E [GPSLongitude] => Array ( [0] => 101/1 [1] => 0/1 [2] => 5175/512 ) ) )
จะเห็นว่า มีข้อมูลเกี่ยวกับพิกัด GPS ในไฟล์ตัวอย่าง
ต่อไปเราทดสอบกับไฟล์ที่ไม่มีพิกัด GPS จะได้ผลลัพธ์ดังนี้
Array ( [FILE] => Array ( [FileName] => picgps.jpg [FileDateTime] => 1488907984 [FileSize] => 15819 [FileType] => 2 [MimeType] => image/jpeg [SectionsFound] => COMMENT ) [COMPUTED] => Array ( [html] => width="260" height="195" [Height] => 195 [Width] => 260 [IsColor] => 1 ) [COMMENT] => Array ( [0] => CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 85 ) )
อย่างไรก็ตามข้อมูล EXIF data ในไฟล์ภาพ บางคร้้งและโดยส่วนมาก ก็อาจจะหายไปเมื่อเรามีการ
ปรับแต่งรูปภาพด้วยคำสั่ง php อย่างการปรับบนาดของรูปภาพ ดังนั้นต้องตรวจสอบให้มั่นใจว่าคำสั่ง
หรือโปรแกรมที่เราจัดการรูปภาพ ไม่ทำการลบข้อมูลหรือทำให้ข้อมูล EXIF บางค่าหายไป
สำหรับใครที่ต้องเพิ่มพิกัด GPS ลงในรูปภาพ เพื่อประกอบการทดสอบเนื้อหานี้สามารถเข้าไปที่เว็บไซต์
โดยสามารถอัพโหลดรูปภาพที่ไม่มีพิกัด GPS จากนั้นลาก marker หาตำแหน่งพิกัดในแผนที่ ตามต้องการ
แล้วกดที่ปุ่ม Tag Photo เพื่อเพิ่มพิกัดลงในรูปภาพ เสร็จแล้วก็สามารถกดปุ่มดาวน์โหลดมาทดสอบได้เลย
หมายเหตุ: ไฟล์ทดสอบที่เตรียมให้ดาวน์โหลดมีไฟล์รูปตัวอย่างที่มีการแทรกพิกัดมาให้แล้ว
ความรู้เบื้องต้นเกี่ยวกับ พิกัด Latitude และ Longitude ในแผนที่
ให้เราดูรูปภาพแผนที่ด้านล่างประกอบ
จากรูปเราจะเห็นว่าพิกัด Latitude กับ Longitude จะมีค่าสัมพันธ์ตามดังนี้
- ค่า Latitude ที่มีค่าเป็นบวก คือค่าตำแหน่งที่อยู่เหนือเส้นแบ่งแนวนอน
มีค่าตั้งแต่ 0 ถึง 90 มีค่าทศนิยมแบ่งความละเอียดของตำแหน่ง
- ค่า Latitude ที่มีค่าเป็นลบ คือค่าตำแหน่งที่อยู่ใต้เส้นแบ่งแนวนอน
มีค่าตั้งแต่ -0 ถึง -90 มีค่าทศนิยมแบ่งความละเอียดของตำแหน่ง
- ค่า Longitude ที่มีค่าเป็นบวก คือค่าตำแหน่งที่อย่างด้านขวามือของเส้นแบ่งแนวตั้ง
มีค่าตั้งแต่ 0 ถึง 180 มีค่าทศนิยมแบ่งความละเอียดของตำแหน่ง
- ค่า Longitude ที่มีค่าเป็นลบ คือค่าตำแหน่งที่อย่างด้านซ้ายมือของเส้นแบ่งแนวตั้ง
มีค่าตั้งแต่ -0 ถึง -180 มีค่าทศนิยมแบ่งความละเอียดของตำแหน่ง
เรามาดูตัวอย่างค่าตำแหน่ง Latitude กับ Longitude ในตำแหน่งต่าง
14.338904010195082 101.0028076171875
N E + + มีค่าบวกทั้งคู่
-22.441494859380246 -54.38781738281244
S W - - มีค่าลบทั้งคู่
-8.939340105948668 38.4246826171875
S E - +
19.736160211943616 -12.131530774999874
N W + -
จะเห็นว่า ค่า - จะเป็นพิกัดที่อยู่ทางทิศ S และ W
ส่วนค่า + จะเป็นพิกัดที่อยู่ทางทิศ N และ E
ถ้าเราไปเช็คดูตำแหน่งของประเทศไทยในแผนที่ https://tool.geoimgr.com/
เพื่อระบุพิกัดจะพบว่าประเทศไทยอยู่ในตำแหน่ง NE มีค่า Latitude และ Longitude เป็นค่า บวก
ส่วนใครอยากรู้ว่าตำแหน่งที่แบ่งระหว่างทิศตะวันตกกับตะวันออก หรือแบ่งระหว่าง W กับ E ที่ตำแหน่ง
ขอบอีกด้าน ก็สามารถนำค่า 0.00,180.00 หรือ 0.00,-180.00 ไปค้นในแผนที่ google map
ได้ ซึ่งทั้งสองค่าคือตำแหน่งเดียวกัน โดยถ้าเปรียบแผนที่โลกเป็นกระดาษ A4 หนึ่งแผ่น
ขอบด้านซ้ายสุดและขอบด้านขวาสุด ก็คือพิกัดที่ 0.00,180.00 หรือ 0.00,-180.00 ตรงกลางแผ่น
ก็คือตำแหน่ง 0.00,0.00 นั้นเอง
การนำค่าพิกัด GPS ในรูปภาพมาใช้งานเพื่อหาค่า Latitude และ Longitude
จากที่เราได้อธิบายไปบ้างแล้วในตอนต้น เราพบว่าค่าพิกัดที่เก็บในรูปภาพ จะไม่ได้เก็บเป็นค่า Latitude
หรือค่า Longitude ตามที่เราเข้าใจ แต่จะเก็บในรูปแบบ GPS format
ดูเพิ่มเติมได้ที่ https://en.wikipedia.org/wiki/Geotagging#Geotagging_photos
เราลองเอาค่าจากตัวแปร array ของข้อมูล EXIF ตัวอย่างมาพิจารณา สมมติใช้ค่า Latitude
[GPSLatitudeRef] => N [GPSLatitude] => Array ( [0] => 14/1 [1] => 20/1 [2] => 36840/1837 )
นั้นหมายถึง
14/1 degrees ก็คือค่า 14 หารด้วย 1 เท่ากับ 14
20/1 minutes ก็คือค่า 20 หารด้วย 1 เท่ากับ 20
36840/1837 seconds ก็คือค่า 36840 หาร 1837 เท่ากับ 20.05443658138269
ก็จะได้รูปแบบ 14°20′20.054″N แบบนี้
ทีนี้เวลาเราแปลงเป็น Latitude และ Longitude ต้องทำยังไง เราจะใช้แปลงค่า
นี้คือส่วนของโค้ดของฟังก์ชั่นใน class ที่เราสร้างขึ้นสำหรับแปลงค่า
$negative = ($direction=="N" || $direction=="E")?1:-1; return ($degrees+((($minutes*60)+($seconds))/3600))*$negative;
โดยค่าจะเป็นค่าลบ ถ้าเป็นทิศ W และ S
จากตัวอย่าง Latitude ที่เราทดสอบด้านบนเราได้
degrees = 14
minutes = 20
secconds = 20.05443658138269
เมื่อเอาเข้าในสูตรคำสั่งข้างต้น จะได้เป็น
(14+(((20*60)+(20.05443658138269))/3600))*1;
= 14+0.0389040101614952
= 14.0389040101615
โดยค่าที่เรา tag จะเป็น 14.338904010195082
เมื่อลองเอามาเทียบกัน จะพบว่า
14.0389040101 615
14.3389040101 95082
มีความถูกต้องถึงทศนิยมตำแหน่งที่ 10
เราได้อธิบายไปแล้วถึงที่มาที่ไปคร่าวๆ เกี่ยวกับพิกัด GPS และตำแหน่ง Latitude กับ Longitude
ที่นี้เรามาดูวิธีการใช้งาน php class ที่เราสร้างขึ้น โดยทำให้ใช้งานง่ายที่สุด
นี้คือโค้ดไฟล์ตัวอย่าง demo_index.php
<?php include_once("gps2latlon.php"); $photoGPS = new gps2latlon(); //$arr_location = $photoGPS->getgpsdata("picgps+-.jpg",true); // กรณีต้องการแสดงค่า GPS format $arr_location = $photoGPS->getgpsdata("picgps+-.jpg"); // กรณีต้องการแสดง Latitude และ Longitude // ถ้ามีข้อมูลเกี่ยวกับพิกัดใรรูปภาพ if($arr_location){ echo "<pre>"; print_r($arr_location); echo "</pre>"; }else{ echo "No GPS tag"; } ?>
บรรทัดที่ 2 เป็นการ include php class ของเรามาใช้งาน
บรรทัดที่ 4 เป็นตัวอย่างสำหรับดึงค่า degrees minutes secconds และ direction ของ EXIF data
ที่มีการ tag ไว้ในรูป โดยถ้ามีค่า บรรทัดที่ 7 ก็จะได้แปร array ตามโครงสร้าง
ที่แสดงด้วยคำสั่ง print_r() เราสามารถเข้าค่า array ไปใช้งานได้ แต่ถ้ารูปนั้นๆ ไม่มีข้อมูล EXIF data
ที่เป็นพิกัด GPS ก็จะคืนค่าเป็น false ในที่นี้เราให้แสดงข้อความ No GPS tag
บรรทัดที่ 5 สังเกตความแตกต่างจากบรรทัดที่ 4 โดยบรรทัดที่ 5 เราไม่ได้ทำการส่งค่า argument เข้าไป
ในฟังก์ชั่น ซึ่งกรณีไม่ส่งค่าหรือเป็นค่า false จะเป็นการ ดึงข้อมูล array พิกัดในรูปแบบ Latitude และ Longitude
ดูรูปภาพประกอบบ
ดึงค่า degrees minutes secconds และ direction ของ EXIF data
ผลลัพธ์
ดึงข้อมูล array พิกัดในรูปแบบ Latitude และ Longitude
ผลลัพธ์
เปลี่ยนเป็นไฟล์รูปที่ไม่มี GPS tag
ผลลัพธ์
เท่านี้เราก็สามารถนำ php class หาพิกัด GPS ในรูปภาพไปใช้งานอย่างง่ายได้แล้ว สำหรับใครที่ต้องการดู
การทำงานของคำสั่ง สามารถลองศึกษาดูได้ที่ไฟล์ php class
ดาวน์โหลด php class หาพิกัด GPS จากไฟล์รูปภาพได้ที่
https://goo.gl/2QD3EY
ปล. ไฟล์รูปภาพตัวอย่างที่มีชื่อลงท้ายเป็น --,++,+-,-+ .jpg คือไฟล์ทดสอบที่ได้ทำการแทรก พิกัดเข้าไป
สามารถใช้เป็นตัวทดสอบการทำงานของ php class ได้ โดยค่า - + คือค่า NEWS ทิศตำแหน่งของพิกัดในแผนที่ตาม
ที่ได้อธิบายมาข้างต้น