วันอังคารที่ 10 กันยายน พ.ศ. 2556

Convert between KML and ESRI's shapefile format ด้วย FWTools

การใช้งาน
1. ทำการสร้าง bat file ขึ้นมาแล้ววาง

SET PATH=C:\"Program Files"\FWTools2.4.7\bin\
ogr2ogr -f "ESRI Shapefile" -s_srs "epsg:4326" -t_srs "epsg:32647" index.shp index.kml

อธิบาย

A. SET PATH=C:\"Program Files"\FWTools2.4.7\bin\ >>ใช้ fwtools version 2.4.7

B. -f "ESRI Shapefile" >>เป็นการแปลง kml เป็น ESRI Shapefile

C. -s_srs "epsg:4326" >> ระบบอ้างอิงทางตำแหน่งของไฟล์ต้นฉบับ (index.kml) เป็ น พิกัดภูมิสาสตร์ พื้นหลักฐาน wgs 1984

D. -t_srs "epsg:32647" >> ระบบอ้างอิงทางตำแหน่งของไฟล์ผลลัพธ์ (index.shp) เป็ น พิกัดกริดยูทีเอ็ม พื้นหลักฐาน wgs 1984

2.บันทึกไฟล์ คลิกขวาเลือก Open

รหัสของระบบอ้างอิงทางตำแหน่ง


วันเสาร์ที่ 24 สิงหาคม พ.ศ. 2556

PHP tool to convert the KML / RGB colors

function rgbToKml($color, $aa="ff"){
$rr = substr($color, 0, 2);
$gg = substr($color, 2, 2);
$bb = substr($color, 4, 2);
return $aa.$bb.$gg.$rr;
}
function kmlToRgb($color){
$rr = substr($color, 6, 2);
$gg = substr($color, 4, 2);
$bb = substr($color, 2, 2);
return $rr.$gg.$bb;
}

วันพฤหัสบดีที่ 22 สิงหาคม พ.ศ. 2556

วันพุธที่ 21 สิงหาคม พ.ศ. 2556

VBA อ่านไฟล์จาก internet

Function GetHTML(URL As String) As String
    Dim HTML As String
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        GetHTML = .ResponseText
    End With
End Function

IDM Download MThai แล้วค้าง 99%

ถ้าใช้ idm version 5.xx ทำการdownload ไฟล์ video จาก MThai จะค้าง 99% อารมเสียอยู่เป็นเดือนๆ แต่ผมลองใช้ version 6.xx ไม่มีปัญหาครับ
download
http://www.ajarnveerapong.com/download/IDM_6_08_Build_5_Beta.rar

วันอังคารที่ 20 สิงหาคม พ.ศ. 2556

วันเสาร์ที่ 17 สิงหาคม พ.ศ. 2556

PostGis-Convert Lat,Lng (4326) to Geom UTM wgs84 zone 47 (32647)

UPDATE place SET the_geom = ST_Transform(ST_SetSRID(ST_MakePoint(cast(lng as double precision), cast(lat as double precision)), 4326),32647);

วันศุกร์ที่ 16 สิงหาคม พ.ศ. 2556

Postgis Tranfer 4326 to 32647 and Polygon to MultiPolygon

INSERT INTO city_plan ( block_no, description, the_geom)
SELECT  "name", description, ST_Transform(ST_Multi(wkb_geometry),32647) FROM lu_9;

วันพฤหัสบดีที่ 15 สิงหาคม พ.ศ. 2556

KML TO PostGIS

C:\"Program Files"\FWTools2.4.7\bin\ogr2ogr -f "PostgreSQL" PG:"host=localhost user=postgres dbname=yota_db password=123456" lu_9.kml

วันอาทิตย์ที่ 28 กรกฎาคม พ.ศ. 2556

ขั้นตอนจัดทำแผนที่ภาษีและทะเบียนทรัพย์สิน

ที่มา:http://techforlocal.wordpress.com/2011/08/01/ctm/
ขั้นตอนจัดทำแผนที่ภาษีและทะเบียนทรัพย์สิน
  1. ให้เริ่มต้นจากการทำข้อมูลทะเบียนทรัพย์สินเป็นอันดับแรก โดยจากการจัดทำข้อมูลทะเบียนทรัพย์สินที่มีอยู่(เฉพาะข้อมูลที่เก็บภาษีอยู่ ในปัจจุบัน)ให้มีความถูกต้องและเป็นปัจจุบัน เช่นการจัดเก็บและรวบรวมเอกสารต่างๆ ให้สมบูรณ์ เช่น สำเนาเอกสารสิทธิ์ที่ดิน และสำเนาบัตรประชาชนหรือสำเนาทะเบียนบ้าน ในกรณีของภาษีบำรุงท้องที่ และรายละเอียดประเภทโรงเรือน การใช้ประโยชน์โรงเรือน และขนาดพื้นที่ ในกรณีภาษีโรงเรือนและที่ดิน เป็นต้น
  2. จัดหาโปรแกรมบริหารจัดการทะเบียนทรัพย์สินเพื่อบันทึกข้อมูลต่างๆ เช่น L-Tax, …
ในขั้นตอนการจัดทำข้อมูลภาษีบำรุงท้องที่เริ่มต้นจากขบวนการ จัดเก็บข้อมูลจากเจ้าของแปลงที่ดิน ซึ่งเป็นวิธีที่ง่ายและประหยัดที่สุด โดยเก็บในระหว่างที่มีการยื่นแบบแสดงรายการที่ดิน(ภ.บ.ท.5) ซึ่งเจ้าของที่ดินจะต้องยื่นทุก 4 ปีซึ่งจะครบกำหนดต้องยื่นในปี 2553 นี้ โดยในการยื่นแบบ ภ.บ.ท.5 ที่ถูกต้องนั้นจะต้องยื่นสำเนาเอกสารสิทธิ์ที่ดิน และสำเนาบัตรประจำตัวประชาชนหรือสำเนาทะเบียนบ้านของเจ้าของด้วย เพื่อตรวจสอบเอกสารว่าถูกต้องหรือไม่ และจะต้องยื่นทุกคนที่เป็นเจ้าของแปลงที่ดินในพื้นที่ไม่ว่าจะต้องเสียภาษี หรือไม่
ปัญหาการบันทึกข้อมูลทะเบียนทรัพย์สิน
ในกรณีที่จัดทำทะเบียนทรัพย์สินก่อนแผนที่ภาษี เราจะไม่ทราบรหัสทรัพย์สิน(เขต/เขตย่อย/ลำดับแปลง)ของแต่ละทรัพย์สินที่จะ ใช้ในการบันทึกข้อมูล แนวทางการแก้ไขคือให้จำลองรหัสขึ้นมาโดยข้ามรหัสที่จะมีการใช้งานในอนาคต เช่นถ้าเราสามารถแบ่งเขตได้เป็น 01-09 ก็ให้ข้ามรหัสดังกล่าวโดยการใช้ 11-19 แทน เป็นต้น เพื่อในอนาคตพอเราสามารถจัดทำแผนที่ได้สำเร็จ เราก็เพียงแต่แก้ไขรหัสทรัพย์สินเท่านั้น

วันศุกร์ที่ 12 กรกฎาคม พ.ศ. 2556

HospitalOS GIS

ระบบสารสนเทศภูมิศาสตร์เพื่อบันทึกพิกัดหลังคาเรือนสำหรับหน่วยงานที่ใช้โปรแกรมของ HospitalOS (HospitalOS GIS)

