บทความ

กำลังแสดงโพสต์จาก 2011

การนำเข้า shapefile เข้า postgresql

การนำเข้าข้อมูลจาก shape file ไปยังฐานข้อมูลนั้น ถ้ามีการกำหนด encoding ของฐานข้อมูลเป็น utf8 ส่วนใน shape fiile จะเป็น ascii ซึ่งถ้ามีการนำเข้าไปยังฐานข้อมูลภาษาไทยจะไม่ถูกต้อง จึงจำเป็นต้องมีการกำหนดรายละเอียดก่อนที่จะใช้คำสั่งในการนำเข้าข้อมูล โดยการกำหนด set PGCLIENTENCDING=WIN874 set CLIENTENCODING=WIN874 สำหรับการกำหนด Encoding จะกำหนดใน Option ของคำสั่งเลยก็ได้ เช่น shp2pgsql -s 32647 -I -W "WINDOWS-874" "location shape file and filename" schema.table | psql -U username -d database_name แต่การนำข้อมูลออกไปนั้นจะต้องกำหนดโดยการระบุด้านบนอย่างเดียวจะไม่มี option มาให้เมื่อกำหนด environment เรียบร้อยแล้วจึงทำการสั่งให้ส่งออกข้อมูลเป็น shape file ตามที่ต้องการ เช่น pgsql2shp -u postgres -P password -p port_number -h host_ip -f location_and_filename database_name schema.table

MS4W support ECW

ms4w version ใหม่จะไม่มีส่วนของการสนับสนุนการแสดงผลข้อมูลภาพ ECW จำเป็นต้องทำการ download แฟ้มข้อมูลใหม่ของ gdal มาโดยสามารถทำการ download ได้ที่ www.gdal.org เมื่อได้แฟ้มข้อมูลมาแล้วจะต้องทำการนำแฟ้มข้อมูลที่ได้มาวางไว้ในตำแหน่งดังต่อไปนี้ /ms4w/gdalplugins/ gdal_ECW_JP2ECW.dll /ms4w/apache/cgi-bin/ libecwj2.dll ใน version window บางตัวอาจะไม่มีแฟ้มข้อมูลดังนี้ ให้หามาใส่แล้วแต่เวอร์ชั่นของ mapserver ที่ทำการ compile ถ้าทำใน .net2010 จะต้องใช้ msvcr100.dll , msvcp100.dll เป็นต้น เมื่อได้แล้วในส่วนของแมพไฟล์ก็เขียนเหมือนเดิมได้แล้ว

กำหนด Transition Effect

ในการแสดงผลภาพแผนที่ผ่าน Openlayers นั้น เมื่อเราเปลี่ยนมาตราฐานหรือการย่อ ขยายแผนที่ ภาพแผนที่ที่แสดงมันจะหายไปแล้วทำการดึงภาพแผนที่ใหม่มาแทนที่ อาจจะทำไม่ค่อยสวยในการแสดงผล ในส่วนของ Openlayers จะมีตัวเลือกในการทำให้การเปลี่ยนภาพแผนที่จากที่กำหนดเป็นมาตรฐานที่กล่าวมาแล้ว เป็นแบบการดึงภาพแผนที่ก่อนการกระทำมาแสดงก่อน เมื่อได้ภาพใหม่มาจึงนำภาพดังกล่าวมาแสดงแทน โดยเราสามารถจะกำหนดได้ 2 แนวทาง ดังนี้ 1. กำหนดใน layer โดยกำหนดแบบตายตัวใน library ของ Openlayer เลย โดยกำหนดในแฟ้มข้อมูล Openlayers/Layer.js /** * APIProperty: transitionEffect * {String} The transition effect to use when the map is panned or * zoomed. * * There are currently two supported values: * - *null* No transition effect (the default). * - *resize* Existing tiles are resized on zoom to provide a visual * effect of the zoom having taken place immediately. As the * new tiles become available, they are drawn over top of the * resized tiles. */ transitionEffect: ...

การกำหนด auto number สำหรับ oracle

