Month: February 2012

ขั้นตอนการติดตั้ง PostGIS/Postgresql บน Ubuntu Server

ความเป็นมา

  • Postgresql อ่านออกเสียงว่า โพสเกรส เป็นระบบจัดการฐานข้อมูล RDBMS ซึ่งพัฒนาโดย PostgreSQL Global Development Group ในปี 2550 ลักษณะเป็น opensource มีลิขสิทธิ์แบบ BSD เป็นซอฟท์แวร์แบบ cross-platform ใช้ได้ทั้ง Windows, Free BSD, Solaris, Linux และก็ Mac OS
  • ย้อนหลังไปก่อนหน้านั้น ประวัติดั้งเดิม Postgresql พัฒนาต่อจากฐานข้อมูลชื่อ Ingres จึงเรียกว่า Post-Ingres (แปลง่ายๆว่า อินเกรสในตอนหลัง) ตอนหลังชื่อกลายเป็น Postgresql โครงการนี้สานต่อจากฐานข้อมูล Ingres ที่ยังมีปัญหา การพัฒนาเริ่มต้นในปี 2528 โดย Michael Stonebraker ที่ University of California, Berkeley

PostGIS

  • PostGIS คือส่วนขยายเพิ่มเติมที่ทำให้ฐานข้อมูล Postgresql  สามารถรองรับข้อมูลด้านสารสนเทศรูมิศาสตร์ (GIS) คือสนับสนุนข้อมูลที่สัมพันธ์เชิงพื้นที่ (Spatial)  ในตอนที่เขียนอยู่เป็นรุ่น 1.5 ยังไม่สนับสนุนงานด้าน Raster ต้องรอรุ่น 2.0
  • ผมจะเน้นเขียนถึงด้านนี้เพราะทีมงานของผมนำไปประยุกต์ใช้ควบคู่กับโปรแกรม GIS Desktop คือ Quantum GIS ซึ่งจะเป็นโปรแกรมที่เรียกใช้ฐานข้อมูล PostGIS จากเครื่อง Ubuntu Server ที่ลง PostGIS/Postgresql ไว้

  • สำหรับฐานข้อมูลระดับใหญ่ที่ support ข้อมูลแบบสัมพันธ์กับเชิงพื้นที่ (Spatial) มี Oracle, Microsoft SQL ServerInformix Dynamic Server และก็ Postgresql ผ่านทางส่วนขยาย PostGIS ที่กล่าวไปแล้ว

ความนิยม

  • ตอนนี้มีคนหันมาใช้ Postgresql กันมากขึ้น เพราะ MySQL ฐานข้อมูลยอดนิยมตอนแรกถูก Sun ซื้อไปคนยังไม่ตระหนกตกใจเท่าไหร่ แต่พอ Oracle ไปซื้อ Sun แล้วได้ MySQL มาด้วย ผู้ใช้ก็เกิดอาการอกสั่นขวัญแขวนว่า MySQL จะฟรีหรือเสียเงินต่อด้วยความไม่มั่นใจใน Oracle ผู้ใช้ตามองค์กรก็ย้ายจาก MySQL ไป Postgresql กันมากขึ้น
  • Postgresql ที่เราใช้ฟรีกันทั่วไปพัฒนาโดยชุมชนที่ผมกล่าวไปแล้ว ถ้าเป็นรุ่น Enterprize ที่เทียบเคียงกับ Oracle, DB2, MS SQL Server พัฒนาโดย EnterprizeDB โดยการพัฒนาต่อยอดจาก Postgresql แต่เป็นโค๊ดปิด
  • ตัวอย่างก็คือ Redhat ที่กระโดดเข้าไปลงทุนใน EnterprizeDB ทั้งที่ก่อนหน้านี้โซลูชั่นของ Redhat ก็ผูกอยู่กับ MySQL แต่มีความเสี่ยงสูงเพราะ Oracle เป็นคู่แข่งโดยตรงกับ Redhat และที่ไม่ลืมคือ IBM เข้าไปลงทุนกับ EnterprizeDB ก่อน Redhat ซะอีก (ทั้งที่ IBM ก็มี DB2 อยู่แล้ว)

