image processing service on ubuntu

อาทิตยที่ผ่านมา ผมใช้เวลาส่วนใหญ่กับการหา solution ในการสร้าง service บน Linux ubuntu server โดยตั้งใจจะให้ โปรแกรมที่พัฒนาโดย Python มันทำการ run แบบอัตโนมัติเมื่อมีการบูตเครื่อง ในรูปแบบ Service โดยโปรแกรมนี้จะทำหน้าที่ Process ข้อมูลภาพถ่ายดาวเทียม แบบอัตโนมัติ โดยทำการโหลดข้อมูลจาก image archive มาประมวลผลและ สร้างเป็น map service ต่อไป

เรียกว่าลองอยู่หลายแบบทั้ง pydaemon (ขอบคุณพี่อาร์ท @sarawut ที่แนะนำ ยากมากครับพี่ ลองแล้วผมไม่สำเร็จ) และการสร้าง shell เพื่อทำงาน สุดท้ายมาจบที่ความช่วยเหลือของ cliechti ที่ผม email ไปถาม โปรแกรมเมอร์ใจดีช่วยตอบคำถามและแนะนำจนสำเร็จ คิดว่าคงมีหลายคนน่าจะได้ประโยชน์ขออนุญาติ นำ code มาแชร์

อ่านเพิ่มเติม

Spatial Database Replication with Slony-I

มีคนมาปรึกษาเรื่องการพัฒนาระบบ Clearing House โจทย์ยากกว่าปกติตรงที่เป็นเรื่องของ การ Synchronize ข้อมูล Spatial Database ที่ตรงการแชร์และแลกเปลี่ยนกันโดยตรงระหว่างโหนดที่ทำงานร่วมกัน ถ้าเป็นเฉพาะ Textfile หรือ XML แบบ Metadata คงไม่ยากเท่าไหร่ แต่พอมาเรื่องข้อมูลจำนวนมากๆ อันนี้เริ่มมีปัญญาแล้ว ช่องทางหนึ่งที่แนะนำและอยากให้ลองคือช่องทางของเรื่องการ Replication  บน Database Server แต่ก็มีข้อจำกัดที่ต้องออกแรงไม่สามารถทำงานได้ทันทีทันใด บน Postgresql เองมี Replicate engine ที่น่าสนใจหลายตัว ผมเองเคยศึกษา Pgpool และ Slony-I แต่โดยส่วนตัวชอบ Slony มากกว่าเพราะมันค่อนข้างไม่ซับซ้อนและมีประสิทธิภาพที่ดี

 

Postgresql 9.0 มาพร้อม streaming replication แต่ Slony(synchronous replication) ก็ยังเป็นอีกช่องทางที่สามารถนำมาเสริมได้อีก เพราะ ยังมีข้อจำกัดที่ตัว Slave ที่ต้องอยู่บน Version เดียวกันระบบเดียวกัน รองรับแค่ 1 salve และที่สำคัญ Slave นั้นทำได้แค่ Read only ดังนั้นตอนนี้ถ้าเน้นปฏิบัติจริง Slony ก็ยังมีความจำเป็นอยู่ครับ

อ่านเพิ่มเติม

GeoScript

_____ถ้าจะถามว่าภาษาอะไรที่จะเหมาะสมและมีความสามารถที่หลากหลายในงานด้าน GIS เวลานี้ผมนึกถึง Python เป็นเพียงภาษาเดียวด้วยความที่ เป็นภาษาที่มี Library ที่สามารถเข้าถึงการจัดการ Geometry object ของโครงสร้างข้อมูลได้ และยังมี Lib ที่ใช้ Processing และ analysis ข้อมูลเวกเตอร์และราสเตอร์ได้อีกด้วย ดังนั้นถ้าหากอยากจะเป็น GIS programmer ผมแนะนำว่าสมควรอย่างยิ่งในการเรียนรู้ Python เพราะเป็นภาษาที่ช่วยให้เราทำงานกับข้อมูลมากและซับซ้อนได้ง่ายขึ้น

