ค้นหาข้อมูลในบล็อก (Search in this blog)

Thursday, February 24, 2011

PostGIS: สร้าางตารางข้อมูลใหม่จาก ข้อมูลที่สืบค้น

บางครั้งเราต้องการสร้างตารางข้อมูลใหม่ (ชั้นข้อมูลเชิงตำแหน่งใหม่) ในฐานข้อมูลเชิงตำแหน่ง (Spatial Database) ตัวอย่างเช่น ชั้นข้อมูลเส้นทางคมนาคมถนน ซึ่งในฐานข้อมูลนั้นมีข้อมูลอรรถาธิบาย (Attribute) มากมายเกินความจำเป็น อาทิ ชื่อถนน ความกว้างช่องจราจร ความยาวของส่วนย่อย ประเภทพื้นผิว สภาพถนน โดยที่เราต้องการชั้นข้อมูลใหม่ที่มีเพียงแค่ชื่อถนน (road name: rdname) และพิกัดของแต่ละจุดเท่านั้น (geometry: the_geom) เราจะทำอย่างไร???
หลังจากศึกษาในคู่มือของ Postgis พบว่าโปรแกรมได้เตรียมฟังก์ชัน create table as สำหรับการตอบวัตถุประสงค์ในครั้งนี้ เรามาดูตัวอย่างการใช้งานกันเลยนะครับ

SQL syntax: create table table_name as select *** from *** where ***

ตัวอย่าง
create table road_name as
select rdname, the_geom from road

Wednesday, February 9, 2011

แก้สมการ Overdetermined เพียงกระพริบตา (ปี๊บๆ)

Ex: จากตัวอย่างหนังสือเรื่อง GIS & MCDA ของ จาเซ็ค หน้าที่ 211 เราต้องการหาค่าแลมดา (Lamda: L) โดยมีสมการเงื่อนไขดังนี้
L1 = 0.5(L2) + 0.3(L3)
L2 = 0.7(L1) + 0.7(L2)
L1 + L2 + L3 = 1
ปรากฏว่าในหนังสือได้คำตอบคือ L1 = 0.4, L2 = 0.3 และ L3 = 0.3 จะพบว่าค่าที่ได้นั้นใช้ได้ในบางเงื่อนไขเท่านั้น (คำตอบมีได้หลายคำตอบหรือคำตอบนั้นไม่ใช่ Unique solution) ทำให้ผลลัพธ์อาจผิดพลาดได้ ........... แล้วเราจะทำอย่างไีีร
ก่อนอื่นเรามาดูเงื่อนไขหรือข้อมูลที่เรามีก่อนดังนี้ครับ
1. เรามีตัวไม่ทราบค่า (Unknown) 3 ตัวคือค่าแลมดา L1, L2, L3
2. เรามีสมการอย่างน้่อย 3 สมการ (ตามตัวอย่างในหนังสือ)
3. จากการศึกษาพบว่า ในหนังสือนั้นขาดการนำเอาเงื่อนไขบางอย่างมาสร้างสมการคือ L3 = 0.3(L1) + 0.5(L2)
4. เมื่อเรามีสมการเพิ่มขึ้นจะพบว่า เงื่อนไขของระบบสมการนี้จะเข้าสู่เงื่อนไขของ Overdetermined system (จำนวนสมการมากกว่าจำนวนตัวไม่ทราบค่า)
คราวนี้เรามาดูวิธีแก้ระบบสมการเชิงเส้นที่ Overdetermined ด้วยเมทริกซ์ดังตัวอย่างดังนี้

Condition Equation:
L1 = 0.5(L2) + 0.3(L3)
L2 = 0.7(L1) + 0.7(L2)
L3 = 0.3(L1) + 0.5(L2)
L1 + L2 + L3 = 1
A = [-1 .5 .3; .7 -1 .7; .3 .5 -1; 1 1 1]
X = [a; b; c]
L = [0; 0; 0; 1]

V = AX+L
N = transpose (A)*A
U = transpose (A)*L
Normal Equation:
transpose (X)* transpose (N) + transpose (U) = 0
หรือ N*X + U = 0 หรือ N*X = -U
X = - inv(N) * U

ส่วนวิธีการคำนวณด้วย Matlab มีดังนี้
a = [-1 .5 .3; .7 -1 .7; .3 .5 -1; 1 1 1]
l = [0; 0; 0; 1]
x = a\l
คำตอบที่ได้คือ
x = [0.2941; 0.4118; 0.2941] หรือ
L1 = 0.2941
L2 = 0.4118
L3 = 0.2941