PHP ฟังก์ชั่นแปลงพิกัด UTM ให้เป็น Lat Long

<?php
function ToLL($north, $east, $utmZone)
{
  // This is the lambda knot value in the reference
  $LngOrigin = Deg2Rad($utmZone * 6 - 183);

  // The following set of class constants define characteristics of the
  // ellipsoid, as defined my the WGS84 datum.  These values need to be
  // changed if a different dataum is used.    

  $FalseNorth = 0;   // South or North?
  //if (lat < 0.) FalseNorth = 10000000.  // South or North?
  //else          FalseNorth = 0.   

  $Ecc = 0.081819190842622;       // Eccentricity
  $EccSq = $Ecc * $Ecc;
  $Ecc2Sq = $EccSq / (1. - $EccSq);
  $Ecc2 = sqrt($Ecc2Sq);      // Secondary eccentricity
  $E1 = ( 1 - sqrt(1-$EccSq) ) / ( 1 + sqrt(1-$EccSq) );
  $E12 = $E1 * $E1;
  $E13 = $E12 * $E1;
  $E14 = $E13 * $E1;

  $SemiMajor = 6378137.0;         // Ellipsoidal semi-major axis (Meters)
  $FalseEast = 500000.0;          // UTM East bias (Meters)
  $ScaleFactor = 0.9996;          // Scale at natural origin

  // Calculate the Cassini projection parameters

  $M1 = ($north - $FalseNorth) / $ScaleFactor;
  $Mu1 = $M1 / ( $SemiMajor * (1 - $EccSq/4.0 - 3.0*$EccSq*$EccSq/64.0 - 5.0*$EccSq*$EccSq*$EccSq/256.0) );

  $Phi1 = $Mu1 + (3.0*$E1/2.0 - 27.0*$E13/32.0) * sin(2.0*$Mu1);
    + (21.0*$E12/16.0 - 55.0*$E14/32.0)           * sin(4.0*$Mu1);
    + (151.0*$E13/96.0)                          * sin(6.0*$Mu1);
    + (1097.0*$E14/512.0)                        * sin(8.0*$Mu1);

  $sin2phi1 = sin($Phi1) * sin($Phi1);
  $Rho1 = ($SemiMajor * (1.0-$EccSq) ) / pow(1.0-$EccSq*$sin2phi1,1.5);
  $Nu1 = $SemiMajor / sqrt(1.0-$EccSq*$sin2phi1);

  // Compute parameters as defined in the POSC specification.  T, C and D

  $T1 = tan($Phi1) * tan($Phi1);
  $T12 = $T1 * $T1;
  $C1 = $Ecc2Sq * cos($Phi1) * cos($Phi1);
  $C12 = $C1 * $C1;
  $D  = ($east - $FalseEast) / ($ScaleFactor * $Nu1);
  $D2 = $D * $D;
  $D3 = $D2 * $D;
  $D4 = $D3 * $D;
  $D5 = $D4 * $D;
  $D6 = $D5 * $D;

  // Compute the Latitude and Longitude and convert to degrees
  $lat = $Phi1 - $Nu1*tan($Phi1)/$Rho1 * ( $D2/2.0 - (5.0 + 3.0*$T1 + 10.0*$C1 - 4.0*$C12 - 9.0*$Ecc2Sq)*$D4/24.0 + (61.0 + 90.0*$T1 + 298.0*$C1 + 45.0*$T12 - 252.0*$Ecc2Sq - 3.0*$C12)*$D6/720.0 );

  $lat = Rad2Deg($lat);

  $lon = $LngOrigin + ($D - (1.0 + 2.0*$T1 + $C1)*$D3/6.0 + (5.0 - 2.0*$C1 + 28.0*$T1 - 3.0*$C12 + 8.0*$Ecc2Sq + 24.0*$T12)*$D5/120.0) / cos($Phi1);

  $lon = Rad2Deg($lon);

  // Create a object to store the calculated Latitude and Longitude values
  $PC_LatLon['lat'] = $lat;
  $PC_LatLon['lon'] = $lon;

  // Returns a PC_LatLon object
  return $PC_LatLon;
}

?>

 

