กลเม็ดต่างๆของ GDAL

Standard

หลายครั้งที่ท่านต้องการเปิดไฟล์ แปลงไฟล์ อ่านข้อมูลของไฟล์ Raster วันนี้เรามาเสนอ วิธีง่าย ๆ ที่ทำได้ด้วย command ของ gdal นะครับ

1. ดู metadata ของ Raster file

gdalinfo 20041117/20041117B1.tif

2. ทำการแปลงไฟล์จากชนิดหนึ่งไปเป็นอีกชนิดหนึ่ง ในแบบ simple โดยใช้ parameter เพิ่มเติมได้มากกว่านี้

gdal_translate -of GTiff 20030919/20030919B1 output.tif

3. ทำการแปลงไฟล์ด้วยคำสั่ง gdal_wrap (ตย. เป็นการแตกไฟล์ของ HDF4)

gdalwarp -of ENVI -ot Byte HDF4_EOS:EOS_SWATH:”prdat014.dat”:VNIR_Swath:ImageData3N /home/art/aster/2004111702/2004111702B3N

4. ทำการสร้าง composite ไฟล์ โดยการรวมหลาย ๆ Band

gdal_merge.py -o stack.tif -separate a.tif b.tif c.tif

หลายละเอียดของ option ดูได้จากที่นี่ gdal

เพิ่มเติมจาก blog ของ Markus http://gfoss.blogspot.com/2008/06/gdal-raster-data-tips-and-tricks.html

แก้ไขค่า ip setting ของ vhcs2

Standard

วันนี้ต้องนอกเรื่องสะหน่อย เพราะมันหลง ๆ ลืม ๆ มาหลายรอบ เลยต้องจดบันทึกมันสะหน่อย

วิธีการมีดังต่อไปนี้

1. ปิด vhcs2_daemon

/etc/init.d/vhcs2_daemon stop

2. แก้ไขค่า ต่าง ๆ ของ ip

/etc/network/interfaces

/etc/resolv.conf

/etc/vhcs2/vhcs2.conf

3. แก้ไขค่า่ต่าง ๆ ใน Database

mysql -u root -p

USE vhcs2;
UPDATE `server_ips` SET `ip_number` = '203.146.129.142' WHERE `ip_id` = 1;
UPDATE `domain` SET `domain_status` = 'change' WHERE `domain_status` = 'ok';
UPDATE `domain_aliasses` SET `alias_status` = 'change' WHERE `alias_status` = 'ok';
UPDATE `subdomain` SET `subdomain_status` = 'change' WHERE `subdomain_status` = 'ok';
UPDATE `mail_users` SET `status` = 'change' WHERE `status` = 'ok';
quit

4. สั่งให้เริ่มทำการ update อีกครั้ง

/var/www/vhcs2/engine/vhcs2-rqst-mngr

5. ทำการ สั่ง start vhcs2_daemon อีกครั้ง

/etc/init.d/vhcs2_daemon start

สำเร็จจนได้ครับ


ติดตั้ง SOS server

Standard

วันนี้ ก็มาง่มวิธีติดตั้ง SOS กันจากผลงานของ 52north

โดยจะต้องทำการติดตั้ง Apache-Tomcat server สะก่อนก็เป็นครั้งแรกที่จะลองทำดู

1. เริ่มแรกก็ติดตั้ง J2SDK ขอเน้น ว่า SDK ไม่ใช่แค่ JRE นะครับ download

มาเน้นเพิ่มเติมอีกทีว่า J2SDK ของ Sun ด้วย เพราะมี J2SDK-GCJ อีกตัวซึ่งใช้ไม่ได้นะครับ

2. Download Apache-Tomcat จาก download
ถ้าหากใช้ rpm ได้ก็ดีนะ ง่ายดายกว่า ลองติดตามดูรายละเอียดที่ Simple Tomcat 5 Installer
- วิธีลงด้วย src ก็แค่ untar ไปไว้ใน /usr/lib/ สะแล้วก็สั่ง startup.sh ใน /bin/
- ข้อสำคัญต้องทำการเพิ่มค่า JAVA_HOME ใน /etc/profiles

#Tomcat
JAVA_HOME=/usr/java/jdk1.5.0_06
export JAVA_HOME

- ตรวจสอบระบบโดย http://localhost:8080 (ถ้าเข้าไม่ได้ลอง ดู security ว่าเปิดให้เข้า 8080:9080/tcp หรือเปล่า)
- ถ้าเข้าระบบไม่ได้อาจจะเพราะไม่มี admin user ให้ไปเพิ่มในไฟล์ /usr/lib/apache-tomcat/conf/tomcat-users.xml