ในการสร้างตารางข้อมูลในแต่ละฐานข้อมูลจะมีการกำหนดรายละเอียดของบางคอลัมน์ให้เป็นตัวเลขแบบให้ระบบกำหนดให้เพิ่มเองอัตโนมัติ ในส่วนของ Oracle ก็สามารถทำได้เช่นเดียวกัน โดยจะต้องดำเนินการดังนี้ เริ่มจากต้องทำการสร้าง sequence ที่ต้องการสำหรับตารางข้อมูลก่อน create sequence test_tab_seq_id minvalue 1 maxvalue 99999999 increment by 1; สร้างตารางข้อมูลและกำหนดให้มีการเรียกใช้ sequence ที่สร้างไว้ create table test_tab ( id integer not null, name varchar(50), primary key (id) ); สร้าง Trigger สำหรับให้มีการนำตัวเลขใน sequence ไปใช้งาน create or replace trigger test_tab_insert_id before insert on test_tab for each row when (new.id is null) begin select test_tab_seq_id.NEXTVAL into :new.id from dual; end; ...

การตัดภาพสำหรับแผนที่ล่วงหน้า

รูปภาพ
ในปัจจุบันในการแสดงภาพแผนที่นั้น จะเป็นการแสดงโดยการดึงรูปภาพมาแสดงแทนที่จะใช้ให้ server ทำการประมวลผลภาพแผนที่โดยการดึงข้อมูลที่เป็น vector มาแสดงโดยในบทความนี้จะกล่าวถึงโปรแกรมที่เป็นการตัดภาพล่วงหน้า โดยใช้โปรแกรมชื่อ Ka-Map ซึ่งสามารถ download ได้ที่ www.maptool.org ซึ่งเมื่อได้โปรแกรมมาแล้วสามารถนำไปวางไว้ใน MS4W (MapServer for Windows) ได้เลย เมื่อวางแล้วจะต้องทำการแก้ไข configuration ของโปรแกรม โดยไฟล์ configuration จะอยู่ที่ include/config.php ซึ่งสิ่งที่เราต้องแก้ไขคื่อ ส่วนของ mapfile ที่อ้างอิง ในตัวแปร $aszGMap โดยในสว่นของ path จะต้องกำหนดตามตำแหน่งของ mapfile ที่ต้องการ และในส่วนของ scales ก็ต้องกำหนด โดยการกำหนดนั้น ถ้าเราต้องการนำภาพที่ได้ไปทำการซ้อนทับกับภาพแผนที่ของ google จำเป็นต้องกำหนด scales ตามมาตรฐานที่กำหนดไว้ โดยมาตรส่วนที่ใช้ตามมาตรฐานมีดังนี้ 443744272.7241,221872136.3621,110936068.181,55468034.0905,27734017.0453, 13867008.5226,6933504.2613,3466752.1307,1733376.0653,866688.0327,433344.0163, 216672.0082,108336.0041,54168.002,27084.001,13542.0005,6771.0003,3...

การพิมพ์ภาพแผนที่ผ่าน MapServer แบบสวยงาม

ใน version เก่าๆของ mapserver การพิมพ์เมื่อเราส่งไปพิมพ์ที่เครื่องพิมพ์ภาพที่ได้อาจจะไม่ค่อยสวย คือ ภาพจะแตก ซึ่งถ้ายิ่งพิมพ์ขนาดกระดาษที่ใหญ่ก็ยิ่งแตกไปกันใหญ่ ใน version mapserver ตั้งแต่ version 5.6 นั้นได้เพิ่มความสามารถในการพิมพ์ภาพแผนที่ โดยเราสามารถกำหนดการพิมพ์ให้สวยงามได้ โดยถ้าต้องการพิมพ์ภาพขนาด เท่า A4 ก็จะต้องทำการคำนวณขนาดของภาพที่ให้ mapserve ทำการสร้างให้ใหญ่กว่า 4 เท่าโดยประมาณ แล้วเมื่อเวลาพิมพ์ก็กำหนดขนาดเท่ากับ A4 ที่ต้องการ ก็จะได้ภาพที่มีความละเอียดในการพิมพ์ออกทางเครื่องพิมพ์ โดยจะต้องกำหนดใน mapfile เช่น RESOLUTION 300 SIZE 1667 1250 MAXSIZE 6144 ซึ่งตรง SIZE จะต้องคำนวณโดยการนำค่า 4.1667 ไปคูณ เช่น ถ้าต้องการภาพขนาด 400*300 จะได้ 400 * 4.1667 = 1666.68 300 * 4.1667 = 1250.01 ซึ่งส่วนของ MAXSIZE ก็จำเป็นถ้าขนาดที่คำนวณได้มากกว่า 6144 ก็จะต้องเปลี่ยนขนาดของ Maxsize ด้วย โดยเราอาจจะใช้ php ในการไปกำหนดเวลาพิมพ์ก็ได้โดยใช้ php_mapscript ช่วย หรือถ้าขนาดของเราที่ต้องการพิมพ์กำหนดแน่นอนไม่เปลี่ยนแปลงก็กำหนดใน mapfile เลยก็ย่อมได้