_____วันนี้ผมมีอีกหนึ่งซอฟต์แวร์ Library สำหรับ GIS ที่ชื่อว่า Geoscript มาแนะนำ Geoscript เป็นไลบารี่ที่เพิ่มเอาความสามารถในการจัดการและประมวลผลข้อมูลเชิงพื้นที่ เข้าไปอยู่ในภาษาแบบ script เช่น Python, Javascript, Groovy เป็นต้น โดยทำงานในลักษณะการ wrap เข้ากับ java code ชื่อดังอย่าง Geotools และ JTS ทำให้เราสามารถเรียกใช้งานฟังก์ชั่นผ่านภาษา script ได้ ผมเองได้ลองแล้วในส่วนของ Python โดยทำการติดตั้ง jython (ตัวช่วยให้เรา run python บน java ได้) เท่านี้ก็ลุยได้เลย นอกจากนี้ที่ผมชอบคือสามารถใช้ javascript ในการ process ข้อมูลอย่าง shapfile ได้อีกด้วย ทำให้เพิ่มความสามารถของ web application เข้าไปอีก การเขียนโปรแกรมก็ไม่ยากสามารถเขียนแบบ OOP ผ่าน Geoscript API ที่เตรียมไว้ ซึ่งนอกจากการเขียนโปรแกรมเพื่อประมวลผลข้อมุล GIS ทั่วไป เรายังสามารถ integrate ตัว Geoscript เข้ากับ WPS เพื่อทำ online processing Service ได้อีกด้วยครับ ท่านที่สนใจแวะไปดาวน์โหลดโปรแกรมมาใช้งานได้ที่ http://geoscript.org/py/

ขอแสดงตัวอย่างง่ายๆ การสร้าง convex hull บนข้อมูลจุด และสร้างวงกลมใหญ่ล้อมรอบข้อมูล

from geoscript.layer import Shapefile
from geoscript.viewer import plot
from com.vividsolutions.jts.geom import GeometryCollection
from com.vividsolutions.jts.geom import GeometryFactory
from com.vividsolutions.jts.geom import PrecisionModel
from com.vividsolutions.jts.algorithm import MinimumBoundingCircle
#Get the point shapefile
staLayer = Shapefile(‘/home/gregcorradini/wa_stations.shp’)
#Create a list of feature geometries
pntGeoms = [f.geom for f in staLayer.features()]
#Create a GeometryCollection from our list of points
geomColl = GeometryCollection(pntGeoms,GeometryFactory(PreciscionModel(),4326))
#Get the geometry collection’s convex hull
geomConvexH = geomColl.convexHull()
#Get the geometry collection’s minimum bounding circle
mCircle = (MinimumBoundingCircle(geomColl)).getCircle()
# Plot the geometries, BANG
plot(pntGeoms + [geomConvexH] + [mCircle])
ตัวอย่างผลลัพธ์ดังภาพนะครับ
อ้างอิงจาก

Dracones: a Web Mapping Framework

_______วันนี้มีข่าวประชาสัมพันธ์มาบอกครับ เนื่องจากคุยกับพี่ๆเพื่อนๆหลายท่านที่คิดว่าเราน่าจะมีสถานที่แลกเปลี่ยนและชุมชนเล็กๆที่ใช้พูดคุยแลกเปลี่ยนเรื่องที่เกี่ยวกับ Opensource GIS เพราะปัญหาหลักของการใช้ Opensource คือมันใช้งานแล้วขาดคู่มือหรือรายละเอียดการใช้งานที่ดี รวมถึงการแก้ปัญหาแบบ work around ที่ต้องเจอในขณะทำงาน ซึ่งแน่นอนว่าถ้าผู้ใช่ไม่สามารถถนัดในการอ่านภาษาอังกฤษ หรือมีความอดทนในการค้น mailing list  ท่านย่อมจะไม่สามารถหาวิธีการแก้ปัญหาได้แน่แท้ และแน่นอนว่าการ email มาถามผมอาจจะไม่ใช่ช่องทางที่ดีที่สุด เพราะผมเองก็มีข้อจำกัดในการตอบอีเมลทุกฉบับ ให้เร็วดังใจผู้ถาม ดังนั้นผมก็เลยเอา idea การสร้าง web board จากรัสเซียที่สร้างสังคมของนัก GIS จาก webboard แบบเดิม โดยเน้นไปที่การแลกเปลี่ยนประสบการณ์ เทคนิคและอื่นๆ ในเรื่องเทคโนโลยี โดยผมได้ใช้บริการ free web board โดยทุกท่านสามารถร่วมส่งคำถาม หรือจะเป็นผู้ร่วมสนทนาแรกเปลี่ยนความรู้ รวมถึงการตอบคำถามได้ที่ http://excellentmap.fix.gs/