โดยเพิ่มข้อความดังข้างล่าง

3.ติดตั้ง Ant สะ โดย Download

แต่เราลงโดยใช้ rpm ของมัน ก็เลยง่ายหน่อย ไม่งั้นก็อาจจะยุ่งยาก บ้าง
- ข้อสำคัญต้องทำการเพิ่มค่า ANT_HOME ใน /etc/profiles

#ANT
ANT_HOME = /usr/bin/
export ANT_HOME

4.ทำการ tar SOS ไว้ใน้ /usr/ ก็ได้

5. ติดตั้ง postgresql/postgis

- copy postgresql-8.1xxx.jdbc3.jar และ postgis_1.xx.jar ไปไว้ใน /usr/sos/lib/
หา้กไม่พบ postgis_1xx.jar ต้องทำการติดตั้ง postgis-jdbc-xxx.rpm หรือทำการ recomplie เพื่อสร้างขึ้นมา
- สร้าง DB ชื่อ SosDatabase
- dump datamodel.sql จาก /sql/ และ test.sql เข้าไปใน DB
- ทำการแ้ก้ไขค่า config.properties โดยเป็นค่าเพื่อการติดต่อ DB
ข้อควรระวังอย่างมากคือ ค่าดังนี้
conf.sos.ds.daofactory และ conf.sos.result.lease (ex. 5 ) โดยค่า lease นั้นใน config ลืมกำหนดและบอกให้แก้มานะ ไม่เ่ช่นนั้นก็จะ run ไม่ได้

- ทำการแก้ไขค่า build.properties โดยต้องทำการระบุให้ถูกต้องโดยเฉพาะ TOMCAT_HOME และ JAVA_HOME

- เข้าไปใน /conf/ และพิมพ์คำสั่ง ant
- หาก error เกี่ยวกับ tools.jar ให้ลอง copy tools.jar จาก jdk/lib ไปที่ jre/lib

ถ้าทุกอย่าง พร้อมลองเข้า

http://localhost:8080/52nSOSv2/testClient.html
และทดลอง getCapabilities

http://localhost:8080/52nSOSv2/sos?REQUEST=GetCapabilites&SERVICE=SOS&ACCEPTVERSIONS=0.0.31

ปล Jakarta และ Tomcat admin นั้นไม่จำเป็น แต่จะลงก็ได้

รวมมิตร XML

Standard

ทำงานด้านนี้ หลีกหนีไม่ได้ ที่จะต้องยุ่งเกี่ยวกับ มัน เลย

งั้นมาเริ่มที่ละอย่าง สอง อย่างแล้วกัน เริ่มที่หัวมันก่อนเลย นะ

1. เอกสาร XML

<?xml version="1.0" encoding="UTF-8" ?>

2.การอ่านเอกสารตามรูปแบบข้างล่าง

<?xml version=”1.0″?>
<ExecuteResponse>
< Input>
< /Input>
< Output Name=”filename” X=”135.555″ Y=”45.5555″>
< /Output>
< /ExecuteResponse>

ทำการอ่านค่าด้วยวิธีการดังข้างล่าง

output = xmldoc.getElementsByTagName(“Output”)[0];
outputname = output.getAttribute(“Name”);
Xvalue = parseFloat(output.getAttribute(“X”));
Yvalue = parseFloat(output.getAttribute(“Y”));

3.การอ่านเอกสารตามรูปแบบข้างล่าง

<?xml version=”1.0″ ?>
<ExecuteResponse>
<Input>Input filename</Input>
<Output>Output filename</Output>
<X>135.555</X>
<Y>45.5555</Y>

ทำการอ่านค่าแต่ละตัวโดยการ
inputfilename=response.getElementsByTagName(‘Input’)[0].firstChild.data;
X=parseFloat(response.getElementsByTagName(‘X’)[0].firstChild.data);

Unix ปลีกย่อย

Standard

หัวข้อคงมีการ update กันไปเรื่อย เจออะไร ก็เอามาลงนะ

- วันนี้ขอเสนอเริ่มต้นกับการสร้าง ISO ไฟล์แบบให้รองรับกับ ชื่อยาว ๆ

mkisofs -r -joliet -joliet-long -l -allow-multidot -allow-leading-dots -no-bak -full-iso9660-filenames -o ../newms410.iso .

ตัวอย่างคำสั่ง อย่าไปใช้ * ละ มันจะบอก error error