เบื้องต้นกับ Openlayers

ในการพัฒนาโปรแกรมบริการด้านแผนที่ผ่านเว็บนั้น ถ้าเราต้องการนำข้อมูลแผนที่จากหลายๆแหล่ง เช่น googlemap , bing , yahoo มาเป็นพื้นหลังของแผนที่เรา เราสามารถใช้โปรแกรม Openlayers ในการพัฒนาต่อยอดเพื่อเพิ่มความสามารถของโปรแกรมเราได้ ซึ่งในโปรแกรม Openlayers นั้นจะมีตัวอย่างค่อนข้างจะครบถ้วน ทั้งจากการเรียกข้อมูล googlemap มาเป็นพื้นหลังหรือข้อมูลแผนที่อื่นๆ และการกำหนดตำแหน่งบนแผนที่ ซึ่งผู้พัฒนาสามารถเพิ่มความสามารถของโปรแกรมได้ตามที่ต้องการ ในที่นี้จะแสดงตัวอย่างเบื้องต้นสำหรับการเรียกข้อมูลแผนที่ googlemap มาแสดง โดยสามารถดูได้จาก http://www.openlayers.org ในการแสดงข้อมูลภาพแผนที่ของ Openlayers นั้นเราสามารถกำหนดการแสดงผลแบบ tile หรือ untile ได้ โดยกำหนดไว้ใน parameter ในการเรียกข้อมูลแผนที่มาแสดง ในการแสดงข้อมูลภาพที่เป็น tile นั้น โดยมาตราฐานใน Openlayers จะกำหนดการแสดงภาพไว้ค่อยข้างจะเยอะ ทำให้การแสดงภาพแผนที่อาจจะช้า เราอาจจะปรับการแสดงภาพแผนที่ โดยกำหนดใน layer/grid.js เพื่อให้การคำนวณในการดึงภาพมาแสดงน้อยลงได้ ในส่วนของ buffer โดยการกำหนดให้เป็น 1 ซึ่งค่ามาตาฐานจะกำหนดไว้ที่ 2 เ...

เบื้องต้นกับ MS4W

เมื่อต้องการพัฒนาโปรแกรม GIS เพื่อให้บริการผ่านเว็บ จะมีองค์ประกอบของบริการหลายๆอย่างซึ่งจะต้องติดตั้งบนเครื่องในที่นี้จะขอกล่าวถึงเฉพาะบนวินโดว์ ซึ่งบนวินโดว์นี้จะมีผู้พัฒนาไว้เพื่อให้เราใช้งานได้ง่าย โดยสามารถ download โปรแกรมมาติดตั้งได้เลย โดยสามารถใช้เป็นตัวติดตั้งแบบ setup หรือติดตั้งแบบ manual ก็ได้ โดยสามารถ download ได้ที่ http://www.maptools.org/ ซึ่งจะเป็น MS4W ซึ่งจะมีองค์ประกอบต่างที่ต้องใช้งานในการพัฒนาโปรแกรม GIS ผ่านเว็บ ซึ่งจะมีรายการดังนี้ Apache Web Server PHP PHP MapScript ที่ใช้ในการใช้งาน GIS Tools ต่างๆที่ใช้เกี่ยวกับ GIS ซึ่ง version ใหม่ ๆ จะไม่มีในส่วนของ extension ของ php ติดตามเหมือนกับ version เก่า ถ้าต้องการ library ของ php เพิ่มเติมก็สามารถ download ได้ที่ http://www.php.net ซึ่งจะเป็นส่วนของ extension ทั้งหมดของ php สามารถ copy ไปวางในส่วนของ extension ที่กำหนดได้ ในส่วนของ application ตัวอย่างในเว็บของ maptools นั้นก็จะมีตัวอย่างโปรแกรมที่พัฒนาเพื่อแสดงผลข้อมูลแผนที่ สามารถ download โปรแกรมตัวอย่างมาทดสอบดูได้ หรือจะลองทดสอบตัวอย่างในการพัฒนาเองก็ได...