ขั้นตอนการติดตั้ง

  • สำหรับ Ubuntu Server ที่ใช้อยู่เป็น  64 บิต ตามธรรมเนียมของเซิฟเวอร์ดั้งเดิมคือไม่มีระบบ Desktop คำสั่งที่ใช้เป็น command line ทั้งหมด แต่หลังๆก็เห็น Centos Server ทำเป็น Desktop แต่ดูๆแล้วกราฟฟิคค่อนข้างเรียบง่าย เบาๆ ไม่กินแรมมาก เพราะต้องสงวนแรมให้กับ service/process ของเซิฟเวอร์
  • สำหรับ server ก็ยังเป็นเดี่ยวๆไม่มี cluster เพราะ user ยังไม่มาก ไม่เกิน 20 คน ตัว server รับงานได้ลื่นไหล

ติดตั้ง PostGIS/Postgresql

  • ใช้ putty ล็อกอิน เข้าไป server หรือไปนั่งหน้า server แล้วก็บรรเลงเลยครับ ตอนนี้เมเจอร์เวอร์ชั่นออก 9,1 แล้วแต่ใน Ubuntu Server ยังเป็น 8.4 อยู่
$sudo apt-get install postgresql-8.4 postgresql-contrib-8.4 postgresql-8.4-postgis
  • แก้ไขไฟล์ config ชื่อ pg_hba.conf
$sudo nano /etc/postgresql/8.4/main/pg_hba.conf
  • ระบุว่า IP Address สามารถเข้ามาใช้งาน server ได้ เพิ่มบรรทัดนี้เข้าไปโดยที่หมายเลข IP Address แก้ไขให้ตรงกับที่ใช้

host  all  postgres  192.168.5.0/24  md5

  • แก้ไขไฟล์ config ชื่อ postgresql.conf เพื่อให้การ remote จากเครื่องอื่นที่ใช้เช่น pgAdmin เข้าไปใช้ server ได้
$sudo nano /etc/postgresql/8.4/main/postgresql.conf
  • แก้ไขบรรทัดโดยการยกเลิก comment ที่บรรทัด  listen_address = ‘localhost’ ให้เป็น
listen_address = '*'
  • ทำการ restart service ของ postgresql
$sudo /etc/init.d/postgresql restart
  • หลังจากติดตั้ง postgresql แล้วจะมี user และ group ชื่อ postgres ขึ้นมาซึ่งจะเป็น user ผู้ดูแลระบบของ linux ที่มีสิทธิ์ในการแก้ไข database ทำการเปลี่ยน password ของ user ชื่อ postgres ให้กับ Ubuntu ก่อน โดยป้อนรหัสของไปสองครั้ง สมมติว่าเป็น ‘mypostgres143’
$sudo passwd postgres
  • เปลี่ยน user เป็น postgres เพื่อจะทำการแก้ไข password เพื่อให้สามารถล็อกอินไปแก้ไข database ได้ password ที่ใส่เข้าไปต้องให้ตรงกับ Ubuntu คือ ‘mypostgres143’
$sudo su postgres
$psql -c"ALTER user postgres WITH PASSWORD 'mypostgres143'"
  • สร้างเท็มเพลตของฐานข้อมูลที่เป็นต้นแบบสำหรับงาน GIS (ยังใช้ user ชื่อ postgres อยู่)

$createdb postgistemplate

  • ตอนนี้ฐานข้อมูลชือ postgistemplate ยังเป็นฐานข้อมูลต้นแบบสำหรับ postgresql ทั่วๆไปต่อไปจะปรับโครงสร้างให้รองรับงาน GIS
