My Sensor Web Project

ช่วงนี้กลับมาทำงานเกี่ยวกับ sensor web อีกรอบ จากปีที่แล้วเวลาส่วนใหญ่ไปกับ GPS Tracking และระบบ Fleet management ซึ่งทำให้ผมมีโอกาสเรียนรู้ เรื่อง Data Management ค่อนข้างมาก เพราะ GPS Tracking ต้องติดตามข้อมูลจากกลุ่มรถจำนวนมาก และเก็บข้อมูลทุกๆ 30 วินาที ทำให้ Database Server ค่อนข้างใหญ่ (ปัจจุบันมีกว่า 5 ล้านเรคคอร์ด) ซึ่งทำให้ต้องมีการพัฒนา script เพื่อบริหารจัดการข้อมูล บำรุงรักษา และเพิ่มประสิทธิภาพในการเข้าถึงเช่น การทำ Temporal indexing เป็นต้น

รูปภาพ อ่านเพิ่มเติม

multi-geometry generalization

มีคนโทรมาปรึกษาเรื่องการทำระบบ Spatial Database สำหรับงานการบริหารการใช้ที่ดินที่หนี้ไม่พ้นการเก็บข้อมูล  landuse อันต้องสร้างจากการแปลภาพถ่ายทางอากาศหรือภาพถ่ายดาวเทียม แน่นนอนว่าถ้าท่านที่เคยทำงานด้านนี้จะพบ ว่าข้อมูล landuse เป็นข้อมูลที่มีความซับซ้อนของ polygon ที่มากในรูปแบบ muti polygon จำนวนมาหาศาล ยิ่งต้องมาใช้ทำงานหรือเปิดดูข้อมูลภาพยิ่งช้า นี้ยังไม่นับการนำมาใช้ทำระบบ map service ที่ต้องแสดงข้อมูลที่มีความละเอียดสูง วันนี้ผมมีเทคนิคการประมวลผลข้อมูลพวกนี้ผ่าน database มาแนะนำครับ

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

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 ก็ยังมีความจำเป็นอยู่ครับ

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

Spatial Raster Database

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

ข้อมูลที่จัดเก็บบนราสเตอร์ในงานภูมิสารสนเทศจะมีรูปแบบเป็นสี่มิติคือ X, Y, Z และ T โดยข้อมูลดิจิตอลจะจัดเก็บแบบไฟล์ (Files base system) บน OS ซึ่งในกรณีที่มีข้อมูลจำนวนมากๆ การบริหารจัดการข้อมูลทำได้ยาก โดยเฉพาะประเด็นเรื่องการสืบค้นข้อมูลจากเงื่อนไขที่ซับซ้อน เช่นเงื่อนไขเชิงพื้นที่ เงื่อนไขเชิงเวลา และเงื่อนไขอื่นๆ การนำแนวคิดและเทคโนโลยีของฐานข้อมูลเชิงสัมพันธ์ (Relational Database) ซึ่งเป็นรูปแบบการจัดเก็บข้อมูลที่ความสัมพันธ์กันอย่างเป็นระบบโดยใช้ทฤษฏีของเซตเป็นพื้นฐานมาช่วยในการจัดการข้อมูลราสเตอร์ โดยมีการจัดเก็บข้อมูลดิจิตอลในรูปแบบของ BLOB และจัดเก็บข้อมูลเรขาคณิตของราสเตอร์ (GeoReference data ) บนฐานข้อมูลโดยใช้แนวคิดของฐานข้อมูลเชิงพื้นที่(Spatial Database) สร้างความสัมพันธ์ระหว่างข้อมูลเรขาคณิต(Geometry) กับข้อมูลไบนารี(BLOB) บนฐานข้อมูล

การจัดเก็บข้อมูลราสเตอร์บนฐานข้อมูล อาศัยเทคนิคการจัดเก็บค่าดิจิตอลในรูปแบบ HEX WKB และเก็บข้อมูลเรขาคณิตของภาพราสเตอร์บน Geometry Object ในฐานข้อมูล ข้อมูลราสเตอร์จะถูกจัดแบ่งเป็นสี่เหลี่ยมย่อย (Tile) และจัดเก็บข้อมูลแบบ Pyramid ในรูปแบบ Overview Table เพื่อเพิ่มประสิทธิภาพในการเข้าถึงข้อมูล ซึ่งทั้ง Tile และ Pyramid จะมีการสร้างดัชนีเชิงเรขาคณิต GIST-index และมี relation key สำหรับเชื่อมโยงความสัมพันธ์ของข้อมูล รวมถึงสามารถเชื่อมโยงกับข้อมูลเวลา (Temporal data) และสร้างดัชนีความสัมพันธ์เชิงเวลาเพื่อค้นหาได้อีกด้วย

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