- การส่งข้อมูลด้วยวิธี curl

curl http://wwww.script.com/script.php -d input=’value’

เป็นการส่งแบบ post form data

curl “http://localhost/cgi-bin/wps/wps.py?
request=execute&identifier=justadd&service=WPS&version=0.4.0&DataInputs=
value,250″

เป็นการส่งแบบ get form data

AJAX ปลีกย่อย

Standard

ตอนนี้ อะไร ๆ ๆ ก็คงต้อง AJAX (Asynchronous JavaScript and XML) นิยามที่ wikipedia

แต่เวลา่ใช้งานจริงมักเกิดปัญหา เล็ก ๆ น้อย ๆ น่ารำคาญมาก เพราะสาเหตุดังนี้

- เป็น javascript ดู debug ยาก และยังเป็นติดต่อแบบเบื้องหลัง อีก แก้ปัญหาได้ใน Mozilla โดยใช้ Fire Bug

- ปัญหา cross platform ระหว่าง IE และ Mozilla เนื่องด้วยมันทำงานไม่เหมือกัน ทำให้เกิดหลากหลายเป็น นับตั้งแต่การสร้าง XHTMLRequest ซึ่งใน IE นั้นใช้เป็น ActiveX แล้วอีกทั้งการตอบการทำงานที่แตกต่างกัน การแก้ไขและรายละเอียดจะกล่าวข้างล่าง

- อีกหัวข้อหลักแบบ โง่ ๆ ของ IE คือกระบวนการสร้าง XhtmlRequest นั้นต้องอยู่ Head tag ตั้งแต่หัวของไฟล์ ซึ่ง Mozilla อยู่ไหนมันก็ตอบสนองทั้งสิ้น

1. ไฟล์ xmlhttp.js ให้ include ไว้สะตั้งแต่ head ไปเลย


function createRequestObject() {

var req;

if(window.XMLHttpRequest){
// Firefox, Safari, Opera...
req = new XMLHttpRequest();
} else if(window.ActiveXObject) {
// Internet Explorer 5+
req = new ActiveXObject("Microsoft.XMLHTTP");
} else {
// There is an error creating the object,
// just as an old browser is being used.
alert('There was a problem creating the XMLHttpRequest object');
}

return req;

}

2. สร้าง XMLHTMLRequest เมื่อต้องการใช้งานและกำหนดค่าต่างๆ
ข้อสังเกต
- http.overrideMimeType(“text/xml”); นั้นเป็นการกำหนดว่าข้อมูลที่ตอบรับกลับมานั้นเป็นรูปแบบใด แต่ใน IE นั้นไม่สนับสนุน XML จึงไม่ควรกำหนด แต่ต้องดำเนินการขั้นตอน ต่อไปหากต้องการรับข้อมูลแบบ XML
- strsub นั้นเป็นตัวแปลว่างเปล่า เพราะใน IE ไม่ให้ส่งแบบ http.send(null)
- บางครั้ง IE ไม่ยอมให้ใช้ http.onreadystatechange = PointReq; แต่ให้ใช้ http.onload แทนแต่ Mozilla นั้นยอมรับทั้งสองอย่าง

// Make the XMLHttpRequest object
var http = createRequestObject();
var prog = "check.php";
var status_location = '';
var strsub ='';
function sendRequest() {
var t1 = encodeURI(document.getElementById("address").value);
// Open PHP script for requests
http.onreadystatechange = PointReq;
http.open('post',prog+"?address="+t1 ,true);
// http.overrideMimeType("text/xml");
http.send(strsub);

}

3.ตรวจรับผลของการเรียกใช้งาน
ข้อสังเกต

-จะเห็นว่า xmldoc นั้นมีการใช้รับค่าจาก Response ของ XMLHTMLRequest ที่แตกต่างกัน ตามที่ได้บอกไปแล้วว่าใน IE นั้นไม่ support .responseXML จึงต้องทำการสร้าง XMLDOC ขึ้นมาแล้วนำค่าใส่เข้าไปจาก .responseText แทน

-ใน IE นั้นควาย มากหากจะใช้ตัวแปลชื่อ status จงอย่าใช้ เพราะมันทำให้ผมติดเงก อยู่ 2 วัน

function PointReq(){

if(http.readyState == 4 && http.status == 200 ){

if (document.implementation && document.implementation.createDocument){
xmldoc = http.responseXML;
//In case to be the internet explorer
} else if (window.ActiveXObject){

xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async = false;
xmldoc.loadXML(http.responseText);
}

root_node = xmldoc.getElementsByTagName("Result")[0];
results = root_node.getAttribute("search");
if(results == "Succeeded"){
......
}
else if (results =='Nomatch'){
......
}
}
}