การจัดการ Log ของ Apache Web Server

Log การใช้งานถือว่าเป็นสิ่งสำคัญเพื่อตรวจสอบระบบมีใครเข้ามาใช้งานบ้าง แต่จะต้องมีการดูแลอย่างสม่ำเสมอ มิเช่นนั้นจะทำให้ขนาดของพื้นที่ในเครื่องไม่เพียงพอในการจัดเก็บ log ในที่นี้จะกล่าวถึง log ของ web server โดยใช้ความสามารถของ apache web server โดยใน configuration ของ apache เราสามารถที่กำหนดให้ทำการบันทึก log ไว้ได้ โดยมาตราฐานในการบันทึก log จะบันทึกเป็นแฟ้มข้อมูลเดียวทำให้ขนาดใหญ่ขึ้นทุกครั้งที่มีการเรียกใช้งาน เราจึงจำเป็นต้องทำการกำหนด configuration ใหม่ เพื่อให้ระบบทำการบันทึก log ตามช่วงเวลาที่ต้องการ โดยกำหนดไว้ใน access และ error log ใน root ของแต่ละ application หรือของระบบก็ได้ เช่น ErrorLog "|/usr/sbin/rotatelogs -l /home/p10028/log/p10028-error_log.%Y-%m-%d-%H 3600" CustomLog "|/usr/sbin/rotatelogs -l /home/p10028/log/p10028-access_log.%Y-%m-%d-%H 3600" combined (ถ้าเป็น windows ไฟล์ rotatelogs จะอยู่ใน bin ของ apache ถ้าต้องการกำหนดเป็นขนาดของไฟล์ก็ได้ โดยแทนที่ 3600 ด้วยขนาดที่ต้องการ เช่น 5M เป็นต้น) ตามตัวอย่างจะเป็นการกำหนดทุกๆ 1 (3600 วินาที) ชั่วโ...

กรณีที่ไม่สามารถ start service ของ PostgreSQL ได้ (ใน windows)

รูปภาพ
สำหรับวินโดว์ เท่านั้น มีบางกรณีที่เราไม่สามารถที่จะ start service ของ PostgreSQL ได้เมื่อเราได้ทำการติดตั้งไปแล้ว โดยวิธีการใช้ setup หรือการติดตั้งแบบ manual อาจจะเกิดจากที่ตำแหน่งที่ติดตั้งไม่ได้อนุญาตให้ user postgres ทำการอ่านและเขียนไฟล์ในตำแหน่งที่ติดตั้ง หรืออาจจะเกิดจากกรณีที่ไม่ได้กำหนดการ logon สำหรับ user postgres ในกรณีไม่ได้กำหนดสิทธิตำแหน่งที่ติดตั้งให้กำหนดใน tab security ของตำแหน่ง root ที่ติดตั้ง ถ้าในกรณีที่สอง จะต้องกำหนดใน policy ของ window ที่ติดตั้ง Control Panel\System and Security\Administrative Tools\Local Security Policy แล้วทำการ double click รายการนี้ จะเปิดหน้าต่างขึ้นมา ให้ mouse ขวาที่รายการ Log on as a service จะได้หน้าต่างขึ้นมาให้ทำการคลิกปุ่ม Add User or Group ... จะเปิดหน้าต่างมาให้ทำการเพิ่ม user postgres เข้าไปแล้วทำการคลิกปุ่ม ok แล้วก็ ok

การจัดการ Resorce บน Linux

