แจก php class หาพิกัด Latitude และ Longitude จากรูปภาพ

เขียนเมื่อ 7 ปีก่อน โดย Ninenik Narkdee
exif gps tag php

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ exif gps_tag php

ดูแล้ว 11,601 ครั้ง


ก่อนจะดาวน์โหลดโค้ดตัวอย่าง ขอเกริ่นเบื้องต้นเกี่ยวกับพิกัด 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 ทิศตำแหน่งของพิกัดในแผนที่ตาม
ที่ได้อธิบายมาข้างต้น

 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ





Tags:: gps tag exif php




เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