ข้อมูลเพิ่มเติม อ้างอิงได้หลายที่ จากที่นี่ผมก้อเอามาครับ Blog

pyWPS ภาคต่อ

Standard

pyWPS Client Example:

หลังจากได้ดำเนินลง pyWPS สำเร็จเสร็จสิ้น ก็ต้องมาดำเนินการด้าน Client for WPS กันต่อ

ก็มีอยู่สัก 2 – 3 ตัวที่่กำลังพัฒนากันอยู่ ก็เช่น Embrio และ Wuiw

ในขั้นตอนการลงก็มีอุปสรรคบ้างเล็กน้อย พอประมาณ

โดยกล่าวคร่าว ๆ ก่อนแล้วกันว่า

Embrio เนีั่ยต้องการ php_mapscript และ DOM โดยจะต้องใช้ php-dom, php-xml package

ขอเน้นไว้ว่า php-dom และ php-domxml ไม่เหมือนกัน เพราะ php-domxml นั้นเป็นตัวเก่าใน php version 4 ใน php 5.0 นั้นเปลี่ยนชื่อมันไปสะแล้ว

XML Post Request:

มาถึงการส่งข้อมูลในแบบ XML Post request กันบ้างแล้ว ซึ่งมีกระบวนการซับซ้อนบ้างเล็กน้อย วันนี้จะมา post ตัวอย่างของ XML ที่ใช้ในการ post


<execute service=”wps” version=”0.4.0″ store=”true” status=”false” xmlns=”http://www.opengeospatial.net/wps” ows=”http://www.opengeospatial.net/ows”>
<ows:identifier>addvalue</ows:identifier>
<datainputs>
<input>
<ows:identifier>input</ows:identifier>
<complexvaluereference reference=”http://localhost/wps/data/soils.tif”></complexvaluereference>

<input>
<ows:identifier>value</ows:identifier>
<literalvalue>250</literalvalue>

<input>
<ows:identifier>bbox</ows:identifier>
<boundingboxvalue>
<boundingbox>
<lowercorner>-1 -1</lowercorner>
<uppercorner>10 10</uppercorner>
</boundingbox>
</boundingboxvalue>

<ows:identifier>noth</ows:Identifier>
<literalvalue>10</literalvalue>
<input>
<ows:identifier>noth</ows:identifier>
<literalvalue>20</literalvalue>

</datainputs>
</execute>

แล้วตัวอย่างคำสั่ง ในการ request เช่น

wget –post-file=request.txt “http://160.193.96.33/cgi-bin/wps.py” -O – -nv

หรือ

wget –post-file=GetObservation_ifgi_timeInstantRequest_After.xml “http://160.193.96.33:8080/52nSOSv2/sos” -O out.xml

WMS Client Example

Standard

วันนี้ก็จะมาลุยเรื่อง WMS Client กันหน่อย จริง ๆ ต้องการทำ WPS แต่ยังไม่เคยเขียนเองเลยต้องมาเริ่มนับหนึ่งกันสะหน่อยนะครับ

ก็มีหลาย ๆ อันที่ดูดีใช้ได้ ลองรวบรวมมาไว้บ้างแล้วกัน เริ่มจากอันง่ายสุด

1.QuickWMS มี js มาให้เรียบร้อย แต่ทำได้เพียง ระบุ Layers ที่จะดึงมา ไม่มีการ GetCapabilities

2. WMS Java Script Library ก็ยังเป็น js อยู่ดี ใช้งานง่าย

3.OpenLayers ก็ยังคงคล้ายกับตัวอย่างข้างบน แต่มี Mouse Event ที่น่าสนใจ (คนพัฒนายังเด็กอยุ่เลย)

4. msCross เป็น AJAX Web GIS Client ที่มี library ที่สามารถดึงมาใช้งานได้อย่างน่าสนใจ

powered by performancing firefox

ติดตั้งและทดสอบ pyWPS

Standard

วันนี้บังเกิดไฟ อันแรงกล้าจากการดื่มและบ่นกับท่านปรมาจารย์ Honda มาเลยลุยสะเต็มที่

มาเริ่มติดตั้ง pyWPS กันเลยดีกว่า

ก็สามารถ download src ได้จาก web site โดยตรงที่ pyWPS

แล้วก็ทำติดตั้งโดยใช้คำสั่ง