รายละเอียด

- โปรแกรม GIS for HospitalOS พัฒนาต่อจาก อ.ไกรวุฒิ แก้วชาลุน เวอร์ชั่น original http://www.kriwoot.com/gisjhcis/ โดยสามารถบันทึกพิกัดหลังคาเรือน และสืบค้น จากชื่อ-สกุล รหัส ปชช. สืบค้นประชากรตามกลุ่มอายุ และการหาหลังคาเรือนจากรัศมีที่กำหนดได้ เท่านั้น เป็นโปรแกรมส่วนขยายเพิ่มทำให้สามารถทำการบันทึกพิกัดหลังคาเรือน สำหรับหน่วยงานที่ใช้โปรแกรม ของ HospitalOS

- ตารางที่เกี่ยวข้องกับการทำงานคือ t_health_family (ข้อมูลบุคคล) และ t_health_home (ข้อมูลหลังคาเรือน) โดยจะต้องเพิ่มข้อมูล lat และ lng ในตาราง t_health_home (รายละเอียดตามคู่มือ)

- ทดสอบการทำงาน Web Server ใช้ Mapserver for Window (MS4W) หรือจะใช้ Appsev หรืออื่นๆ ก็ได้ ฐานข้อมูลที่ทดสอบระบบเป็น PostgreSQL 9.0 Web Browser Google Chrome รุ่น 22.0.1229.94

- Username และ Password ใช้ gis เหมือนกัน

- มีปัญหาการติดตั้งโปรแกรมหรือมีข้อสงสัย mail มาที่ ajarn.veerapong@gmail.com


คู่มือการใช้งาน || Source Code โปรแกรม

HosxP GIS

 ระบบสารสนเทศภูมิศาสตร์เพื่อบันทึกพิกัดหลังคาเรือนสำหรับหน่วยงานที่ใช้โปรแกรมของ HosxP (HosxP GIS)


- โปรแกรม GIS for HOSxP พัฒนาต่อจาก อ.ไกรวุฒิ แก้วชาลุน เวอร์ชั่น original http://www.kriwoot.com/gisjhcis/ โดยสามารถบันทึกพิกัดหลังคาเรือน และสืบค้น จากชื่อ-สกุล รหัส ปชช. สืบค้นประชากรตามกลุ่มอายุ และการหาหลังคาเรือนจากรัศมีที่กำหนดได้ เท่านั้น เป็นโปรแกรมส่วนขยายเพิ่มทำให้สามารถทำการบันทึกพิกัดหลังคาเรือน สำหรับหน่วยงานที่ใช้โปรแกรม ของ HOSxP

- ตารางที่เกี่ยวข้องกับการทำงานคือ person(ข้อมูลบุคคล) และ house(ข้อมูลหลังคาเรือน) โดยจะใช้ข้อมูล latitude และ longitude ในตาราง house (รายละเอียดตามคู่มือ)

- ทดสอบการทำงาน Web Server ใช้ Mapserver for Window (MS4W) หรือจะใช้ Appsev หรืออื่นๆ ก็ได้ ฐานข้อมูลที่ทดสอบระบบเป็น Mysql (character-set = utf8) และ Web Browser Google Chrome รุ่น 22.0.1229.94

- Username และ Password ใช้ gis เหมือนกัน

- มีปัญหาการติดตั้งโปรแกรมหรือมีข้อสงสัย mail มาที่ ajarn.veerapong@gmail.com


คู่มือการใช้งาน || Source Code โปรแกรม

วันอังคารที่ 2 กรกฎาคม พ.ศ. 2556

การติดตั้งโปรแกรม ArcView 3.3 บน Window XP, Vista, และ 7 แบบ 32 และ 64 bit

Download ไฟล์ทั้งหมดจาก  www.ajarnveerapong.com/download/arcview32&64bit.zip
ทำ การแตก zip แล้วทำตามคู่มือ หรือคลิกขวาเลือกเปิด  install_arcview_32Bit.bat สำหรับ 32 bit หรือ  install_arcview_64Bit.bat สำหรับ 64 bit ครับ

วันอังคารที่ 25 มิถุนายน พ.ศ. 2556

Mikrotik การติดตั้ง Package Usermanager

ไปดาวน์โหลด Package ที่เป็นแบบแยกที่
ก่อนอื่น Upgrade ก่อนครับ โดยโหลดไฟล์
http://download.mikrotik.com/routeros-mipsbe-4.10.npk
วิธีการ Upgrade ก็ไม่ยาก แค่ ไปที่ปุ่ม Files ใน Mikrotik แล้วลากไฟล์ของ routeros-mipsbe-4.10.npk ไปไว้ แล้ว System --> Reboot
หลังจาก Reboot จะใช้เวลาประมาณ 5 นาที ห้ามทำไฟดับครับห้ามปิดเปิดเครื่องจนกว่ามันจะ boot มาเอง
ไม่งั้นต้องใช้ net install  แก้ และต้องใช้สาย Console ด้วยครับ

หลังจากนั้นไปดาวน์โหลด แบบแยก Package โดยโหลดไฟล์
http://download.mikrotik.com/all_packages-mipsbe-4.10.zip
ในไฟล์นี้จะมีไฟล์แยกมาเป็นแต่ละส่วน และมีไฟล์ Packages ของ Usermanager ด้วยครับ
วิธีการติดตั้งก็ไม่ยาก แค่ ไปที่ปุ่ม Files ใน Mikrotik แล้วลากไฟล์ของ Usermanger ไปไว้ แล้วไปที่ System--> Reboot

วันจันทร์ที่ 24 มิถุนายน พ.ศ. 2556

Solar Cell : UPS ห้ามต่อกับอะไรบ้าง

 ที่มา : http://topicstock.pantip.com/wahkor/topicstock/2011/01/X10144635/X10144635.html
-ห้ามใช้เกินกำลังเครื่อง เช่น UPS 525VA จ่ายโหลดได้ประมาณไม่เกิน 350W ก็ไม่สามารถใช้กับอุปกรณ์ไฟฟ้าที่ใช้กำลังไฟเกิน 350Wได้ เลเซอร์ปริ๊นซ์เตอร์นั้นกินกระแสสูงมากจึงไม่สามารถใช้กับ UPSขนาดเล็กๆได้(แน่นอนว่าถ้าเป็น UPSขนาด 10kVAก็สามารถต่อใช้งานได้ไม่มีปัญหา) ถ้าใช้เกินตามคู่มือเค้าจะเรียกอาการนี้ว่า"โอเวอร์โหลด" คือใช้ไฟเกินกำลังที่เครื่องจะรับได้ครับ (บางรุ่นเวลาเสียบใช้ไฟอาคารจะใช้งานได้ปกติ แต่เวลาไฟดับเครื่องจะฟ้องโอเวอร์โหลดต้องระวังเวลาใช้ครับ)

-โหลดประเภทมอเตอร์ ไม่เหมาะสมนักที่จะใช้กับเครื่องสำรองไฟระบบธรรมดาแบบ Line interactive เพราะรูปคลื่นที่ UPSจ่ายออกมาเวลาไฟดับนั้นเป็นแบบเสต็ปเวฟ ซึ่งคนละแบบกับรูปคลื่นแบบซายน์เวฟแบบของการไฟฟ้า โหลดที่เป็นมอเตอร์เช่นพัดลมนั้นจะสะดุดเป็นจังหวะๆเมื่อเวลา UPS ทำการจ่ายไฟสำรองออกมา(ไฟดับ) อย่างไรก็ดี ได้มี UPSหลายยี่ห้อได้ผลิต UPSแบบ Line interactive แบบใหม่ ที่สามารถสร้างรูปคลื่นซายน์เวฟแบบของการไฟฟ้าได้ ซึ่งส่วนมากจะเรียกว่า Pure Sine Wave ซึ่งจะสามารถใช้งานกับโหลดประเภทมอเตอร์ได้ แต่ก็ไม่แนะนำครับ