________ มาถึงเรื่องที่จั่วหัวแนะนำ Dracones ตัวนี้เป็น Web Mapping Framework อีกตัวที่ผมว่ามันใช้งานได้ง่ายและเข้าท่าดี โดย Dracones ทำงานบน Map Script รองรับทั้ง PHP และ Python Interface ซึ่งเป็น frame work ที่ค่อนข้างเล็กกระทัดรัด ทำงานในรูปแบบ API ซึ่งง่ายในการเขียนโปรแกรมเพื่อพัฒนาต่อเพิ่มเติม ในส่วนของ Web Application ผ่าน Javascript API และส่วนของ Server ผ่าน Python API หรือ PHP API มีการทำ subversion ที่เรียกว่า DraconesPH ตัวนี้มีการนำไปใช้ทำ Application ด้าน geostat โดยใช้ Dracones Core ร่วมกับ Postgresql+Postgis ,Extjs และเชื่อมต่อการประมวลผลกับ SaTScan ท่านที่สนใจแวะไปดาวน์โหลด source code มาใช้งานได้ที่ http://code.google.com/p/dracones/

ตัวอย่างการใช้งาน SaTScan แบบ online บน draconePH

Find you from Geolocation

______รู้สึกว่าปัจจุบันเรื่องของตำแหน่ง(location) นั้นกำลังเข้ามามีบทบาทใน Application ด้านต่างๆมากขึ้น สืบเนื่องมาจากเรื่องของอุปกรณ์บอกตำแหน่งเช่น GPS มีราคาถูกและกลายเป็น option ที่ปกติที่ติดกับอุปกรณ์สื่อสารผกพาเช่นโทรศัพท์มือถือ และที่สำคัญผู้พัฒนาโปรแกรมประยุกต์ต่างต้องการนำเอาค่าพิกัดตำแหน่งของผู้ใช้เข้าไปร่วมกับการประมวลผลต่างๆเช่นการประมวลผลสืบค้นข้อมูล ซึ่งแน่นอนว่าการสืบค้นประเภทนี้ย่อมมีการใช้ความสัมพันธ์เชิงตำแหน่งเข้ามาร่วมในการสืบค้น และรวมไปถึงการจัดเก็บข้อมูลบนฐานข้อมูลที่มีการสร้างความสัมพันธ์เชิงตำแหน่งร่วมเข้าไปด้วย ในรูปแบบ Spatial Database

______การหาค่าพิกัดตำแหน่งนั้น นอกจากจะคำนวณจาก GPS ซึ่งเป็นอุปกรณ์ระบุตำแหน่งด้วยดาวเทียมเพียงอย่างเดียวแล้วปัจจุบันเรายังมีทางเลือกในการคำนวณตำแหน่งจากเครือข่ายอินเตอร์เน็ต ทั้งแบบ wifi hotspot,Cell site  หรือจะคำนวณหาจากค่า Mac address รวมๆแล้วเรียกว่า เทคโนโลยีระบุตำแหน่งแบบ Geolocation ซึ่ง Geolocation นี้เป็นหนึ่งใน มาตรฐานของ HTML5 ที่อุปกรณ์พกพาและโปรแกรม web browser รุ่นใหม่ๆรองรับ เพื่อผนวกรวมเอาค่าพิกัด ณ ปัจจุบันของผู้ใช้ทั้งจาก GPS ,WIFI,Cellsite และจากวิธีอื่นๆมาใช้ใน Application โดยผู้พัฒนาเขียนโปรแกรมติดต่อการคำนวณหาตำแหน่งแบบมาตรฐานผ่าน Geolocation API บน layer นี้ซึ่งจะง่ายต่อการพัฒนา วันนี้ผมมีเทคนิคและวิธีการคำนวณหาค่าพิกัดด้วย Geolocation API มานำเสนอ

Geolocation API specification