python setup.py install

แต่หากต้องการชุด dev ให้ทำการลงโปรแกรม subversion สะก่อนแล้วใช้คำสั่ง

svn checkout https://subversion.gdf-hannover.de:8080/svn/pywps/trunk

ทั้งหมดน่าจะสำเร็จเสร็จสิ้นไปโดยไม่มีปัญหาไร เราก็จะมีไฟล์ที่

/var/www/cgi-bin/wps.py

แ้ล้วก็ไฟล์อื่น จะเก็บไว้ใน directory ของ python

/usr/lib/python2.4/site-packages/pywps/

โดยจะมี directory ย่อย ๆ อีก etc/, processes/ , Wps/

โดยที่ etc/ จะเป็น configuration file directory ที่เราต้องทำการปรับแก้ เรื่อง path ต่าง ๆ

ทั้ง grass.py และ settings.py

มีข้อสำคัญหลายอย่างแต่ ยกตัวอย่างเช่น path มาให้ดูแล้วกันนะ

‘PATH’: “/usr/grass-6.0.2/bin/:/usr/grass-6.0.2/scripts/:/usr/bin/:/bin/:/usr/local/bin/:”,

# GISBASE is place, where your GRASS installation is
# ‘GISBASE’: “/usr/lib/grass”,
‘GISBASE’: “/usr/grass-6.0.2″,

# LD_LIBRARY_PATH
‘LD_LIBRARY_PATH’:”/usr/lib”,

หากแก้แล้วยังไม่ได้สามารถลุยต่อได้ ต้องลอง complied มันดูสะ ก่อนนะด้วยคำสั่ง

python setup.py install

จากนั้นก็คาดว่าน่าจะพร้อมลุย

มาทดสอบด้วยคำสั่ง Execute มันเลยแล้วกัน

wget -nv -q -O – –post-data=”service=wps&version=0.4.0&request=execute&Identifier=spearpath&Datainputs=x1,592846,y1,4915161,x2,607418,y2,4926300&store=true&status=true” “http://160.193.95.189/cgi-bin/wps.py?”

หรือ

http://160.193.95.189/cgi-bin/wps.py?service=wps&version=0.4.0&request=execute&Identifier=spearpath&Datainputs=x1,592846,y1,4915161,x2,607418,y2,4926300&store=true&status=true

ผลของดำเนินการนั้นน่าจะไปอยู่ที่ http://localhost/wpsoutputs/

หากดำเนินการต่าง ๆ แล้วยังไม่สามารถทำอะไรได้ ลองเข้าไปดู ใน error_log ของ Apache ดูเพราะจะมีการแจ้งอยู่ในนั้น

เช่น อาจจะมีการใ้ช้ fix path อยู่ใน process script ก็ไปทำการแก้ไข และ Compile ใหม่สะ

ผลความคืบหน้า เป็นอย่างไรจะแจ้งให้ทราบต่อไป

ว่ากันด้วยเรื่องของ RSA Key Authentication with SSH

Standard

โดยเจ้า Hacker จากแดนเหนือมาถล่มเครื่องเลยต้องหัด ป้องกันตัวเองสะบ้าง เอาเร็ว ๆ ด่วน ๆ เลยแล้วกัน

เริ่มแรกให้ทำการสร้าง Public Key มาสะก่อน โดยหากใช้ SSH ให้เข้าไปที่

Setting > User Authentification->Key

แล้วสร้างมันสะ Generate New …

เลือกแค่ RSA 2048 ก็พอ ลองสร้าง DSA แล้วนานโคตร

แล้วก็จะต้องทำการใส่ passpharse ก็คล้าย ๆ password นั้นแหละ แ้ล้วผลสุดท้ายจะได้ ไฟล์ ออกมา

ให้ upload ไปใส่ใน /home//.ssh/authorized_keys

ดู permission ด้วยให้ Read All และ Owner Write only

จากนั้นไปทำการปรับแต่ง /etc/ssh/sshd_config ของ server สักนิดหน่อย

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

และ

PasswordAuthentication no
PermitEmptyPasswords no

จากนั้นก็ทดลองดูสะ แต่หากมีไม่ได้ ก็ลอง ปิด Current Terminal แล้วลองสะ แต่ระวัง ต้องแน่ใจนะว่าจะเข้า server ได้จากหน้าเครื่อง ไม่งั้น อาจจะย่ำแย่ได้

เพิ่มเติมหากมีข้อสงสัย
http://kmself.home.netcom.com/Linux/FAQs/sshrsakey.html