-โหลดประเภทตู้เย็น/ตู้แช่/แอร์ เครื่องใช้ไฟฟ้าประเภทนี้จะมีคอมเพรสเซอร์ทำงานอยู่เป็นระยะๆ การต่ออุปกรณ์ประเภทนี้เข้ากับ UPS จะทำให้ UPS ทำงานหนักและอายุการใช้งานสั้นลง เพราะเมื่อคอมเพรสเซอร์ทำงานจะเกิดไฟกระชากขึ้นในชั่วขณะ ทำให้ UPSต้องทำงานหนัก และเสียได้ก่อนเวลาอันควรครับ

วันพุธที่ 19 มิถุนายน พ.ศ. 2556

String Split in vba

Sub SplitValue() 
    Dim avarSplit As Variant 
    Dim intIndex As Integer 
    avarSplit = Split(Range("A1").Value, ",") 
    For intIndex = LBound(avarSplit) To UBound(avarSplit) 
        MsgBox "Item " & intIndex & " is " & avarSplit(intIndex) & _ 
        " which is " & Len(avarSplit(intIndex)) & " characters long", vbInformation 
    Next 
End Sub 

วันเสาร์ที่ 15 มิถุนายน พ.ศ. 2556

VBA Create Table

Function Create_NCD_Table()
Dim rsp As Recordset
Dim table_name As String
Set dbs = CurrentDb
Set rsp = CurrentDb.OpenRecordset("SELECT  ncd_code  FROM ncd_disease  WHERE ncd_code<>'' GROUP BY ncd_code")
Do While Not rsp.EOF
            ncd_code = rsp.Fields("ncd_code")
            table_name = "ncd_" & ncd_code
If TableExists(table_name) Then
    CurrentDb.TableDefs.Delete (table_name)
End If

Set TBL = dbs.CreateTableDef(table_name)
Set fld = TBL.CreateField("pcucode", dbText, 15)
TBL.Fields.Append fld
Set fld = TBL.CreateField("pid", dbText, 15)
TBL.Fields.Append fld
Set fld = TBL.CreateField("cid", dbText, 15)
TBL.Fields.Append fld
Set fld = TBL.CreateField("chronic", dbText, 15)
TBL.Fields.Append fld
Set fld = TBL.CreateField("vhid", dbText, 8)
TBL.Fields.Append fld
Set fld = TBL.CreateField("sick_year", dbText, 4)
TBL.Fields.Append fld
Set fld = TBL.CreateField("death_year", dbText, 4)
TBL.Fields.Append fld
Set fld = TBL.CreateField("birth_year", dbText, 4)
TBL.Fields.Append fld
'Set fld = TBL.CreateField("Field3", dbInteger)
'TBL.Fields.Append fld
'Set fld = TBL.CreateField("Field4", dbCurrency)
'TBL.Fields.Append fld
dbs.TableDefs.Append TBL
dbs.TableDefs.Refresh
rsp.MoveNext
Loop
End Function

Ms Access&Visual Basic Connector/ODBC Using ADO, DAO and RDO

ที่มา : http://dev.mysql.com/doc/refman/5.0/es/myodbc-examples-programming.html
Private Sub myodbc_ado_Click()

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
Dim sql As String

'connect to MySQL server using MySQL ODBC 3.51 Driver
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};"_
& "SERVER=localhost;"_
& " DATABASE=test;"_
& "UID=venu;PWD=venu; OPTION=3"

conn.Open

'create table
conn.Execute "DROP TABLE IF EXISTS my_ado"
conn.Execute "CREATE TABLE my_ado(id int not null primary key, name varchar(20)," _
& "txt text, dt date, tm time, ts timestamp)"

'direct insert
conn.Execute "INSERT INTO my_ado(id,name,txt) values(1,100,'venu')"
conn.Execute "INSERT INTO my_ado(id,name,txt) values(2,200,'MySQL')"
conn.Execute "INSERT INTO my_ado(id,name,txt) values(3,300,'Delete')"

Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer

'fetch the initial table ..
rs.Open "SELECT * FROM my_ado", conn
Debug.Print rs.RecordCount
rs.MoveFirst
Debug.Print String(50, "-") & "Initial my_ado Result Set " & String(50, "-")
For Each fld In rs.Fields
Debug.Print fld.Name,
Next
Debug.Print

Do Until rs.EOF
For Each fld In rs.Fields
Debug.Print fld.Value,
Next
rs.MoveNext
Debug.Print
Loop
rs.Close

'rs insert
rs.Open "select * from my_ado", conn, adOpenDynamic, adLockOptimistic
rs.AddNew
rs!Name = "Monty"
rs!txt = "Insert row"
rs.Update
rs.Close

'rs update
rs.Open "SELECT * FROM my_ado"
rs!Name = "update"
rs!txt = "updated-row"
rs.Update
rs.Close

'rs update second time..
rs.Open "SELECT * FROM my_ado"
rs!Name = "update"
rs!txt = "updated-second-time"
rs.Update
rs.Close

'rs delete
rs.Open "SELECT * FROM my_ado"
rs.MoveNext
rs.MoveNext
rs.Delete
rs.Close

'fetch the updated table ..
rs.Open "SELECT * FROM my_ado", conn
Debug.Print rs.RecordCount
rs.MoveFirst
Debug.Print String(50, "-") & "Updated my_ado Result Set " & String(50, "-")
For Each fld In rs.Fields
Debug.Print fld.Name,
Next
Debug.Print

Do Until rs.EOF
For Each fld In rs.Fields
Debug.Print fld.Value,
Next
rs.MoveNext
Debug.Print
Loop
rs.Close
conn.Close
End Sub

วันพฤหัสบดีที่ 13 มิถุนายน พ.ศ. 2556

FWTools การแปลงระบบพิกัดอ้างอิงสำหรับตำแหน่งในข้อมูลภาพ (Image Correction)

gdalwarp –s_srs epsg: 32647 –t_srs epsg:4326 D:\TH_CAT_090204101807501_1\ IMAGERY.tif D:\theos4\IMAGERY4326.tif”

FWTools การลดรายละเอียดภาพ (Reduce resolution)

gdalwarp -tr 1 10 -r cubic D:\TH_CAT_090204101807501_1\IMAGERY.tif D:\Theos3\ IMAGERY4_Red.tif

FWTools การเพิ่มความคมชัดให้ข้อมูลภาพถ่ายดาวเทียม (Image Enhancement)

gdalenhance –ot byte –equalize D:\TH_CAT_090204101807501_1\IMAGERY.TIF D:\theos2\IMAGERY2_Enh.tif

FWTools การบีบอัดข้อมูลภาพ

- แบบไม่มีการสูญเสียรายละเอียด
gdal_translate -of GTiff -co COMPRESS=LZW D:\TH_CAT_090204101807501_1\ IMAGERY.tif D:\theos3\IMAGERY14_ LZW.tif