$createlang -d postgistemplate plpgsql
$psql -q -d postgistemplate -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql
$psql -d postgistemplate -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql
  • สร้าง Group role แล้วค่อยมอบสิทธิ์ให้ user ต่อไปพิมพ์คำว่า psql ตรงคอมมานด์ไลน์ เพื่อจะใช้ภาษา sql ได้เต็มๆ ตรงพร็อมต์จะกลายเป็น postgres# ผมสร้าง group role ที่ชื่อ gisgroup ขึ้นมา จำกัดสิทธิ์ให้สร้าง Database ได้เท่านั้น
#CREATE ROLE gisgroup NOSUPERUSER NOINHERIT CREATEDB NOCREATEROLE;
  • สร้าง user ชื่อ gis ด้วยพาสเวิร์ด ‘mypuppet’
#CREATE ROLE gis LOGIN PASSWORD 'mypuppet' NOINHERIT;
  • แล้วมอบอาญาสิทธิ์หรือบทบาทจาก gisgroup ให้ด้วยคำสั่ง GRANT ออกจากโหมด sql ด้วยคำสั่ง \q
#GRANT gisgroup TO gis;
#\q

มอบสิทธ์ 2 ตารางข้อมูล spatial ให้แก่ผู้ใช้ที่กำหนด

  • สองตารางข้อมูลที่สนันสนุนเรื่อง spatial ที่สร้างมาด้วยตัวส่วนขยาย PostGIS คือ geometry_columns และ spatial_ref_sys เราจะมอบสิทธิ์เต็มแก่ผู้ใช้ชื่อ gis (ไม่ลืมที่จะเปลี่ยน user อื่นเป็น postgres)
$psql -d postgistemplate -c "ALTER TABLE geometry_columns OWNER TO gis;"
$psql -d postgistemplate -c "ALTER TABLE spatial_ref_sys OWNER TO gis;"

สร้างฐานข้อมูลสำหรับใช้งานจริง

  • ใช้คำสั่งสร้างฐานข้อมูลจาก template ที่เราสร้างไว้แล้วชื่อ postgistemplate ฐานข้อมูลที่จะสร้างใหม่ชื่อ cpendb ให้สิทธิ์ผุ้ใช้ชื่อ gis

$createdb -T postgistemplate cpendb -O gis

ติดตั้งทูลส์สำหรับ Postgresql

  • ต่อไปเครื่องมือสำหรับรีโมตเข้าไปบริหารฐานข้อมูล Postgresql จากเครื่องคอมพิวเตอร์ของเรามีให้เลือกใช้แบบ stand alone หรือรันบนอินเทอร์เน็ต เบราเซอร์ก็มี เป็นของฟรี ตัวแรกก็ pgAdmin นั้นแจ๋วที่สุดมีให้ใช้ทั้งบนลีนุกซ์หรือทางฝั่งวินโดส์ หรือจะไปใช้ phpPgAdmin บน internet browser ก็ได้แล้วแต่ความชอบ
  • ถ้าเราใช้ ubuntu หรือ ลีนุกซ์ Mint เป็น desktop ติดตั้งง่ายๆด้วย $sudo apt-get install pgadmin3 ติดตั้งแล้วมาดูว่าจะเข้าไป access ฐานข้อมูล cpdb ที่ติดตั้งเข้าไปแล้วอย่างไร เปิดโปรแกรม pgAdmin3 ใช้เมนู File > Add Server…
pgAdmin3 สำหรับบริหารฐานข้อมูล Postgresql (บนวินโดส์)
  • สำหรับผู้ใช้ pgAdmin3 ส่วนใหญ่จะเป็นสิทธิ์ Admin กันอยู่แล้ว ดังนั้น Username ที่ใช้จะเป็น ‘postgres‘ ซึ่งมีสิทธิ์สูงสุด ใส่ password เป็น ‘mypostgres143‘ ส่วน Name เป็นชื่อ Server (ตั้งอะไรก็ได้ในสื่อความหมาย) ส่วน Host เป็นเลข IP ของเซิฟเวอร์ในวงแลนของเราอย่างของผมเป็น 192.168.5.111 เสร็จแค่นี้ถ้าไม่มีอะไรผิดพลาดจะเห็นฐานข้อมูล cpendb ที่เราสร้างไว้ก่อนแล้ว