______ Geolocation API specification มาตรฐานของ HTML 5 สำหรับการเขียนโปรแกรมเพื่อเรียกพิกัดของตำแหน่งปัจจุบัน โดยสามารถดูรายละเอียดได้จาก http://www.w3.org/TR/2008/WD-geolocation-API-20081222/ ซึ่งปัจจุบัน โปรแกรม Web Browser หลายตัวก็สนับสนุนการทำงานเช่น Firefox,Chrome,Safari,Opera (ยกเว้น IE อยู่ระหว่างการทดลอง) การเขียนโปรแกรมก็ไม่ยุ่งยาก สามารถเขียนในรูปแบบการ Getposition และแบบการ track position

function showMap(position) {
alert(position.coords.latitude+’,’+ position.coords.longitude).
}
// One-shot position request.
navigator.geolocation.getCurrentPosition(showMap);
กรณีที่ต้องการ track ตำแหน่งตลอดเวลา ก็ใช้
var watchId = navigator.geolocation.watchPosition(showMap);
เมื่อต้องการหยุดการ track ก็ทำลาย object โดยใช้คำสั่ง
navigator.geolocation.clearWatch(watchId);
____ ทดสอบการใช้งานได้ที่ http://html5demos.com/geo โดยท่านทำการอนุญาติให้ web browser เข้าถึงพิกัดก่อน โดยทำการ set permission เพื่อ share location การหาตำแหน่งก็จะคำนวณค่าพิกัดจากการสนับสนุนการหาตำแหน่ง ซึ่งขึ้นกับเครื่องปลายทาง ถ้ามี GPS และเปิด ตัว API ก็สามารถเข้าถึงและเรียกดูได้ หรือถ้าไมีก็อาจจะคำนวณหาจาก Cell site ของจุดจ่ายสัญญาณอินเตอร์เน็ต ซึ่งแน่นอนว่าความถูกต้องของพิกัดก็จะลดลงกว่าการหาตำแหน่งด้วยระบบ GPS  โดย Geolocation data ที่ได้ประกอบด้วยค่า พิกัด(lat,lon on WGS84) , accuracy, Speed, heading direction โดยเราสามารถสกัดค่าเหล่านี้ได้จาก javascript API
ตัวอย่างการ share location
ตัวอย่าง application
YQL Geo Library
______YQL Geo Library เป็น Javascript geolocation Lib ที่ผมชอบและใช้งานอยู่ โดยตัวนี้ทำงานได้บน Geolocation API และเพิ่มความสามารถการหาตำแหน่งจาก IP address รวมถึง Geocode Service และ Reverse Geocode service ความสามารถล้นหลายทำงานแบบ API แวะไปดาวน์โหลดมาใช้งานได้ฟรีที่ http://isithackday.com/hacks/geo/yql-geo-library/ ผมมีตัวอย่างการหาตำแหน่งแบบ Geolocation ของ lib ตัวนี้มาแนะนำ
yqlgeo.get(‘visitor’,function(o){
alert(o.place.name + ‘,’ + o.place.country.content +
‘ (‘ + o.place.centroid.latitude + ‘,’ +
o.place.centroid.longitude + ‘)’
);
});
ข้างบนเป็นตัวอย่างการหาพิกัดของ visitor ที่เข้า web ผ่าน w3c Geolocation API แบบ YQL
yqlgeo.get(‘217.12.14.240′,function(o){
alert(o.place.name + ‘,’ + o.place.country.content +
‘ (‘ + o.place.centroid.latitude + ‘,’ +
o.place.centroid.longitude + ‘)’
);
});
code ข้างบนเป็นการหาค่าพิกัดจาก IP address โดยสามารถระบุประเทศและตำแหน่งโดยประมาณได้
GeoIP API
_____Geo IP API เป็นระบบที่มี free IP database สำหรับการคำนวณค่าพิกัดจาก IP address ซึ่งเราสามารถนำมาใช้ได้กับ Web Application โดยผ่าน API ในภาษาต่างๆ เช่น PHP,Python, C# เป็นต้น สามารถไปดาวน์โหลดโปรแกรมได้ที่ http://www.maxmind.com/app/python ผมเองใช้ตัวนี้ผ่านทาง python มีตัวอย่างการใช้งานมาแนะนำดังนี้ครับ
import pygeoip
import os
os.chdir(r’C:\Users\user\Desktop\GEOIP’)
gic = pygeoip.GeoIP(‘GeoLiteCity.dat’)
print gic.record_by_addr(‘125.26.9.54′)
code ด้านบนเป็นการหาพิกัดจาก Ip address
ตัวอย่างผลลัพธ์การหาพิกัดจาก IP address
ถ้าต้องการหาพิกัด จาก Domain name ก็สามารถทำได้เช่นเดียวกันครับดังนี้
gic.record_by_name(‘google.com’)
ผลลัพธ์การหาพิกัดจาก domain name