- แบบมีการสูญเสียรายละเอียด
gdal_translate –of GTiff -co COMPRESS =JPEG D:\TH_CAT_090204101807501_1\ IMAGERY.tif D:\theos3\IMAGERY15_ JPEG.tif

FWTools การ merge ภาพหลายๆ ไฟล์ด้วย gdal_merge

ที่มา:http://sawarino.blogspot.com/2009/07/gdalmerge.html
            การใช้งาน gdal_merge อย่างง่าย โดยจะขอทดลองกับข้อมูล GDEM โดยการใช้งาน gdal_merge นั้นจะแตกกต่างกับคำสั่ง gdal อื่นๆ คือ ต้องระบุผลลัพธ์ (Output file) ก่อนแล้วจึงระบุไฟล์ต้นฉบับ การใช้งานเบื้องต้นเป็นไปตาม syntax ดังนี้ครับ
#gdal_merge [option] [output file] [input files] ซึ่งตัวอย่างการใช้งานดังนี้ครับ
#gdal_merge -of GTiff -o output.tif abc1.tif abc2.tif abc3.tif abc4.tif
จากตัวอย่างดังกล่าว จะเห็นว่าการระบุไฟล์ต้นฉบับที่มากกว่า 1 ไฟล์นั้นค่อนข้างยุ่งยาก เราสามารถใช้เครื่องหมาย * เข้ามาช่วยในคำสั่งได้ดังนี้ครับ
#gdal_merge -of GTiff -o sample.tif *.tif

Resampling ภาพด้วย gdalwarp

ที่มา:http://sawarino.blogspot.com/2011/08/resampling-gdalwarp.html
การ resampling ข้อมูลภาพเพื่อให้มีขนาดหรือจำนวนจุดภาพเท่าที่ต้องการ ตัวอย่างเช่น ภาพเดิมมีขนาด 300x300 จุดภาพ แต่ต้องการเพิ่มให้เป็น 1200x1200 จุดภาพ เรามาดูวิธีการกันเลยนะครับ
คำสั่งหรือโปรแกรมประยุกต์ที่ใช้คือ gdalwarp ส่วน option หรือ ทางเลือกที่จะใช้คือ -ts width height ดังนี้ครับ

>>>gdalwarp -ts width height inputfile outputfile

ตัวอย่างการใช้งานมีดังนี้ครับ

>>>gdalwarp -ts 1200 1200 abc300.tif abc1200.tif

ปล. หากต้องการระบุวิธี resampling ให้เพิ่มทางเลือก -r xxxx นะครับ เช่น -r bilinear, cubic, cubicspline หรือ lanczos. แต่ถ้าไม่ระบุโปรแกรมจะใช้วิธี nearest เป็นค่าเริ่มต้นครับ

การแปลงไฟล์แผนที่ GIS จาก MapInfo เป็น Shapefile

           การแปลงไฟล์แผนที่ GIS จาก MapInfo เป็น shapefile จริงแล้วจะต้องใช้เครื่องมือที่มีอยู่ในโปรแกรม MapInfo หรือโปรแกรมเสริที่จะรับไฟล์ดังกล่าวมาแสดง อย่างเช่นใน ArcView เป็นต้น แต่ก็ยังมีโปรแกรมเฉพาะเล็กๆที่ไม่ต้องพึ่งโปรแกรมดังกล่าว โดยสามารถแปลงได้ด้วยอย่างดายและสะดวกได้แก่ ogr2gui 
          Download จาก http://www.ajarnveerapong.com/download/ogr2gui.zip

วันอังคารที่ 11 มิถุนายน พ.ศ. 2556

การแปลงค่าพิกัดจากองศา ลิปดา ฟิลิปดา เป็น แบบองศาทศนิยม

