GIS Mapping in PHP
Saturday, January 10th, 2009พอดีผมไปเจอในเว็บต่างประเทศมาสำหรับการทำ GIS Mapping เบื้องต้น เจอมานานแล้ว save ไว้ในเครื่อง ลืมไปแล้วว่าเว็บไหน พอดีมีเพื่อนผมถามขึ้นมาเรื่องการมาร์คจุดบนแผนที่ ก็เลยหาๆในคลังความรู้ของผมที่บ้าน ซึ่งคิดว่าน่าจะมีประโยชน์ในการประยุกต์ใช้งานได้ในอนาคตเลยเอามาเขียนให้อ่านกัน โดยเป็นเบื้องต้นที่ทำได้ง่ายๆจริงๆ คำสั่งต่างๆก็ไม่ได้มีอะไรมากมายนะครับ
สิ่งที่ต้องการก็คืออะไรบ้างครับ
- แผนที่โลกซึ่งเป็น base map
- ตำแหน่งละติจูด และ ลองติจูด จำแหน่งที่เราต้องการมาร์คตำแหน่งลงไป
- GD ในเครื่องของเรา หรือ Server ครับ
มาดูที่รูปแผนที่ ผมก็ได้โหลดมาจาก ตัวอย่าง มาให้ดูนะครับ

รูปนี้เลยครับ หากใครจะหารูปใหญ่ก็ไปหากันเอาเองนะครับ
ตำแหน่งละติจูด(lat) กับ ลองติจูด(lng) ก็สามารถหาได้จากพวก Google map ต่างๆได้นะครับ แต่สำหรับผมเองนั้น มีดาต้าเบสส่วนตัวที่เก็บไว้ทุกจังหวัดอยู่แล้วในดาต้าเบส เลยดึงมาใช้ได้ง่ายหน่อย

จากนั้นก็เขียนโค๊ดครับโดยผมจะให้มาร์คจุดลงไปที่ กรุงเทพมหานคร โดยมีค่า lat และ lng คือ 13.75 กับ 100.5166667 ก็เขียนได้ดังนี้
<?php
if(empty($lat)) $lat = 13.75;
if(empty($long))$long = 100.5166667;
$im = imagecreatefromjpeg(”earth_310.jpg“); //รูปแผนที่ที่จะนำมาสร้าง
$red = imagecolorallocate ($im, 255,0,0);
$scale_x = imagesx($im);
$scale_y = imagesy($im);
$pt = getlocationcoords($lat, $long, $scale_x, $scale_y);
// สร้างมาร์คสี่เหลี่ยมสีแดงขนาด 4 pixel
imagefilledrectangle($im,$pt[”x”]-2,$pt[”y”]-2,$pt[”x”]+2,$pt[”y”]+2,$red);
imagestring($im,2,1,$scale_y-20,”Country of Bangkok Thailand“,$red); //ตัวอักษรที่จะแสดงด้านล่างรูป
header(”Content-Type: image/png”);
imagepng($im);
imagedestroy($im);
function getlocationcoords($lat, $lon, $width, $height)
{
$x = (($lon + 180) * ($width / 360));
$y = ((($lat * -1) + 90) * ($height / 180));
return array(”x”=>round($x),”y”=>round($y));
}
?>
โดยแก้ไขค่าต่างๆแล้วลองรันดูนะครับ ก็จะได้ผลดังนี้

ผมก็เลยลองหา map ใหม่จากใน Google แล้วก็นำมาย่อขยายให้ได้สัดส่วน แล้วลองทดสอบอีกครั้งก็ได้ผลดังนี้

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



