Others resources
http://www.uwgb.edu/dutchs/UsefulData/HowUseExcel.HTM
http://stackoverflow.com/questions/9203295/open-source-php-function-for-converting-utm-coordinates-to-latitude-and-longtitu

http://www.phpclasses.org/browse/file/10671.html

vimtip: การเปิด vimtutor

vimtutor เป็นเอกสารสอนใช้งาน vim เบื้องต้น เราสามารถเปิดเอกสารดังกล่าวได้ ถ้าเป็น linux เปิดโดยพิมพ์คำสั่ง ใน shell ดังนี้

$ vimtutor

ส่วนบน windows ( gvim ) เราต้องเปิด gvim ขึ้นมาก่อน จากนั้นพิมพ์คำสั่งต่อไปนี้ในโหมด normal

:view $VIMRUNTIME/tutor/tutor

vimtip: การบันทึกส่วนของไฟล์ ไปที่ไฟล์ใหม่

ในกรณีที่เราต้องการบันทึกบางส่วนของไฟล์หรือ code ไปที่ไฟล์ใหม่เราสามารถทำได้ด้วยการใช้รูปแบบคำสั่ง

:[range]w  filename

ยกตัวอย่างเช่น สมมติเรามี code ดังนี้

ตัวอย่างการบันทึกส่วนของไฟล์
ผมต้องการบันทึกส่วนของไฟล์ด้านล่างนี้ ไว้อีกไฟล์เพื่อแยกส่วน code เพื่อจะ include กลับมาในภายหลัง

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed tincidunt nibh id hendrerit ullamcorper. Aliquam egestas sapien in rutrum ultricies. Fusce egestas velit quam, lacinia lacinia ligula blandit pretium. Nam fringilla suscipit eros, in tempus ipsum semper ac. Aliquam porttitor, est at tincidunt aliquam, arcu lectus suscipit nisl, ac ornare nisi dui eget diam. Ut fringilla justo a mauris porttitor consequat. Nam eu quam in enim ornare porta eu vel turpis.

Fusce fringilla tempor metus. Proin in mi ante. Aliquam erat volutpat. Quisque porttitor tempus ante, vel ultricies tellus malesuada eget. Integer a lorem vitae elit porttitor placerat id vel diam. In fermentum ipsum a consequat scelerisque. Curabitur cursus aliquet massa ac porttitor. Donec volutpat erat sit amet dui aliquam, sit amet pulvinar nulla aliquet. Donec ultrices enim eget leo imperdiet euismod ac eu tortor. Phasellus porta in tortor in facilisis. Vestibulum scelerisque fringilla fringilla. Sed rutrum sem ut ante ultrices blandit. Nam quis ex id ante fermentum viverra. Quisque aliquet auctor elit faucibus gravida. Donec eleifend, lacus ut blandit laoreet, ligula turpis aliquam magna, vel mattis augue ex id lacus. Donec ex mauris, faucibus non enim nec, scelerisque vulputate risus.

Sed nunc est, ullamcorper sit amet leo nec, imperdiet scelerisque odio. Maecenas non turpis justo. Quisque luctus vestibulum nisi, at fringilla erat ullamcorper euismod. Duis mollis ipsum dolor, nec ultrices diam laoreet vitae. Nulla sollicitudin tempor varius. Fusce auctor maximus massa, bibendum porttitor mauris aliquam eu. Aenean fringilla nibh et sem tincidunt, vitae dignissim nisi accumsan. In hac habitasse platea dictumst. Vestibulum lorem erat, interdum sed faucibus eu, ultrices vitae nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec faucibus arcu in dolor vulputate interdum. Proin orci justo, vehicula sed nisl a, semper imperdiet est. Nam blandit pretium erat quis eleifend. Vivamus id interdum lorem.

Aliquam accumsan neque efficitur maximus lobortis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ut molestie leo, vel convallis tellus. Ut sollicitudin nec lacus ut dignissim. Suspendisse potenti. Vestibulum nisl nisl, semper ut bibendum in, bibendum eget ex. Morbi dapibus, dolor ut imperdiet bibendum, eros turpis molestie dolor, et hendrerit dolor tellus ut tortor. Pellentesque non fermentum ipsum. Ut in magna a odio eleifend dapibus. Sed porta turpis sed lorem ultricies interdum.