การแปลงค่าพิกัดจาก องศา ลิปดา ฟิลิปดา (hddd?ddd’ddd.ddd’’) และ องศา ลิปดา ฟิลิปดา (hddd?ddd.ddd’
เป็น แบบองศาทศนิยม (hddd.ddd?)
ตัวอย่างที่ องศา ลิปดา ฟิลิปดา (hddd?ddd’ddd.ddd’’)
Lat  13? 45 53.7’’ N
Long  100? 32' 17.9’’ E
ขั้นตอนที่ 1 หาค่าลิปดา นำค่าลิปดาหารด้วย 60 จะได้
Lat  13? 45 53.7’’ N
ลิปดา = 45/60
ลิปดา = 0.75
Long  100? 32' 17.9’’ E
ลิปดา = 32/60
ลิปดา = 0.533
ขั้นตอนที่ 2  หาค่าฟิลิปดา นำค่าฟิลิปดาหารด้วย 3600 จะได้
Lat  13? 45 53.7’’ N
          ฟิลิปดา = 53.7/3600
          ฟิลิปดา = 0.014916
Long  100? 32' 17.9’’ E
ฟิลิปดา = 17.9/3600
          ฟิลิปดา = 0.004972
ขั้นตอนที่ 3 นำค่าลิปดาจากขั้นตอนที่ 1 +  ค่าฟิลิปดาจากขั้นตอนที่ 2
Lat  13? 45 53.7’’ N
ลิปดา = 45/60
ลิปดา = 0.75
Lat  13? 45 53.7’’ N
          ฟิลิปดา = 53.7/3600
          ฟิลิปดา = 0.014916
Lat 13? 45 53.7’’ N
= 13? + (0.75+0.014916)
                   = 13? + 0.764916
ดังนั้น       Lat  = 13.764916N
Long  100? 32' 17.9’’ E
ลิปดา = 32/60
ลิปดา = 0.533
Long  100? 32' 17.9’’ E
ฟิลิปดา = 17.9/3600
          ฟิลิปดา = 0.004972
Long  100? 32' 17.9’’ E
= 100? + (0.533+0.004972)
                   = 100? + 0.537972
ดังนั้น       Long  = 100.537972E
สรุป
Lat  13? 45 53.7’’ N                        Lat  13.764916N
Long  100? 32' 17.9’’ E                    Long  100.537972E

วันพฤหัสบดีที่ 23 พฤษภาคม พ.ศ. 2556

PostgreSQL-Command สำหรับ Backup และ Restore

การ Backup กับ Restore Database แบบสะดวกๆ เหมือน sql_dump ของ MySQL
วิธีการ Backup ด้วยคำสั่ง pg_dump ใน Folder bin ของ PostgreSQL
C:\Program Files\PostgreSQL\8.3\bin>pg_dump -U postgres db_hcms > d:\abc\sqlfile.sql
วิธีการ Restore ไฟล์ที่ Backup ด้วย pg_dump ด้วยคำสั่ง psql ใน Folder bin ของ PostgreSQL
C:\Program Files\PostgreSQL\8.3\bin>psql -U postgres db_hcms < d:\abc\sqlfile.sql

ปรับปรุง P.Mapper ให้เข้ากับงาน

การแก้ไข ให้ p.mapper ใช้งานได้ กับงานของคุณ
ยกตัวอย่างเป็น การแสดงข้อมูลวัดในอำเภอ โขงเจียม จังหวัด อุบลราชธานี
ข้อมูล อยู่ใน c:\ms4w\Apache\htdocs\wat
(เอาอย่างง่ายก่อน เดี๋ยวค่อยปรับปรุง) สำเนาจาก p.mapper demo มาไว้ แล้ว เปลี่ยนชื่อ
ตัวข้อมูลแผนที่ อยู่ใน c:\ms4w\Apache\htdocs\wat\data\
ขั้นตอนการแก้ไข
  1. สร้าง หรือแก้ไข mapfile ให้เป็นข้อมูล ที่ต้องการแสดงผล ในที่นี้ ใช้ ชื่อ wat.map
  2. นำ wat.map ไปไว้ ใน c:\ms4w\Apache\htdocs\wat\config\default\wat.map
  3. แก้ไขไฟล์ c:\ms4w\Apache\htdocs\wat\config\config.ini
    แก้ไขชื่อ Mapfile ใน บรรทัดที่ 83-86 โดยประมาณ เปลี่ยนจาก pmapper_demo.map เป็น wat.map
    แก้ไขชื่อ Layer ในบรรทัด ที่ 120-135 ในหัวข้อ  LAYERS/GROUPS DEFINED MANUALLY บรรทัด ที่ขึ้นต้นด้วย
    allGroups = countries, cities, dem, rivers, jpl_wms_global_mosaic แก้เป็น Layer ที่อยู่ใน wat.map
    allGroups = province, kongjeam, roads, village, temple
  4. แก้ไขไฟล์ c:\ms4w\Apache\hidocs\wat\config\default\php_config.php
    ส่วนนี้เป็นการให้ แสดง Layer ให้เลือก ได้ บน web เลือกแบบ TOC
    แก้ไขในบรรทัดที่ 6-14 ในหัวข้อ *  Definition of categories for legend/TOC แก้เป็น
    /**
    * Definition of categories for legend/TOC
    */
    $categories['cat_admin']  = array(“province”, “kongjeam”, “roads”, “village”);
    $categories['cat_temple'] = array(“temple”);
    $categories['cat_raster'] = array(“dem”, “jpl_wms_global_mosaic”, “wmstest”);
    $_SESSION['categories'] = $categories;

    เซฟไฟล์ แล้ว ลองรันใน browser
  5. cat_temple ยังไม่ได้ เพิ่มในข้อมูล ต้องไปเพิ่ม
    แก้ไขไฟล์ \wat\incpho\locale\language_en.php
  6. เพิ่ม $_sl['cat_temple'] = ‘Temple data’; เข้าไป บันทึก และทดสอบ

มีอะไรใน worldfile

ไฟล์ GeoTiff เป็นไฟล์ ที่รู้จักกันดี ในหมู่นักทำแผนที่ และ ภูมิสารสนเทศน์
เป็นไฟล์ ที่เก็บ ภาพ ได้ หลายชั้นข้อมูล พร้อมทั้ง มีข้อมูลเชิงตำแหน่ง ด้วย
ทั่วไป ก็มี ด้วยกัน สองแบบ
  1. GeoTiff แบบที่มี worldfile แบบนี้ จะมีด้วย กัน สอง ไฟล์ ไปไหนไปด้วยกัน ไม่งั้นทำงานไม่ได้ ไฟล์แรก เก็บภาพ นามสกุล .tif อีกไฟล์ เป็น ไฟล์ ที่เก็บข้อมูลเชิงตำแหน่งของภาพ นามสกุล .wtf เรียกว่า world file
  2. GeoTiff แบบที่ มี world file อยู่บนหัวไฟล์ tiff เลย แบบนี้ มีไฟล์เดียว เวลาใช้งาน ก็มาอ่านค่า จากส่วนหัวนี้ก่อน ไปเป็นข้อมูลเชิงตำแหน่ง
ทีนี้ ลองมาดูว่า worldfile เก็บค่าอะไรบ้าง
worldfile มีอยู่ด้วยกัน 6 บรรทัด เช่น (สามารถเปิดอ่านด้วย text editor ทั่วไปได้)
20.17541308822119
0.00000000000000
0.00000000000000
-20.17541308822119
424178.11472601280548
4313415.90726399607956

ความหมายของ ทั้ง 6 บรรทัด มีดังนี้

line 1: x-dimension of a pixel in map units
line 2: rotation parameter
line 3: rotation parameter
line 4: NEGATIVE of y-dimension of a pixel in map units
line 5: x-coordinate of center of upper left pixel
line 6: y-coordinate of center of upper left pixel

ในการใช้งาน
ตัวอย่างเช่น โปรแกรม Arcview เรียกข้อมูลภาพ ขึ้นมา นั่นหมายถึง กำลังนำภาพ เข้าสู่ระบบพิกัดโลก ที่เรียกว่า การฉายแผนที่ ซึ่งต้องอาศัย พารามิเตอร์จำนวน 6 ตัว ในสมการ
affine transformation

x1 = Ax + By + C
y1 = Dx + Ey + F

โดยที่
x1 = ค่าพิกัด แกน x ของภาพ บน แผนที่
y1 =
ค่าพิกัด แกน y ของภาพ บน แผนที่
x = จำนวน column ของจุดภาพ ในภาพ
y =
จำนวน row ของจุดภาพ ในภาพ
A = มาตราส่วนแกน x
B, D = เทอมการหมุน
C, F = แปลงค่าพิกัดจากแผนที่ จากแบบ จากจุดภาพบนซ้าย (การนับจำนวนจุดภาพ ของจอภาพ นับแบบ แกนx จากซ้ายมาขวา แกนy จากบนมาล่าง)
E = ค่าลบ มาตราส่วนแกน y


ดังนั้น ค่าต่างๆ ใน worldfile สามารถแปลงมาเป็น พารามิเตอร์ทั้ง 6 ได้ ดังนี้
The transformation parameters are stored in the world file in this order:

20.17541308822119 – A
0.00000000000000 – D
0.00000000000000 – B
-20.17541308822119 – E
424178.11472601280548 – C
4313415.90726399607956 – F
เมื่อ อ่าน ข้อมูลใน worldfile เข้าไปในโปรแกรม ก็จะสามารถ ทราบได้ ว่า ภาพ นั้น อยู่ตรงส่วนไหนของแผนที่ หรืออยู่ตรงส่วนใดของโลกนั่นเอง

Solar Cell-การต่อแบตเตอรี่อย่างไรให้ได้แรงดันไฟฟ้าสูงขึ้น?

จาก http://www.goodsclick.com/bb.php?topic=16
ลักษณะการต่อเชื่อมแบตเตอรี่ มีผลต่อขนาดแรงดันไฟฟ้าและกระแสไฟฟ้า ขึ้นอยู่กับความต้องการนำไปใช้งาน และจะต้องเป็นแบตเตอรี่ชนิดเดียวกันเท่านั้นที่จะนำมาต่อเชื่อมกัน "หากผู้ใช้ต้องการแรงดันไฟฟ้าสูงขึ้น" ขอแนะนำให้ต่อเชื่อมแบตเตอรี่แบบอนุกรม (ข้อ 1) โดยการต่อเชื่อมแบตเตอรี่ทำได้ดังนี้

การต่อเชื่อมแบตเตอรี่แบบอนุกรม นำขั้วบวกของแบตเตอรี่อันที่ 1 ต่อเข้ากับขั้วลบของแบตเตอรี่อันที่ 2 และนำขั้วบวกของแบตเตอรี่อันที่ 2 ต่อเข้ากับขั้วลบของแบตเตอรี่อันที่ 3 ทำเช่นนี้ต่อไปจนครบจำนวนแบตเตอรี่
แรงดันไฟฟ้าของแบตเตอรี่ทั้งหมดเท่ากับ ผลรวมของแรงดันไฟฟ้าแต่ละแบตเตอรี่มารวมกัน
กระแสไฟฟ้าของแบตเตอรี่ทั้งหมดเท่ากับ ค่าของกระแสไฟฟ้าของแบตเตอรี่เซลล์เดียวเท่านั้น ไม่เปลี่ยนแปลง

การต่อเชื่อมแบตเตอรี่แบบขนาน นำขั้วบวกของแบตเตอรี่อันที่ 1 ต่อเข้ากับขั้วบวกของแบตเตอรี่อันที่ 2 และนำขั้วบวกของแบตเตอรี่อันที่ 2 ต่อเข้ากับขั้วบวกของแบตเตอรี่อันที่ 3 ทำเช่นนี้ต่อไปจนครบจำนวนแบตเตอรี่ จากนั้นนำขั้วลบของแบตเตอรี่อันที่ 1 ต่อเข้ากับขั้วลบของแบตเตอรี่อันที่ 2 และนำขั้วลบของแบตเตอรี่อันที่ 2 ต่อเข้ากับขั้วลบของแบตเตอรี่อันที่ 3 ทำเช่นนี้ต่อไปจนครบจำนวนแบตเตอรี่เช่นเดียวกัน
แรงดันไฟฟ้าของแบตเตอรี่ทั้งหมดเท่ากับ ค่าของแรงดันไฟฟ้าของแบตเตอรี่เซลล์เดียวเท่านั้น ไม่เปลี่ยนแปลง
กระแสไฟฟ้าของแบตเตอรี่ทั้งหมดเท่ากับ ผลรวมของกระแสไฟฟ้าแต่ละแบตเตอรี่มารวมกัน

การต่อเชื่อมแบตเตอรี่ทั้งแบบอนุกรมและแบบขนาน โดยนำลักษณะการต่อเชื่อมแบตเตอรี่ 2 แบบมารวมกัน เพื่อให้ได้แรงดันไฟฟ้าและกระแสไฟฟ้าตามที่ต้องการ

Solar Cell-การต่อแบตเตอร์รี

Q
 สมมติว่า เรามี ถ่านไฟฉาย 4 ก้อน ขนาด 1.5V 1000mAh 3 ก้อน และ 1.2V 800mAh 1 ก้อน
มาต่ออนุกรมกันทั้งหมด 1 แบบ
และต่อขนานกันทั้งหมด 1 แบบ
อยากรู้ว่า V และ I ของแต่ละแบบ มันจะมีค่าเท่าไรหรือคับ มันจะต่างกับการที่ใช้ ถ่านไฟฉาย ขนาดเท่ากันหมดหรือเปล่าคับ ข้อดีข้อเสีย
A1
ผมก็ไม่แน่ใจนะ ประสบการณ์น้อย
ขนาดของกระแสมันเป็นไปตาม กฎของโอห์ม V = I/R ดังนั้นจึงขึ้นอยู่กับโหลด และก็แหล่งแรงดันของคุณ
1 เมื่อต่ออนุกรมกัน แรงดันที่ได้ก็จะเป็นแรงดันรวมของถ่านแต่ละก้อน เช่นเดียวกับพลังงานที่มันมีก็เป็นพลังงานรวมในแต่ละก้อน
2 เมื่อต่อขนานกัน 4 ก้อนแรกไม่มีปัญหาครับ แต่ก้อนหลังที่แรงดันไม่เท่าชาวบ้านเค้า อาจจะทำให้สายไฟไหม้ หรือถ่านอาจจะระเบิด ทางที่ดีควรมีโหลด มาอนุกรมกับมันอีกซักตัวก่อนจะไปขนานครับ ส่วนแรงดันก็จะเป็นแรงดันที่มากที่สุดที่มาต่อขนานกัน ส่วนพลังงานก็ยังสามารถนำมารวมได้เช่นเดิม


A2
ขอลองตอบเล่นๆ ผมคิดว่า

๑) ถ้าต่อแบตเตอรี่ทั้งห้าก้อนแบบอนุกรม แรงดัน (voltage) ที่ได้จะเท่ากับ 1.5 x 4 + 1.2 = 7.2 volts  วงจรนี้จะสามารถจ่ายกระแสได้ไม่เกินความสามารถของแบตเตอรี่ที่อ่อนที่สุด คือจ่ายได้ไม่เกิน 800 mAh