OSGeo Live GIS 4.0

_____OSGeo Live GIS 4.0 เป็นเวอร์ชั่นล่าสุดที่ออกมาให้ผู้ใช้งานโปรแกรม Opensource GIS ได้ใช้งานกัน โดยตัว OSGeo Live GIS มีแจกในงาน Foss4G 2010 ที่กำลังดำเนินอยู่ อยากจะนำ OSGeo Live GIS มาโปรโมทเพราะต้องการให้คนที่จะเริ่มต้นใช้งาน Opensorce GIS ทั้งผู้ใช้ทั่วไป และ นักพัฒนา ได้ทดลองใช้งานโปรแกรมโดยที่ไม่ต้องติดตั้งโปรแกรมเองก่อน เพื่อลดความยุ่งยากและอุปสรรค์ที่บั่นทอนกำลังใจ ที่สำคัญ OSGeo Live GIS มาในรูปแบบ Live Ubuntu 10.04 ที่ลดภาระเรื่องการติดตั้ง Linux ไปด้วย ทำให้ง่ายมากต่อการใช้งาน เพียงแค่ บูต OS จากแผ่นก็สามารถทำงานได้แล้ว โดยใน OSGeo Live GIS บรรจุโปรแกรม OSGeo Live GIS ครบทุกด้านพร้อมใช้งาน ตั้งแต่ Desktop GIS ถึง Internet GIS ผมเอารายการโปรแกรม Opensource GIS ต่างๆมาให้ดูด้วยครับ

HIGHLIGHTS

42 of the best GeoSpatial Open Source applications installed and pre-configured.
One page overviews for all projects
Overviews of key OGC standards
Many application Quick Start documentation

PACKAGES

52°North WPS 2.0.0
AtlasStyler 1.5
deegree 2.3
GeoKettle 3.2.0-20090609
Geomajas 1.6.0
GeoNetwork 2.4.3
Geopublisher 1.5
GeoServer 2.0.2
GMT 4.5.1
GpsDrive 2.11
GRASS GIS 6.4.0rc6
gvSIG 1.10
Kosmo 2.0
Mapbender 2.6.2
Mapfish 1.2
MapGuide Open Source 2.2.0
Mapnik 0.7.0
Mapserver 5.6.5
MapTiler 1.0beta2
Marble 0.9.2
MB System 5.1.2
OpenJUMP 1.3
OpenLayers 2.9.1
OpenCPN 2.1.0
OpenStreetMap editors and tools
osgEarth 1.3
Ossim/OssimPlanet 1.8.6
pgRouting 1.03svn
PostGIS 1.5
QuantumGIS 1.5.0
QGIS mapserver 0.7
R geostatistics 2.11.1
Sahana 0.6.4
SAGA GIS 2.0.4
SpatiaLite 2.4
Tilecache
uDig 1.2.0
Ushahidi 1.1.0
Viking 0.9.9
zyGrib 3.9.2
ZOO Project 1.0
Xubuntu 10.04 (Lucid)

______สามารถแวะเข้าไปดูรายละเอียดของแต่ละโปรแกรม จำแนกตามประเภทการใช้งานได้ที่ http://live.osgeo.org/overview/overview.html

ท่านที่สนใจเข้าไปดาวน์โหลดโปรแกรมได้ที่ http://live.osgeo.org/download.html

ตัวอย่างโปรแกรม WebGIS client ชื่อ Geomajas

Ushahidi โปรแกรมอีกตัวที่น่าสนใจก็มีมาให้ใน Live Opensource GIS

GeoServer 2 โปรแกรม Web GIS Server ที่มีประสิทธิภาพและใช้งานง่าย

Zoo WPS โปรแกรม Web Processing Server ตัวกลั่นก็มีมาให้นักพัฒนาลองใช้งาน

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 ด้วยครับ
อ้างอิงจาก

Install PostgreSQL on Ubuntu