อ้างอิงจาก

Good Map on-line

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

______พอพูดถึงความดีที่ใครๆก็รู้จักทำให้ผมนึกถึง Good Map Online หรือใช้ภาษาไทยว่า แผนที่ความดี ผมรู้จัก Good Map จากพี่ท่านหนึ่งที่โพสเรื่องนี้ไว้บน Facebook เลยตามเข้าไปดู พบว่ามีเรื่องราวน่าสนใจมากมาย ส่วนหนึ่งเป็นเรื่องราวที่เคยกล่าวถึงซึ่งมาจากรายการ คนค้นคน บุคคลต้นเรื่องผู้เสียสละ และมีอีกหลายส่วนที่ผู้คนทั่วไปสามารถ Post หรือส่งเรื่องราวของตนเองเข้าไปยัง Website ได้และระบบสามารถแสดงผลข้อมูลความดีจากคลังความดีในรูปแบบแผนที่แยกตามสถานที่ต่างๆบนแผนที่ Google Map รวมไปถึงการแสดง link เรื่องราวของเรื่องความดี ,ภาพและวีดีโอภาพเคลื่อนไหว โดยจำแนกประเภทความดีเป็นหัวข้อต่างๆเช่น ความซื่อสัตย์ การประหยัดอดออม,ความขยันหมั่นเพียร,การอนุรักษ์สิ่งแวดล้อมเป็นต้น เรียกว่าเริ่มต้นจากการทำความดีเล็กๆน้อย ไปถึงความดีแบบใหญ่ๆที่ผลต่อคนจำนวนมาก แต่ถึงจะเล็กหรือใหญ่ไม่สำคัญขอให้เป็นความดีที่เกิดมาจากความจริงใจและไม่หวังผลตอบแทนย่อมเพียงพอ แผนที่ความดีน่าจะเป็นอีกเครื่องมือในการจุดประกายในคนหันมาทำดีและเผยแพร่ความดีออกสู่สังคม เพื่อที่คนอื่นๆในสังคมจะได้มองดูเป็นอย่าง ค่านิยมความดีจะได้สืบต่อไป แวะไปดูเรื่องราวความดีและแจ้งเบาะแสความดีได้ที่ http://goodmap.kapook.com/#

หน้าแรกของแผนที่ความดี (Good Map online)

______ผมเองชอบ Good Map และสดุดตากับ label ไอคอนแบบนี้ว่าเคยพบที่ไหนจนสุดท้ายก็นึกออกว่ามันคือ Ushahidi นั้นเอง เจ้าตัวนี้เป็นโปรเจคที่เกิดมาเพื่อการช่วยเหลือกันของมนุษย์โดยแท้ และเป็น African Open-Source Project ที่น่าสนใจ ผมเคยเจอหลายหน่วยงานและองค์กร NGO นำ Ushahidi Framework ไปใช้โดยเฉพาะเรื่องการจัดการและการรายงานข้อมูล การจัดเก็บบันทึกข้อมูลแบบ online รวมถึงความสามารถของการเชื่อมโยงกับ SMS และการทำงานแบบโปรแกรมประยุกต์บนมือถือ เป้าหมายหลักของ Framework นี้คือเป็น Web Report ที่แสดงผลได้ทั้งแบบแผนที่ รายงาน กราฟ ภาพเคลื่อนไหวแบบ Vdo Clip ระบบพัฒนาด้วยภาษา PHP และใช้ฐานข้อมูลเป็น Mysql และมีบางโมดูลขั้นสูงที่พัฒนาด้วยภาษา python และ Java เช่น Fontline SMS ,และ Android App  ส่วนระบบแสดงผลแผนที่ใช้ Openlayer Lib การทำงานและการติดตั้งก็สไตล์ CMS ใช้งานง่ายผ่าน Web GUI แต่ การ config หรือพัฒนาโมดูลเสริมทำได้ค่อนข้างยากระดับหนึ่ง ท่านที่สนใจดาวน์โหลด source code ได้ที่ http://github.com/ushahidi/Ushahidi_Web/downloads