๒) ถ้าต่อแบตเตอรี่ทั้งห้าก้อน แบบขนาน แรงดันจะไม่ถึง 1.5 volts เพราะแบตเตอรี่ตัวที่มีแรงดัน 1.2 volts จะกลายเป็น load ให้อีกสี่ตัวพยายาม charge ถ้าต่างกันแค่ 0.3 volt อาจไม่เป็นไร ขึ้นกับระยะเวลาด้วย แต่อย่างน้อยคงทำให้แบตเตอรี่ตัวเล็กร้อน ส่วนกระแสที่จ่ายได้คงจะเท่ากับ 1000 x 4 + 800 = 4800 mAh

ต้องรออาจารย์นิรันดร์หรือคนอื่นที่รู้จริงตอบ

A3
ขอต่ออีกนิด
รู้สึกว่าน้องต้องการต่อถ่านไฟฉายเพื่อไปจ่ายกระแสไฟฟ้าให้กับของเล่นอะไรสักอย่าง
การแบ่งประเภทของถ่านไฟฉาย(เซลล์ไฟฟ้าเคมี)
แบ่งได้ 2 ประเภทคือ
1.เซลปฐมภูมิ คือเซลล์ไฟฟ้าที่สามารถใช้งานได้ครั้งเดียว ใช้แล้วทิ้ง
เช่น ถ่านไฟฉายทั่วไป ถ่านอัลคาไลน์ เป้นต้น
2.เซลล์ทุติยภูมิ คือเซลล์ไฟฟ้าที่เมื่อเราใช้งานไปแล้วสามารถนำกลับมาใช้งานได้อีก โดยการประจุไฟใหม่ ทั่วๆไปเรียกว่าการชาร์จประจุ
เช่น แบตเตอรี่รถยนต์ ถ่านชาร์จต่างๆ ถ่าน Ni-Cd Ni-MH Li-ion เป็นต้น

การนำถ่านไฟฉายมาต่อกันต้องคำนึงถึงชนิดของถ่าน แรงดันของถ่าน กระแสของถ่าน การนำถ่านไฟฉายต่างประเภทกันจะทำให้แรงดันไฟฟ้าที่ได้มีค่าไม่ตรงกับค่าที่ ระบุไว้ที่รายละเอียดของถ่าน และจะส่งผลให้อายุการใช้งานของถ่านสั้นลง

ส่วนความต่างศักดิ์และกระแสในวงจรเหมือนคุณศานติครับ

VBA Ms Access - Get the Path to the Database (.mdb) File

It is often useful to obtain the path to the database (mdb) file, especially if you follow our tip to Store Images Using Relative Paths.
A common error is to assume that the 'current' path is set to the path of the database file (and therefore that images can be accessed using relative notation, for example). This can't be relied upon - some VBA functions can change the current path (eg "Dir"), and indeed the database can be opened with a different path altogether set as 'current'.
Below are 3 code-snippets you can use to obtain the path to the database (mdb) file in different situations. In each case if the database file is "C:\mydb\mydb.mdb" the functions return "C:\mydb\". These functions all work whether the database is opened via a local drive, mapped drive or a UNC path.
1) Access 2000 and later - Database Not Split.
If you only need to support Access 2000 and later, and do not have a split (front-end/back-end) database, then this is the simplest and most efficient method. If used in a split database architecture this returns the path to the front-end database - usually not what is desired.
Public Function GetDBPath() As String
    GetDBPath = CurrentProject.Path & "\"