ในการจัดการทรัพยากรของเครื่อง server ผู้ดูแลระบบจะต้องหมั่นเข้าไปตรวจสอบดูแลว่าเครื่องยังสามารถให้บริการได้หรือไม่ โดยการตรวจสอบดูจากคำสั่งที่มีอยู่ใน Linux โดยอาจจะใช้คำสั่ง top ดูหรือคำสั่งอื่นๆที่ท่านถนัด เมื่อตรวจสอบดูแล้วว่ามีการใช้งานทรัพยากรของเครื่องไปแล้วไม่คืนกลับไปยังสถานะที่ควรจะเป็น ถ้าต้องการหลีกเลี่ยงการเปิดปิดเครื่องใหม่ จะสามารถใช้คำสั่งในการจัดการได้ โดยการจัดการนี้จะกระทำกับ memory และ swap ของเครื่อง โดยใช้คำสั่งดังนี้ การจัดการ memory echo 1 > /proc/sys/vm/drop_caches คำสั่งในการล้างพื้นที่ที่ใช้ใน swap swapoff -a swapon -a นำไปประยุกต์เขียนเป็น shell script ในการตรวจสอบทรัพยากรและนำคำสั่งข้างต้นไปใช้งานก็ได้ ตัวอย่างการเขียนเป็น Shell Script #!/bin/sh echo -e "BEFORE EMPTY CACHES" free echo 3 > /proc/sys/vm/drop_caches echo 0 > /proc/sys/vm/drop_caches msg="Cannot write swap back to RAM...\nNot enough memory - bye..." mem=`free|grep Mem:|awk '{print $4}'` swap=`free|grep S...

PostgreSQL การเขียนฟังก์ชั่น

เป็นตัวอย่างการเขียนฟังก์ชั่นในการตัดตัวอักษรที่ไม่ใช่ตัวเลขออกจากคำที่ต้องการ create or replace function test_valid_number (arg1 varchar) returns float AS $$ DECLARE len_char int; DECLARE loop_char int; DECLARE temp_char1 varchar; DECLARE temp_char2 varchar; DECLARE temp_i int; DECLARE temp_ret float; BEGIN /* ASCII 46 . 48-57 0-9 */ if (upper(arg1)='NIL' or upper(arg1)='ND') then RETURN 0.01; else len_char=char_length(arg1); loop_char=0; temp_ret=0; temp_char2=''; FOR loop_char IN 1..len_char LOOP temp_char1=SUBSTRING(arg1 from loop_char for 1); temp_i=ASCII(temp_char1); if (temp_i >= 48 and temp_i 0 ) then temp_ret=cast(temp_char2 as float); else temp_ret=0; end if; RETURN temp_ret; end if; END; $$ LANGUAGE plpgsql; ทุกท่านอาจจะนำไปประยุกต์กับการเขียนฟังก์ชั่นในการใช้งานสำหรับงานที่ท่านต้องการได้

PostgreSQL การแสดงตำแหน่ง vertex ของข้อมูลแผนที่

เราอาจจะมีข้อมูลที่เป็นเส้นหรือพื้นที่ปิด ที่ต้องการดูตำแหน่ง vertex บนข้อมูลนั้น จะมี SQL ในการเรียกข้อมูลมาแสดงผล ตัวอย่าง SELECT x(vertex) ,y(vertex) from (select ( st_pointn(the_geom,generate_series(1,st_npoints(the_geom)) )) as vertex from line where linecode='xxx') as a ลองไปประยุกต์กับข้อมูลของทุกท่านดูนะครับ

PostgreSQL Partitioning

การจัดการ Partitioning เพื่อใช้สำหรับข้อมูลที่มีปริมาณมาก และต้องการให้มีการค้นหาข้อมูลที่รวดเร็วไปยังข้อมูลที่ต้องการ โดยมีการจัดทำดังนี้ เริ่มต้นด้วยมีตารางข้อมูลที่เราต้องการ create table main_table ( id serial not null, name varchar(50) , provcode char(2) , primary key (id)); create index idx_main_table_provcode on main_table (provcode); ซึ่งจะเป็นตารางที่กำหนด provcode เป็นรหัสจังหวัดซึ่งจะจัดทำ partition โดยแยกตามจังหวัด (ถ้าใครต้องการเปลี่ยนเป็นอย่างอื่นๆก็ได้เช่นวันที่ เป็นต้น เมื่อได้ตารางข้อมูลแล้วก็จัดทำตาราง partion ตามที่ต้องการ โดยในตัวอย่างจะใช้ provcode เป็นตัวแยกข้อมูล create table main_table_part_10 ( check (provcode='10') ) INHERITS (main_table); create index main_table_part_10_provcode on main_table_part_10 (provcode); create ...