Cras ornare mi suscipit lectus rutrum semper. Morbi ut massa imperdiet, elementum mi non, pellentesque ex. Pellentesque eu finibus libero, ut cursus ante. Sed luctus suscipit ante, et tincidunt magna lobortis eget. Mauris quis fermentum justo. Sed ut vestibulum est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vel vehicula ante. Integer elementum urna orci, eu scelerisque lacus luctus id. Donec nec congue erat. Quisque non erat eleifend, luctus nunc eu, vestibulum nibh. Mauris id nulla ullamcorper, malesuada nunc nec, sollicitudin lacus.

ในส่วนนี้เป็นส่วนที่เราจะคงไว้ครับ

เราต้องการบันทีกบรรทัดที่ 4 – 12 ไปยังไฟล์ชื่อ lorem.html ใน vim เราใช้คำสั่งต่อไปนี้

:4,12w lorem.html

เมื่อเราเปิดไฟล์ lorem.html ขึ้นมาก็จะพบข้อความดังนี้

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed tincidunt nibh id hendrerit ullamcorper. Aliquam egestas sapien in rutrum ultricies. Fusce egestas velit quam, lacinia lacinia ligula blandit pretium. Nam fringilla suscipit eros, in tempus ipsum semper ac. Aliquam porttitor, est at tincidunt aliquam, arcu lectus suscipit nisl, ac ornare nisi dui eget diam. Ut fringilla justo a mauris porttitor consequat. Nam eu quam in enim ornare porta eu vel turpis.

Fusce fringilla tempor metus. Proin in mi ante. Aliquam erat volutpat. Quisque porttitor tempus ante, vel ultricies tellus malesuada eget. Integer a lorem vitae elit porttitor placerat id vel diam. In fermentum ipsum a consequat scelerisque. Curabitur cursus aliquet massa ac porttitor. Donec volutpat erat sit amet dui aliquam, sit amet pulvinar nulla aliquet. Donec ultrices enim eget leo imperdiet euismod ac eu tortor. Phasellus porta in tortor in facilisis. Vestibulum scelerisque fringilla fringilla. Sed rutrum sem ut ante ultrices blandit. Nam quis ex id ante fermentum viverra. Quisque aliquet auctor elit faucibus gravida. Donec eleifend, lacus ut blandit laoreet, ligula turpis aliquam magna, vel mattis augue ex id lacus. Donec ex mauris, faucibus non enim nec, scelerisque vulputate risus.

Sed nunc est, ullamcorper sit amet leo nec, imperdiet scelerisque odio. Maecenas non turpis justo. Quisque luctus vestibulum nisi, at fringilla erat ullamcorper euismod. Duis mollis ipsum dolor, nec ultrices diam laoreet vitae. Nulla sollicitudin tempor varius. Fusce auctor maximus massa, bibendum porttitor mauris aliquam eu. Aenean fringilla nibh et sem tincidunt, vitae dignissim nisi accumsan. In hac habitasse platea dictumst. Vestibulum lorem erat, interdum sed faucibus eu, ultrices vitae nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec faucibus arcu in dolor vulputate interdum. Proin orci justo, vehicula sed nisl a, semper imperdiet est. Nam blandit pretium erat quis eleifend. Vivamus id interdum lorem.

Aliquam accumsan neque efficitur maximus lobortis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ut molestie leo, vel convallis tellus. Ut sollicitudin nec lacus ut dignissim. Suspendisse potenti. Vestibulum nisl nisl, semper ut bibendum in, bibendum eget ex. Morbi dapibus, dolor ut imperdiet bibendum, eros turpis molestie dolor, et hendrerit dolor tellus ut tortor. Pellentesque non fermentum ipsum. Ut in magna a odio eleifend dapibus. Sed porta turpis sed lorem ultricies interdum.

Cras ornare mi suscipit lectus rutrum semper. Morbi ut massa imperdiet, elementum mi non, pellentesque ex. Pellentesque eu finibus libero, ut cursus ante. Sed luctus suscipit ante, et tincidunt magna lobortis eget. Mauris quis fermentum justo. Sed ut vestibulum est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vel vehicula ante. Integer elementum urna orci, eu scelerisque lacus luctus id. Donec nec congue erat. Quisque non erat eleifend, luctus nunc eu, vestibulum nibh. Mauris id nulla ullamcorper, malesuada nunc nec, sollicitudin lacus.