End Function




2) Access 97 and later- Database Not Split.
If you need to support Access 97, and do not have a split (front-end/back-end) database, then use this method. If used in a split database architecture this returns the path to the front-end database - usually not what is desired.
Note that other approaches are possible which avoid the loop (and are therefore potentially slightly more efficient), but these either require use of the "Dir" function (which can give rise to recursion problems) or need additional references.
Public Function GetDBPath() As String
    Dim strFullPath As String
    Dim I As Integer
    strFullPath = CurrentDb().Name
    For I = Len(strFullPath) To 1 Step - 1
        If Mid(strFullPath, I, 1) = "\" Then
            GetDBPath = Left(strFullPath, I)
            Exit For
        End If
    Next
End Function

3) Split Front-End/Back-End - Get Path to Back-End.
If your database is a split (Front-End/Back-End) design, these functions return the path to the Back-End. The first version uses 'InStrRev'. InStrRev can give errors similar to reference problems on some systems (and is not available on Access 97), so a second version is provided which does not use InStrRev.
Using 'InStrRev':
Public Function GetDBPath() As String
    Dim strFullPath As String
    strFullPath = Mid(DBEngine.Workspaces(0).Databases(0).TableDefs("tblLinked").Connect, 11)
    GetDBPath = Left(strFullPath, InStrRev(strFullPath, "\"))
End Function

Not using 'InStrRev':
Public Function GetDBPath() As String
    Dim strFullPath As String
    strFullPath = Mid(DBEngine.Workspaces(0).Databases(0).TableDefs("tblLinked").Connect, 11)
    For I = Len(strFullPath) To 1 Step - 1
        If Mid(strFullPath, I, 1) = "\" Then
            GetDBPath = Left(strFullPath, I)
            Exit For
        End If
    Next
End Function

การแปลง Shapefile เป็น KML ด้วย ogr2ogr

 shp2kml.bat
set GDAL_DATA=C:\Program Files\FWTools2.4.7\data
C:\"Program Files"\FWTools2.4.7\bin\ogr2ogr -f "KML" -s_srs "epsg:32647" -t_srs "epsg:4326" C:\nksw_index\index.kml C:\nksw_index\index.shp

Web Form


Text Area

<textarea name="fname" cols="40" rows="3"><?=$arr_person->fname;?></textarea>


Option box

<SELECT NAME="vill_code" class='font11'>
                                <option value='99'>-เลือกหมู่บ้าน/ชุมชน-</option>
                                <?

                                $res_category = mysql_query("SELECT * FROM community  ORDER BY vill_code ");
                                while ($arr_category = mysql_fetch_object($res_category)){
                                       echo "<option value=\"".$arr_category->vill_code."\"";
                                       if($arr_category->vill_code == $arr_person->vill_code){echo " Selected";}
                                       echo ">".$arr_category->vill_name."</option>";
                                }

                                ?>
                        </SELECT>

Raido box

<input type='radio' name="sex" id="sex"  value="1" <?if ($arr_person->sex=="1") echo "checked";?> >ชาย
<input type='radio' name="sex" id="sex"  value="2" <?if ($arr_person->sex=="2") echo "checked";?> >หญิง

การคำนวณขนาดความจุแบตเตอรี่


ต้องบอกว่า บทความวันนี้ไม่ได้ คิดเองนะครับ แต่บังเอิญว่าลูกค้าที่ผมไปตรวจสอบ ส่งรายการคำนวณของไฟแสงสว่างฉุกเฉินมาให้ช่วยพิจารณา ซึ่งพอดูแล้วผมว่ามันน่าจะมีประโยชน์กับทุกคนนะครับ เผื่อว่าตอนที่เราจะเปลี่ยนแบตเตอรี่สำหรับไฟแสงสว่างฉุกเฉิน เราจะได้เลือก Spec. ที่ถูกต้องกัน

สำหรับรายการคำนวณนี้เป็นของ ริษัท ซี-ทีแอล คอร์ปอเรชั่่น จำกัด
ซึ่งจำหน่ายอุปกรณ์ด้านไฟแสงสว่างฉุกเฉินและป้ายทางหนีไฟ ใครสนใจก็เข้าไปเวปไซด์เขาได้นะครับ
www.c-tl.com ที่ต้องสาธยายเยอะหน่อยไม่ใช่ว่าได้ค่าโฆษณานะครับ แต่ว่าเพื่อให้เกียรติกันนิด
และเหมือนที่บอกครับบล็อคของผมต้องการที่จะเผยแพร่ความรู้โดยไม่ได้หวังผลกำไรอะไร ดังนั้นเช่นเดียวกันถ้าใครเอาบทความจากบล็อคของผมไปลงในเวปไซด์ใดก็แล้วแต่ อย่างน้อยก็บอกที่มานะครับว่ามาจาก
http://www.safetyenvi.blogspot.com/ เผื่อเดี๋ยวจะมีคนงง ว่าผมไปลอกบทความจากคนอื่นมา 5555

เข้าเรื่องดีกว่า สำหรับ การคำนวณขนาดความจุแบตเตอรี่

ข้อกำหนด

ดวงโคมฉุกเฉินขนาด 35 วัตต์ (ปกติถ้าผมแนะนำก็จะให้ใช้หลอด 35 หรือ 55 วัตต์)
จำนวนดวงโคม 2 ดวง
ระยะเวลาการใช้งาน 2 ชั่วโมง
แรงดันไฟฟ้าของแบตเตอรี่ 12 โวลท์

การคำนวณ

กำลังไฟฟ้าที่จ่ายดวงโคม (Power), P = 2 x 35 วัตต์
= 70 วัตต์

กระแสไฟฟ้าที่จ่ายดวงโคม (I) = P/V

= 70/12

= 5.83 แอมแปร์(A)

ระยะเวลาการใช้งาน = 2 ชั่วโมง(h)

ดังนั้นกระแสไฟฟ้าที่จะต้องจ่ายดวงโคม = 5.83 x 2
= 11.66 Ah

คิดเผื่อไว้ 25% (ตามมาตรฐาน IEEE 1184-1994)

ดังนั้นกระแสไฟฟ้าที่จ่ายดวงโคมทั้งหมด = 11.66 x 1.25

= 14.57 Ah.

ดังนั้นจะเลือกใช้แบตเตอรี่ 12 Volt 15 Ah.

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

ตัวดำเนินการ ( Operator )

ตัวดำเนินการ (Operator) หมายถึง เครื่องหมายกำหนดกรรมวิธีทางคณิตศาสตร์, พีชคณิต, บูลีน, การเปรียบเทียบ ระหว่างข้อมูล 2 ตัว ซึ่งเรียกว่า โอประแรนด์(Operand) โดยอาจมีค่าเป็นตัวเลข ข้อความ ค่าคงที่ หรือตัวแปรต่าง ๆ

ชนิดของตัวดำเนินการ

ตัวดำเนินการคณิตศาสตร์
ตัว ดำเนินการคณิตศาสตร์ (Arithmetic operator) หมายถึง ใช้สำหรับคำนวณโอประแรนด์ที่เป็นค่าคงที่หรือตัวแปรก็ได้ โดยให้ค่าผลลัพธ์เป็นตัวเลขค่าเดียว โอประเรเตอร์ เชิงคณิตศาสตร์ที่คนส่วนใหญ่รู้จักคุ้นเคยกันมากที่สุดได้แก่
+ หมายถึง เครื่องหมายการบวก
- หมายถึง เครื่องหมายการลบ
* หมายถึง เครื่องหมายการคูณ
/ หมายถึง เครื่องหมายการหาร
% หมายถึง เครื่องหมายหาเศษที่ได้จากการหารที่เรียกว่า โมดูลัส(Modulus)
++ หมายถึง เครื่องหมายการเพิ่มค่าที่เรียกว่า อินครีเมนต์(increment) โดยจะเพิ่มค่าครั้งละ 1
-- หมายถึง เครื่องหมายการลดค่าที่เรียกว่า ดีครีเมนต์(decrement) โดยจะลดค่าครั้งละ 1
(-) หมายถึง เครื่องหมายแปลงค่าให้กลายเป็นค่าตรงกันข้ามกับค่าเดิมที่เรียกว่า ยูนารีนีเกชัน (unary negation)

เช่น x = 20 % 3; ผลลัพธ์คือ x จะมีค่าเป็น 2
เช่น ถ้า x = -100 ดังนั้น -x จะมีค่าเท่ากับ 100 เป็นต้น

ตัวดำเนินการเชิงเปรียบเทียบ
ตัว ดำเนินการเชิงเปรียบเทียบ (Comparison operator) หมายถึง เครื่องหมายในการเปรียบเทียบข้อมูล ผลลัพธ์ที่ได้จะมีค่าตรรกบูลลีนเป็น จริง (True) และ เท็จ (False) ได้แก่
== หมายถึง เครื่องหมายเท่ากับ
!= หมายถึง เครื่องหมายไม่เท่ากับ
> หมายถึง เครื่องหมายมากกว่า
>= หมายถึง เครื่องหมายมากกว่าหรือเท่ากับ
< หมายถึง เครื่องหมายน้อยกว่า
<= หมายถึง เครื่องหมายน้อยกว่าหรือเท่ากับ


ตัวดำเนินการกำหนดค่า
ตัว ดำเนินการกำหนดค่า (Assignment operator) หมายถึง เครื่องหมายในการกำหนดให้ตัวแปรที่อยู่ทางฝั่งซ้าย มีค่าเท่ากับค่าเดิมในตัวแปรนั้น "กระทำ" (บวก, ลบ, คูณ, หาร) กับอีกตัวแปรหนึ่งที่อยู่ทางฝั่งขวา ได้แก่
x = y หมายถึง กำหนดค่า y ให้กับตัวแปร x
x += y หมายถึง เพิ่มค่า y ให้กับตัวแปร x (x = x + y)
x -= y หมายถึง ลบค่า y ออกจากตัวแปร x (x = x - y)
x *= y หมายถึง กำหนดค่า x คูณกับค่า y ให้กับตัวแปร x (x = x * y)
x /= y หมายถึง กำหนดค่า x หารกับค่า y ให้กับตัวแปร x (x = x / y)
x %= y หมายถึง กำหนดเศษที่ได้จากการหารค่า x ด้วยค่า y ให้กับตัวแปร x (x = x % y)
x <<= y หมายถึง เลื่อนบิตในตัวแปร x ไปทางซ้าย y บิต (x = x << y)
x >>= y หมายถึง เลื่อนบิตในตัวแปร x ไปทางขวา y บิต (x = x >> y)
x >>>= y หมายถึง เลื่อนบิตแบบซีโรฟิลล์ในตัวแปร x ไปทางขวา y บิต (x = x >>> y)
x &= y หมายถึง เก็บค่า x AND y ในตัวแปร x (x = x & y)
x ^= y หมายถึง เก็บค่า x XOR y ในตัวแปร x (x = x ^ y)
x |= y หมายถึง เก็บค่า x OR y ในตัวแปร x (x = x | y)

ตัวดำเนินการเชิงตรรกะ
ตัว ดำเนินการเชิงตรรกะ (Logical operator) เป็นเครื่องหมายที่ให้ค่าจริง (True) และ เท็จ (False) ในการเปรียบเทียบ ประกอบด้วยเครื่องหมาย
&& หมายถึง และ(AND) จะเป็นจริงเมื่อค่าที่ใช้เปรียบเทียบทั้ง 2 ค่าเป็นจริงทั้งคู่
|| หมายถึง หรือ(OR) จะเป็นจริงเมื่อค่าที่ใช้เปรียบเทียบทั้ง 2 ค่าเป็นจริงทั้งคู่หรือจริงเพียงค่าใด ค่าหนึ่ง
! หมายถึง ปฎิเสธ(NOT) เป็นการแปลงค่าตรงกันข้าม จากจริงจะเป็นเท็จ และ จากเท็จจะเป็นจริ


ตัวดำเนินการเชิงข้อความ
ตัว ดำเนินการเชิงข้อความ (String operator) เป็นการเชื่อมประโยคข้อความเข้าด้วยกัน (concatenation) โดยใช้เครื่องหมายบวก (+) เป็นตัวกระทำ
เช่น Name = "Bodin";
Say = "Hey "+Name;
ผลลัพธ์ที่ได้ Say จะมีข้อความเป็น Hey Bodin

ตัวดำเนินการระดับบิต
ตัว ดำเนินการระดับบิต (Bitwise operator) เป็นการดำเนินการเชิงตรรกะในระดับบิต โดยจะใช้มุมมองในแบบเลขฐาน 2 มาจัดการกับข้อมูล นั่นคือ ข้อมูลตัวเลขนั้นจะถูกแปลงเป็นเลขฐานสองในหน่วยความจำในขณะที่มีการดำเนิน การเชิงตรรกะในระดับบิต ซึ่งโดยปกติแล้วการกระทำใน JavaScript จะอยู่ในระดับตัวอักษร ที่เรียกว่า ระดับไบต์ (byte) โดยตัวดำเนินการระดับบิตมีรายละเอียดดังนี้
x & y หมายถึง ให้ผลลัพธ์การเทียบบิตแบบ AND ระหว่าง x กับ y
x | y หมายถึง ให้ผลลัพธ์การเทียบบิตแบบ OR ระหว่าง x กับ y
x ^ y หมายถึง ให้ผลลัพธ์การเทียบบิตแบบ XOR ระหว่าง x กับ y
~x หมายถึง เพิ่มค่าบิตให้ 1 จากนั้นจะให้ผลลัพธ์ของบิตมีค่าตรงข้าม
x << y หมายถึง เลื่อนบิตในตัวแปร x ไปทางซ้าย y บิต
x >> y หมายถึง เลื่อนบิตในตัวแปร x ไปทางขวา y บิต
x >>> y หมายถึง เลื่อนบิตแบบซีโรฟิลล์ในตัวแปร x ไปทางขวา y บิต

ลำดับความสำคัญของตัวดำเนินการ
ลำดับที่ 1 ( )
ลำดับที่ 2 ++ -- ! ~
ลำดับที่ 3 * / %
ลำดับที่ 4 + -
ลำดับที่ 5 << >> >>>
ลำดับที่ 6 < <= > >=
ลำดับที่ 7 == !=
ลำดับที่ 8 &
ลำดับที่ 9 ^
ลำดับที่ 10 |
ลำดับที่ 11 &&
ลำดับที่ 12 ||
ลำดับที่ 13 = += -= *= /= %= <<= >>= >>>= &= ^= !=