MySQL Spatial Extensions step-by-step guide

เนื่องจากผมเพิ่งจะได้ทราบว่า MySQL มี spatial data type เค้ามีมาให้ตั้งแต่ version 4.1 แล้ว แต่ผมเพิ่งรู้ เชยจริง ๆ แฮ่...
จึงต้องเขียนเก็บไว้หน่อย กันลืมครับ

การที่มี spatial data type ทำให้เราสามารถใส่ข้อมูลตำแหน่ง (จุด, เส้น และพื้นที่)
เข้าไปใน field ของ MySQL เพื่อทำการประมวลผลโดย function ต่าง ๆ ได้

ยกตัวอย่างเช่น ถ้าเราต้องการค้นหาว่าข้อมูลตำแหน่งใดบ้าง อยู่ในพื้นที่ ที่เรากำหนด ก็สามารถใช้ SQL นี้ได้

{syntaxhighlighter brush: sql; gutter: false;}
select id, astext(g)
from geom
where within(g, geomfromtext('polygon((5 5,5 10,10 10,10 5,5 5))'))
{/syntaxhighlighter}

วิธีการใช้งาน MySQL Spatial Extension
การสร้าง Field
Spatial datatype มีทั้งหมด 4 ชนิดคือ
1. Point = จุด
2. Linestring = เส้น
3. Polygon = โพลีกอน (พื้นที่)
4. Geometry = ข้อ 1 - 3 รวมกัน

โดยเราสามารถกำหนดชนิดของ field ได้เหมือน ๆ กับชนิดข้อมูลปรกติ เช่น
{syntaxhighlighter brush: sql; gutter: false;}
create table geom (
id integer not null primary key auto_increment,
g geometry not null
)
{/syntaxhighlighter}

ตรง geometry เราจะใช้เป็น point, linestring หรือ polygon ก็สุดแล้วแต่ข้อมูลที่จะเก็บครับ
ถ้าต้องการให้เก็บได้หลายอย่างใน field เดียว ก็ต้องมาลงตัวที่ geometry นี่แหล่ะครับ

ว่าแต่... ทำไมถึงต้องกำหนด not null ให้กับ field ชนิด geometry? โปรดติดตามกันต่อไปครับ

การนำเข้าข้อมูล
เราต้องใช้ function พิเศษในการ Insert ข้อมูลเข้า Spatial Field
ณ ที่นี้ ผมจะใช้ GeomFromText เป็นหลักนะครับ เนื่องจากสะดวกดี

{syntaxhighlighter brush: sql; gutter: false;}
GeomFromText(WKT[, srid])
{/syntaxhighlighter}

Parameter List

  • WKT (Well-Known Text) คือ Mark-up language ที่ใช้ระบุข้อมูลแบบ Vector บนแผนที่ หรือระบบที่ต้องใช้การอ้างอิงตำแหน่ง
  • srid เป็น Optional ตอนนี้ไม่ต้องสนใจ... เนื่องจากผมยังไม่ได้อ่านเลย แฮ่

สามารถหาอ่าน function เพิ่มเติมได้ที่ MySQL Reference Manual : Creating Spatial Values

ถ้าเราต้องการใส่ค่าจุด (7, 8) เข้าไปให้ใช้ดังนี้
{syntaxhighlighter brush: sql; gutter: false;}
insert into geom (g)
values (GeomFromText('point(7 8)'))
{/syntaxhighlighter}

เส้นหละ
{syntaxhighlighter brush: sql; gutter: false;}
insert into geom (g)
values (GeomFromText('linestring(2 3,7 5,10 10)'))
{/syntaxhighlighter}

ถึงคราวของ Polygon
{syntaxhighlighter brush: sql; gutter: false;}
insert into geom (g)
values (GeomFromText('polygon((5 5,5 10,10 10,10 5,5 5))'))
{/syntaxhighlighter}
*โปรดสังเกตวงเล็บให้ดี

Reference

select id,x(g),y(g)
from geom
where within(g, geomfromtext('polygon((5 5,10 10,5 20,10 20,15 25,20 20,25 25,30 20,35 20,30 10,35 5,20 10,5 5))'))
or within(g, geomfromtext('polygon((300 200,300 250,250 250,350 300,250 250,400 250,400 200,300 200))'))