vimtip : การใช้งานมาโครใน vim

เราสามารถลำดับของคำสั่งที่เราพิมพ์เก็บไว้ในมาโคร เพื่อเรียกใช้ซ้ำได้ โดยมีลำดับของการเรียกใช้ดังนี้

  • กด [ESC] เข้าสู่โหมด normal
  • กด [q] ตามด้วย [a] เพื่อเริ่มบันทึกลำดับคำสั่งใน รีจิสเตอร์ a (สามารถเรียกใช้รีจิสเตอร์ a – z )
  • พิมพ์ลำดับคำสั่งที่ต้องการบันทึก
  •  กด [q] เพื่อหยุดการบันทึก
  • พิมพ์  [@] ตามด้วย [a] เพื่อเรียกใช้มาโครที่เก็บใน รีจิสเตอร์ a

หมายเหตุ เครื่องหมาย [ ] หมายถึงปุ่มในคีย์บอร์ด

ตัวอย่างการบันทึกและเรียกใช้งานมาโคร

กรณีศึกษาแรก อันนี้ผมมีชุดข้อมูล 1 บรรทัดในรูปแบบนี้

1,01A001,528056.975248 1668894.976562,528053.852117 1668891.853430,528053.852117 1668891.853430,528146.921435 1668904.970582,528073.840158 1668770.675929,528067.593895 1668750.063261,528010.128276 1668711.336431,527912.061948 1668767.552798,528056.975248 1668894.976562

อ่านเพิ่มเติม vimtip : การใช้งานมาโครใน vim

vimtip : การเพิ่ม วันที่ ใน vim

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

ใน windows

  • กด [ESC] เพื่อเข้าสู่โหมด normal
  • พิมพ์  :r!date /t

ใน linux

  • กด [ESC] เพื่อเข้าสู่โหมด normal
  • พิมพ์  r!date

แก้ปัญหา ThaiPDF : Function set_magic_quotes_runtime() is deprecated

ประมาณบรรทัด  770 แก้
 $mqr=get_magic_quotes_runtime();
  set_magic_quotes_runtime(0);
เป็น
if (version_compare(PHP_VERSION, '5.3.0', '<')) { 
      $mqr=get_magic_quotes_runtime(); 
      set_magic_quotes_runtime(0); 
}

จากนั้นตรงบรรทัดไหนที่มี set_magic_quotes ให้เพิ่ม 
if (version_compare(PHP_VERSION, '5.3.0', '<')) 
เป็นเงื่อนไขครอบไว้ทุกตัว

แหล่งข้อมูลเพิ่มเติม
http://stackoverflow.com/questions/2217955/how-can-i-replace-the-deprecated-set-magic-quotes-runtime-in-php

การแก้ปัญหา “Notice: Undefined variable” และ “Notice: Undefined index”

ในบางครั้งที่เราเรียกใช้ตัวแปรใน PHP ที่ยังไม่กำหนดค่า หรืออ่านข้อมูลจากฐานข้อมูลที่เป็นค่า NULL นั้น PHP จะแสดงข้อความ

“Notice: Undefined variable”

หรือ

“Notice: Undefined index”

ในกรณีนี้ให้เราตรวจสอบค่าก่อนโดยใช้ฟังก์ชั่น isset( )  ก่อนเรียกใช้งานตัวแปรดังตัวอย่าง


$phone = isset( $objResult['PHONE'] ) ? $objResult['PHONE'] : " " ;
$email = isset($objResult['EMAIL']) ? $objResult['EMAIL'] : " " ;

ตัวอย่างด้านบนเป็นการตรวจสอบว่า ค่าตัวแปรที่อ่านจากฐานข้อมูล ฟิลด์ที่ชื่อ PHONE และ EMAIL นั้นมีค่าหรือไม่ถ้ามีจึงเอาค่าที่อ่านได้กำหนดให้กับตัวแปร แต่ถ้าไม่มีให้กำหนดเป็นค่าว่าง