ตัวอย่างอีก 1 โครงการที่ใช้ Ushahidi

_____ Ushahidi น่าจะเป็นอีก Framework ที่มีประโยชน์มากกับงานด้านภัยพิบัติ การจัดการสิ่งแวดล้อมหรือโครงการรายงานสถานะภาพสังคม , Vote Report และอื่นๆ เพราะ Web Report ที่เป็น Framework แบบนี้ยืดหยุ่นและมีเครื่องมือให้พร้อมใช้งานระดับหนึ่งแล้ว ผมมี Demo ของระบบมาแสดงให้ดูเพื่อว่าจะเป็น Idea ในการนำไปใช้งานต่อไป

1. การ config รายละเอียดของ web application และ Web Map Report

แถบควบคุมการทำงานของระบบ

การปรับแต่ง รายละเอียดการแสดงผลแผนที่


ตัวอย่างหน้าแรกของ Demo Page

แสดงผลรายงานและข้อมูลที่สำรวจได้

Update ข้อมูลสำรวจผ่าน Web Application

โมดูลการแจ้งเตือนข้อมูลผ่านทาง SMS และทาง Email


WITH on Postgresql

_____คงจะไม่มีอะไรที่จะมีความสุขเท่าการได้นอนพักผ่อนในวันหยุดยาวๆแบบนี้ จากที่ทั้งต้องทำงานหนักมาทั้งปี การได้พักผ่อนและหยุดให้เวลาบนเข็มนาฬิกาเร่งรีบเร่งรัดการดำเนินชีวิตเป็นอะไรที่ดีอย่างบอกไม่ถูก ผมใช้เวลาตอนเช้าในการพักผ่อนตื่นไปทำบุญที่วัดและทำกิจกรรมกับครอบครัว รู้สึกอิจฉาคนที่ใช้ชีวิตอยู่ต่างจังหวัดจริงๆ ไม่ต้องเจอกับควันผิดและรถติด ถึงจะไม่โก้หรูแต่ก็มีความสุขสบายบนความเรียบง่าย ตอนค่ำๆก็มานั้งอ่านเมล์และตอบกระทู้สนทนาตามเว็บบอร์ดที่เป็นสมาชิก ผมไปเจอเรื่องเกี่ยวกับ WITH ที่น่าสนใจบน Postgresql บน Blog ของ Paul Ramsey ที่เขียนไว้อย่างน่าสนใจมาก เลยอยากนำมาฝากท่านที่ใช้งาน Spatial Database หรือเป็น DBA

______ผมเองใช้งาน WITH อยู่บน Postgresql 8.4 มาตั้งแต่แรกที่ Upgrade โปรแกรมจาก 8.3 เป็น 8.4 แล้วเพราะด้วยความสะดวกในการสร้าง Subquery ขนาดใหญ่หรือแบบที่ซับซ้อมมันค่อนข้างสะดวกและมีประสิทธิภาพแบบเดิม หลายท่านที่ยังไม่เคยใช้งานผมมีตัวอย่างง่ายๆมาแนะนำเช่น

WITH c_pro AS (SELECT *,st_area(the_geom)/1000000 AS area_ FROM province WHERE st_area(the_geom) > 5000000000),
a_pro as (SELECT SUM(tot_all) AS pop,province_t FROM amphoe GROUP BY province_t)
SELECT c.province_t,c.area_,a.pop FROM a_pro a,c_pro c WHERE c.province_t=a.province_t  AND a.pop/c.area_ > 100
_____ตัวอย่างการใช้ WITH เพื่อสร้าง Sub-query ในการคำนวณหาความหนาแน่นประชากรต่อพื้นที่ โดยใช้ Spatial Function คำนวณหาพื้นที่จริงจาก ข้อมูล Geometry ของตาราง Province ข้อดีคือเราสามารถสร้าง Sub-query รอไว้คล้ายๆ View เพื่อรองรับการประมวลผลการสืบค้นกับ SQL หลายๆแบบได้ ลดการต้องสร้าง SQL สำหรับ Sub-query ซ้ำและเหมาะกับข้อมูลขนาดใหญ่ นอกจาก WITH และยังมี WITH RECURSIVE อีกหนึ่งที่เพิ่มเข้ามา เป็นการใช้ฟังก์ชั่น Recursive บน SQL ที่ลดการเขียน code ที่ซับซ้อนถ้าเป็นก่อนหน้าการสร้าง Recursive Function ต้องเขียน PL/SQL เพื่อประมวลผลคำสั่งสืบค้น แต่ใน 8.4 เราสามารถใช้ SQL WITH RECURSIVE ได้เลยดังตัวอย่างนี้