pgAdmin3 เปิดเซิฟเวอร์ดูไฟล์ที่สร้างไว้แล้ว (บนลีนุกซ์)

ใช้ปลั๊กอินของ Quantum GIS แปลง shape file เข้าไปเก็บในฐานข้อมูล

  • การปั๊ม shape file เข้าไปเก็บในฐานข้อมูล PostGIS ใช้ SPIT ซึ่งเป็นปลั๊กอินของ Quantum GIS นั้นง่ายที่สุด เมื่อเปิด QGIS แล้วคลิกที่เมนู Database > SPIT > Import Shapefile to PostgreSQL ขั้นแรกสร้าง connection ไปที่ฐานข้อมูลPostGIS ก่อน ด้วยการคลิกที่ New
สร้าง connection ไปยังฐานข้อมูล PostGIS บน Server
  • ขั้นต่อไปให้พารามิเตอร์ที่จะติดต่อกับ Server ตั้งชื่อ Host ให้ตรงกับ IP Address ส่วนฐานข้อมูลคือ ‘cpendb’ ที่เราเพิ่งสร้างไป และ Username ‘gis’ Password ‘mypuppet’
ป้อนค่าพารามิเตอร์
  • ก่อนจะเพิ่ม Shape fiel คลิกที่ปุ่ม Connect ดูถ้าสำเร็จก็คลิกที่ Add เพื่อเพิ่ม Shape file เข้าไปเก็บในฐานข้อมูล PostGIS ที่เครื่อง Server สามารถ Add ได้ทีละหลายไฟล์ จากนั้นจะเป็นกระบวนการปั๊มข้อมูลเข้า server ถ้าข้อมูลไม่ใหญ่ก็ไม่ต้องรอนานมาก
เพิ่ม Shape file เข้าฐานข้อมูล
  • หลังการเพิ่ม Shape file ไปที่ฐานข้อมูล PostGIS แล้วเราจะไม่เห็นอะไรเพิ่มมาที่ Map ให้ไปคลิกที่ไอคอนของ QGIS คือ Add PostGIS Layer เลือกตารางที่ต้องการด้วยการ
เลือก Add Table จากฐานข้อมูล PostGIs
  • จะเห็นตารางข้อมูลที่เลือกเพิ่มมาแสดงบน Map ของ QGIS
Quantum GIS แสดงตารางข้อมูลของ PostGIS จาก Server

สรุปการใช้งาน PostGIS

  • เมื่อฐานข้อมูลถูกย้ายมาที่ PostGIS แล้ว ข้อดีคือสามารถให้ user หลายๆคนเข้ามา access ฐานข้อมูลเพื่อแก้ไข update Attribute หรือแม้กระทั่งใช้ทูลส์เช่น QGIS เข้ามาแก้รุปร่าง Vector ได้พร้อมๆกัน
  • เพียงแต่ต้องมีการจำกัดสิทธิ์ user สำหรับผู้ใช้บางคน ซึ่งการให้สิทธิ์ผู้ใช้บางคนมีสิทธิ์แก้ไขได้เฉพาะบางฟิลด์ ไม่มีสิทธิ์เพิ่มหรือลบ record ได้ เป็นเรื่องปลีกย่อยที่ผู้อ่านต้องไปศึกษาต่อครับ
  • สำหรับ PostGIS รุ่น 2.0 ที่จะออกในวันข้างหน้าก็จะสนับสนุนเรื่อง Geo Raster ก็เป็นรุ่นที่รอคอยครับว่าจะทำได้ดีขนาดไหน