________วันอาทิตย์สุดสัปดาห์เลยได้โอกาสจัดการกับเครื่องโน๊ตบุคเก่าเป็นโน๊ตบุคตัวแรกยี่ห้อ Acer ที่ผมหาซื้อด้วยน้ำพักน้ำแรงจากการทำงานตั้งแต่สมันเรียน มาถึงตอนนี้ปู่ก็เฒ่าชะแรแก่ชราไปมากเหลือเกินครั้นจะทิ้ง ก็ไว้เปล่าก็เสียดายเลยจับ format และลง Linux ubuntu ซะเอาไว้ทำ server เล่นๆ Linux เป็นอะไรที่ง่ายดายกว่าอดีตเยอะมาแล้วครับใช้งานง่ายมี GUI ใช้คำสั่งไม่กี่คำสั่ง วันนี้ไหนต้องลงโปรแกรมแล้วก็ขอนำมาฝากพี่ๆน้องๆเผื่อว่าท่าใดอยากลองมาใช้ Ubuntu บ้างจะได้รู้ว่ามันไม่ได้ยากอย่างที่คิดเลย ผมนำตัวอย่างการลง Spatial Database ตัวเก่ง Postgresql + Postgis บน Ubuntu มาแนะนำครับ

Step I : Postgresql 8.3

1. เพื่อให้ง่ายก็ไม่ต้อง hardcore ไป compile เองครับเพราะจะเหนื่อยโดยใช่เหตุ ติดตั้งผ่าน apt-get ง่ายสุด

$ sudo apt-get install postgresql-8.3

2. ติดตั้งส่วนของ Database client คือ pgadmin

$ sudo apt-get install pgadmin3 

3. ทำการ reset ตัว password ของ postgresql ผ่าน psql กำหนด password ใหม่ลงไป

$ sudo su postgres -c psql template1

template1=# ALTER USER postgres with PASSWORD 'password';
template1=# \q

4.แก้ password บน postgres user ของ ubuntu ให้ตรงกับ database

$ sudo passwd -d postgres
$ sudo su postgres -c passwd

5. set up ตัว admin package

$ sudo su postgres -c psql < /usr/share/postgresql/8.3/contrib/adminpack.sql

6. เปิดตัว config ของ postgres เพื่อให้ IP อื่นจากภายนอกใช้งานได้

$ sudo gedit /etc/postgresql/8.3/main/postgresql.conf

แก้ ส่วนของ config

#listen_addresses = 'localhost' ไปเป็น
listen_addresses = '*'

7.แก้ส่วนของ pg_hba.config ปลด comment ออกจากสองบรรทัด

$ sudo gedit /etc/postgresql/8.3/main/pg_hba.conf
local all all ident sameuser
local all all md5

8. restart ตัว postgresql database server

$ sudo /etc/init.d/postgresql-8.3 restart

Step II : PostGIS

9. ลง Postgis ต่อเลย

$ sudo apt-get install postgis
$ sudo apt-get install postgresql-8.3-postgis

10. create postgis template

$ sudo su postgres
$ createdb postgistemplate
$ createlang plpgsql postgistemplate
$ psql -d postgistemplate -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql
$ psql -d postgistemplate -f /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sq

11. สร้าง Permission ให้กับ postgistemplate

$ psql -d postgistemplate
$ ALTER TABLE geometry_columns OWNER TO postgres;
$ ALTER TABLE spatial_ref_sys OWNER TO postgres;
$ CREATE SCHEMA gis_schema AUTHORIZATION postgres;

12. สร้าง Database ใหม่โดย inherit จาก Postgistemplate

$ createdb -T postgistemplate -O postgres spatialdb

13. โหลดไฟล์ข้อมูล GIS จาก shapefile เข้า postgresql

$ shp2pgsql -I -s 32647 Building.shp building > building.sql

14.  excute ตัว sql บน spatialdb

$ psql -d spatialdb -h localhost -U postgres -f building.sql

15. ทดลอง query ข้อมูล building

$ psql -d spatialdb -c "select * from building;"

Step III : QGIS

16. เพื่อให้สะดวก ติดตั้ง QGIS เพื่อทำการเรียกดูข้อมูลจาก database แบบ graphic

$ sudo apt-get install qgis

17. เปิด QGIS เพื่อเชื่อมต่อ ข้อมูลอาคารบน spatialdatabase

กรอกพารามิเตอร์ต่างๆเพื่อเชื่อมต่อ database

ตัวอย่างข้อมูล building จาก Spatial Database