WITH RECURSIVE t(m,n) AS (
VALUES (0,0)
UNION ALL
SELECT m+1 ,n-1  FROM t WHERE m < 100
)
SELECT sum(m),sum(n) FROM t;
______ตัวอย่างด้านบนเป็นการหาค่าผลรวมเพิ่มทีละ 1 จาก 0 ถึง 100และผลรวมของการลดลงทีละ 1 จาก 0 – 100 การใช้ฟังก์ชั่น Recursive ประยุกต์ใช้ได้ในหลายแบบทั้งแบบการคำนวณหาความต่อเนื่องของข้อมูล เรื่องของโครงสร้างแบบกราฟหรือแบบต้นไม้ ในงาน GIS ที่ใช้มากคือเรื่องของ Network โดยเฉพาะการหา Connectivity ของข้อมูล ตัวอย่างเป็นการประยุกต์ใช้ฟังก์ชั่น ST_Dwithin กับการเปรียบเทียม StartPoint และ EndPoint ของ แต่ละ line Segment ที่อยู่ใกล้กันจบครบ โดยในตัวอย่าง SQL เริ่มจาก node ที่ 13 ไปจบที่ 1

WITH RECURSIVE walk_network(id, segment) AS (
SELECT id, segment FROM network WHERE id = 13
UNION ALL
SELECT n.id, n.segment
FROM network n, walk_network w
WHERE ST_DWithin(ST_EndPoint(w.segment),ST_StartPoint(n.segment),0.001)
)

SELECT * FROM walk_network

_____ผลลัพธ์ที่ได้คือ line ที่ {13,9,6,3,1} ซึ่งมี connected point ร่วมกันและมองได้ว่าเป็นเส้นทางจาก จุดเริ่มต้นที่ 13 ไปจบที่จุดสิ้นสุดของ 1 ดังภาพด้านล่างครับ
______จะเห็นได้ว่าการใช้ WITH Recursive มีประโยชน์และสามารถใช้ในงาน QC ข้อมูลเช่นข้อมูล network การตรวจงานที่จ้างเด็กเพื่อ digitize ข้อมูลถนน,ทางน้ำ,โครงข่ายท่อ การตรวจสอบการ snap และการปิด node เพื่อเตรียมข้อมูลสำหรับการวิเคราะห์โครงข่าย ที่จำเป็นจะต้องใช้คุณสมบัติการเชื่อมต่อของข้อมูล และอีกประเด็นที่อยากนำเสนอคือ Spatial Database มันมีความสามารถที่สูงขึ้นไม่ได้เป็นแค่ storage อีกต่อไป เพราะฟังก์ชั่นการวิเคราะห์และประมวลผลข้อมูลเชิงตำแหน่งขั้นสูงก็ได้ถูกรวมและเตรียมให้ DBA ได้ใช้งาน แต่แน่นอนว่าอาจจะไม่ง่ายในการกดปุ่มเหมือนโปรแกรม GIS Desktop แต่ถ้าท่านต้องตรวจสอบข้อมูลขนาดใหญ่เป็นแสนเป็นล้านบรรทัด อย่างไรก็จำเป็นที่ต้องใช้งานระบบฐานข้อมูลที่มีความสามารถในการประมวลผลคำสั่งการสืบค้น และแน่นอนว่าบุคคลที่ทำการประมวลผลต้องเข้าใจทั้งเรื่องของ Spatial Relation และเข้าใจเรื่องของ SQL Programming ด้วยครับ
อ้างอิงจาก