Trong tương lai, chúng em dự kiến sẽ hoàn thiện chương trình OpenGISServer để có thể hỗ trợ các dịch vụ trên nhiều nguồn dữ liệu khác nhau, đồng thời tận dụng khả năng khai thác các dịch vụ khác để chương trình ngày càng được mở rộng về quy mô.
Đồng thời, phát triển thêm một số sản phẩm GIS mang ý nghĩa thực tiễn hơn, và các sản phẩm này khai thác các dịch vụ do OpenGISServer hỗ trợ. Chẳng hạn như các sản phẩm về tra cứu thông tin bản đồ trực tuyến, từđiển địa lý,…
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
PHỤ LỤC - MySQL với phần mở rộng hỗ trợ cho OpenGIS
MySQL cài đặt các kiểu dữ liệu địa lý theo các đặc tả của tổ chức OGC. Các kiểu dữ liệu này được cài đặt trong MySQL thành các lớp được tổ chức như sau: • Geometry (Lớp trừu tượng) o Point (Lớp cụ thể) o Curve (Lớp trừu tượng) • LineString (Lớp cụ thể) o Line o LinearRing o Surface (Lớp trừu tượng) • Polygon (Lớp cụ thể) o GeometryCollection (Lớp cụ thể) • MultiPoint (Lớp cụ thể) • MultiCurve (Lớp trừu tượng) o MultiLineString (Lớp cụ thể) • MultiSurface (Lớp trừu tượng) o MultiPolygon (Lớp cụ thể)
Ta không thể tạo đối tượng cho các lớp trừu tượng mà chỉ có thể tạo đối tượng cho các lớp cụ thể.
Mô tả cụ thể về các lớp này
Lớp Geometry
Lớp này không có đối tượng thể hiện cụ thể, các thuộc tính của lớp này được áp dụng cho các đối tượng của các lớp kế thừa từ lớp này.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Các thuộc tính của Geometry:
• Loại (type): Mỗi đối tượng thuộc về 1 trong các loại trong cấu trúc phân cấp như trên.
• SRID (Spatial Reference Identifier): Giá trị này xác định hệ tọa độ không gian được dùng trong việc định nghĩa các điểm của đối tượng này. Trong MySQL thì giá trị này chỉ là 1 con số nguyên.
• Các điểm (coordinates) của đối tượng trong hệ tọa độ SRID nói trên, là 1 con số 8 byte. Một đối tượng không rỗng sẽ có ít nhất 1 cặp điểm (X,Y) . Các đối tượng rỗng không chứa điểm nào. Hệ thống điểm có liên quan với SRID. Chẳng hạn trong các hệ thống điểm khác nhau thì khoảng cách giữa 2 đối tượng có thể khác nhau khi mà các điểm của các đối tượng này giống nhau.
• Interior, boundary và exterior: Mỗi đối tượng sẽ chiếm 1 vị trí nào đó trong không gian, thuộc tính exterior của đối tượng dùng để chỉ vùng không gian không bị chiếm giữ bởi đối tượng. Thuộc tính interior là vùng không gian bị chiếm giữ bởi đối tượng còn boundary là phần giao nhau giữa interior và exterior.
MBR (Minimum Bounding Rectangle): đây là đối tượng bao bên ngoài đối
tượng này, được tạo thành bởi các điểm cực đại và cực tiểu của đối tượng ((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
• Thuộc tính simple hoặc non-simple
• Thuộc tính close hoặc not-close: cho biết các điểm của đối tượng có tạo thành 1 vòng khép kín không.
• Thuộc tính empty hoặc not-empty: Một đối tượng có thuộc tính empty
là 1 đối tượng không chứa điểm nào. Một đối tượng empty sẽ không được định nghĩa các thuộc tính exterior, interior và boundary.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
• Dimention: Thuộc tính dimention của một đối tượng có các giá trị là -1, 0, 1, 2.
o -1: Đối tượng này là 1 đối tượng rỗng
o 0: Đối tượng này không có chiều dài và không có diện tích o 1: Đối tượng này có chiều dài khác 0 và diện tích bằng 0. o 2: Đối tượng này có diện tích khác 0
o Đối tượng Point có dimension là 0
o Đối tượng LineString có dimension là 1
o Đối tượng Polygon có dimension là 2
o Các đối tượng MultiPoint, MultiLineString, MultiPolygon có
dimension bằng với dimension của các thành phần của nó.
Lớp Point
Point là đối tượng dùng để chỉ các địa điểm đơn giản trên hệ thống tọa độ. Ví dụ về Point: Trong 1 bản đồ thế giới với nhiều thành phố thì 1 Point có
thể được dùng biếu diễn 1 thành phố. Trong 1 bản đồ thành phố thì Point có thể biểu diễn 1 trạm xe buýt
Các thuộc tính của lớp Point
• Giá trị hoành độ điểm X
• Giá trị tung độđiểm Y
Lớp Curve
Thường được dùng để mô tả 1 mảng các điểm. Lớp này là lớp trừu tượng, các lớp con của Curve định nghĩa các loại quan hệ khác nhau giữa các điểm.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
• Mỗi Curve chứa 1 mảng các điểm
• Curve là đối tượng 1 chiều
• Một Curve thuộc loại simple nếu như nó không đi qua 1 điểm nào đó của nó 2 lần
• Một Curve là closed nếu nhưđiểm đầu trùng với điểm cuối
• Một Curve vừa simple và vừa closed là 1 Linearing
Lớp LineString
LineString là 1 Curve với mối quan hệ tuyến tính giữa các điểm
Ví dụ về LineString: Trong bản đồ thế giới, LineString có thể dùng để biểu diễn các con sông. Trong bản đồ thành phố, LineString có thể dùng để biểu diển các con đường
Thuộc tính của LineString
• Mỗi LineString gồm nhiều đoạn, mỗi đoạn là 1 cặp điểm
• Một LineString là 1 đoạn thẳng nếu nó chỉ chứa đúng 2 điểm
• Một LineString là 1 Linearing nếu như nó vừa closed, vừa simple
Lớp Surface
Surface là lớp trừu tượng, là 1 lớp 2 chiều. Lớp cài đặt cụ thể duy nhất của lớp này là Polygon.
Lớp Polygon
Trong bản đồ thì Polygon có thể được dùng để mô tả 1 khu rừng, 1 quận ….
Boundary của 1 Polygon gồm 1 tập các Linearing
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Một GeometryCollection là 1 tập gồm 1 hoặc nhiều đối tượng của bất kì lớp nào.
Các thành phần trong 1 Geometry Collection phải có cùng 1 hệ thống
điểm.
Lớp MultiPoint
Một MultiPoint là tập hợp các Point. Các điểm này có thể được nối với nhau theo bất kì thứ tự nào
Ví dụ về MultiPoint: Trong bản đồ thế giới, 1 MultiPoint có thể mô tả 1 tập hợp các hòn đảo nhỏ
Lớp MultiCurve: MultiCurve là 1 tập hợp các đối tượng Curve.
Lớp MultiLineString:
MultiLineString là 1 MultiCurve với các thành phần là các LineString
Ví dụ về MultiLineString: Trong bản đồ, MultiLineString có thể dùng để biểu diễn 1 hệ thống sông ngòi hoặc 1 hệ thống đường cao tốc.
Lớp MultiSurface: MultiSurface là 1 GeometryCollection với các thành phần
là các đối tượng Surface.
Lớp MultiPolygon
MultiPolygon là 1 MultiSurface với các đối tượng là các Polygon.
Ví dụ về MultiPolygon: Trong bản đồ thì MultiPolygon có thể dùng để biểu diễn 1 hệ thống các ao hồ.
Các Polygon của 1 MultiPolygon không được phép có các thuộc tính
interior giao nhau .
Định dạng dữ liệu không gian trong MySQL
Phần này mô tả các định dạng dữ liệu không gian được dùng để thể hiện các đối tượng địa lý trong các câu truy vấn.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Các loại định dạng này gồm:
Định dạng Well-Known Text (WKT)
Định dạng Well-Known Binary (WKB)
Các đối tượng địa lý được lưu trữ bên trong MySQL với định dạng khác với 2 loại trên.
Định dạng Well-Known Text (WKT)
Loại định dạng này được dùng để truyển các dữ liệu của đối tượng dưới dạng các chuỗi ASCII
Ví dụ về việc sử dụng WKT để mô tảđối tượng như sau: Một điểm: POINT(15 20)
Chú ý là không có dấu phẩy ngăn cách giữa các thành phần của 1 điếm
Một LineString gồm có 4 điểm: LINESTRING(0 0, 10 10, 20 25, 50 60)
Chú ý là giữa các điểm có dấu phẩy ngăn cách
Một Polygon với 1 vòng exterior và 1 vòng interior :
POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5)) Một MultiPoint gồm 3 điểm: MULTIPOINT(0 0, 20 20, 60 60) Một MultiLineString với 2 thành phần LineString MULTILINESTRING((10 10, 20 20), (15 15, 30 15)) Một MultiPolygon với 2 thành phần Polygon MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
Một GeometryCollection với 2 Point và 1 LineString
GEOMETRYCOLLECTION(POINT(10 10),POINT(30 30),LINESTRING(15 15,20 20))
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Định dạng Well-Known Binary (WKB)
Loại định dạng này được định nghĩa trong đặc tả của OpenGIS. Nó cũng được định nghĩa trong ISO ``SQL/MM Part 3: Spatial''
WKB được dùng để trao đổi dữ liệu của các đối tượng dưới dạng chuỗi binary.
WKB sử dụng 1 số nguyên không dấu 1 byte, dấu nguyên không dấu 4 byte, số thực 8 byte (theo định dạng IEEE 754).
Ví dụ như 1 giá trị WKB tương ứng với WKT POINT(1 1) gồm có 21 byte liên tiếp như dưới đây (mỗi byte được mô tả bằng 2 con số thập lục phân):
0101000000000000000000F03F000000000000F03F Chuỗi byte này có thểđược tách ra thành các phần nhau:
Trật tự byte : 01 Loại WKB : 01000000 X : 000000000000F03F Y : 000000000000F03F Các thành phần này có ý nghĩa như sau: • Trật tự byte có thể là 0 hoặc là 1 dùng để thể hiện cách lưu trữ là little- endian hay big-endian.
• Giá trị “loại WKB” là mã dùng để chỉ loại đối tượng địa lý,gốm có các giá trị từ 1 đến 7 tương ứng với các loại đối tượng Point,
LineString, Polygon, MultiPoint, MultiLineString,
MultiPolygon, và GeometryCollection.
• Hai thành phần X và Y là các số thập phân dùng để thể hiện 2 giá trị X và Y của đối tượng Point.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Các giá trị WKB dùng cho các đối tượng phức tạp sẽ có cấu trúc phức tạp, theo như mô tả của OpenGIS.
Tạo 1 cơ sở dữ liệu trong MySQL dùng cho dữ liệu không gian
Phần này mô tả các loại dữ liệu được dùng để thể hiện các loại dữ liệu không gian, và các hàm dùng cho việc tạo và truy vần dữ liệu không gian.
Các kiểu dữ liệu không gian trong MySQL:
MySQL có các kiểu dữ liệu tương ứng với các lớp trong OpenGIS. Một vài kiểu có thể lưu trữ 1 đối tượng địa lý đơn giản GEOMETRY POINT LINESTRING POLYGON GEOMETRY có thể lưu trữ bất cứ kiểu dữ liệu địa lý nào. Các kiểu dữ liệu
như: POINT, LINESTRING và POLYGON chỉ chứa các kiểu dữ liệu thuộc
cùng 1 loại nào đó. Các kiểu dữ liệu khác có thể lưu tập hợp của giá trị sau: MULTIPOINT MULTILINESTRING MULTIPOLYGON GEOMETRYCOLLECTION GEOMETRYCOLLECTION có thể lưu tập hợp đối tượng của bất cứ kiểu dữ liệu nào.Các loại tập hợp khác như MULTIPOINT, MULTILINESTRING,MULTIPOLYGON và GEOMETRYCOLLECTION chỉ lưu được các đối tượng thuộc các kiểu dữ liệu tương ứng.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Tạo các giá trị không gian
Phần này mô tả cách dùng các hàm của Well-Known Text và Well-Known
Binary để tạo ra các giá trị không gian theo chuẩn OpenGIS.
Tạo các giá trị địa lý bằng các hàm của WKT
MySQL có các hàm nhận tham số truyền vào thuộc dạng Well-Known Text
và có thể có thêm tham số SRID. Chúng trả vềđối tượng địa lý tương ứng. Hàm GeoFromText() nhận tham số đầu vào là 1 chuỗi WKT của bất kì
loại đối tượng nào.
Hàm GeomFromText(wkt[,srid]) , GeometryFromText(wkt[,srid])
Tạo đối tượng địa lý bất kì với giá trị WKT và SRID truyền vào. Hàm LineFromText(wkt[,srid]) , LineStringFromText(wkt[,srid])
Tạo đối tượng LINESTRING với giá trị WKT và SRID truyền vào. HàmMLineFromText(wkt[,srid]),
MultiLineStringFromText(wkt[,srid])
Tạo đối tượng MULTILINESTRING với giá trị WKT và SRID truyền
vào.
Hàm MPointFromText(wkt[,srid]) , MultiPointFromText(wkt[,srid])
Tạo đối tượng MULTIPOINT với giá trị WKT và SRID truyền vào. Hàm MPolyFromText(wkt[,srid]) , MultiPolygonFromText(wkt[,srid])
Tạo đối tượng MULTIPOLYGON với giá trị WKT và SRID truyền
vào
Hàm PointFromText(wkt[,srid])
Tạo đối tượng POINT với giá trị WKT và SRID truyền vào Hàm PolyFromText(wkt[,srid]) , PolygonFromText(wkt[,srid])
Tạo đối tượng POLYGON với giá trị WKT và SRID truyền
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Hàm GeomCollFromWKB(wkb[,srid]) ,
GeometryCollectionFromWKB(wkb[,srid]). Tạo đối tượng
GEOMETRYCOLLECTION với giá trị WKT và SRID truyền vào.
Hàm GeomFromWKB(wkb[,srid]) , GeometryFromWKB(wkb[,srid]).
Tạo đối tượng địa lý bất kì với giá trị WKT và SRID truyền vào.
Hàm LineFromWKB(wkb[,srid]) , LineStringFromWKB(wkb[,srid]).
Tạo đối tượng LINESTRING với giá trị WKT và SRID truyền vào. Hàm MLineFromWKB(wkb[,srid]) ,
MultiLineStringFromWKB(wkb[,srid]). Tạo đối tượng
MULTILINESTRING với giá trị WKT và SRID truyền vào.
Hàm MPointFromWKB(wkb[,srid]) ,
MultiPointFromWKB(wkb[,srid]).Tạo đối tượng MULTIPOINT với giá trị WKT và SRID truyền vào.
Hàm MPolyFromWKB(wkb[,srid]) ,
MultiPolygonFromWKB(wkb[,srid]).Tạo đối tượng MULTIPOLYGON với giá trị WKT và SRID truyền vào.
Hàm PointFromWKB(wkb[,srid]).Tạo đối tượng POINT với giá trị
WKT và SRID truyền vào.
Hàm PolyFromWKB(wkb[,srid]) , PolygonFromWKB(wkb[,srid]). Tạo đối tượng POLYGON với giá trị WKT và SRID truyền vào.
Tạo các cột lưu dữ liệu không gian
Dùng lệnh CREATE TABLE để tạo các bảng với các cột lưu dữ liệu không gian
mysql> CREATE TABLE geom (g GEOMETRY); Query OK, 0 rows affected (0.02 sec)
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Dùng lệnh ALTER TABLE để thêm hoặc xóa 1 cột trong 1 bảng có sẵn mysql> ALTER TABLE geom ADD pt POINT;
Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE geom DROP pt;
Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
Thêm dữ liệu vào các cột lưu trữ thông tin không gian
Dữ liệu được lưu trữ trong các cột này dưới dạng riêng bên trong MySQL nhưng bạn có thể tạo ra định dạng riêng này từđịnh dạng WKB hoặc WKT. Các ví dụ dưới đây mô tả cách thêm dữ liệu không gian vào bảng bằng cách chuyển từ WKT sang định dạng riêng trong MySQL.
Ta có thể thực hiện việc chuyển đổi trực tiếp bằng câu lệnh INSERT INSERT INTO geom VALUES (GeomFromText('POINT(1 1)')); SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (GeomFromText(@g));
Hoặc có thể thực hiện việc chuyển đổi trước khi thực hiện câu lệnh INSERT SET @g = GeomFromText('POINT(1 1)');
INSERT INTO geom VALUES (@g);
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (GeomFromText(@g));
Các ví dụ dưới đây thêm các kiểu dữ liệu phức tạp hơn vào các bảng
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (GeomFromText(@g));
SET @g ='GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
Các ví dụở trên đều sử dụng hàm GeoFromText() để tạo các đối tượng đại lý, các ví dụ dưới đây sẽ dùng các hàm riêng biệt của từng loại.
SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (PointFromText(@g)); SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (LineStringFromText(@g));
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,
5 5))';
INSERT INTO geom VALUES (PolygonFromText(@g)); SET @g =
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomCollFromText(@g));
Có thể sử dụng định dạng WKB như sau: Thêm 1 POINT(1 1) vào bảng mysql> INSERT INTO geom VALUES
->
(GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));
Lấy dữ liệu không gian
Các đối tượng địa lý được lưu trữ có thể được lấy ra bằng định dạng riêng bên trong MySQL nhưng bạn có thể chuyển chúng sang các định dạng WKT
hoặc WKB.
Lấy dữ liệu theo định dạng WKT. Dùng hàm AsText() để chuyển từ định
dạng riêng bên trong MySQL thành định dạng WKT.
mysql> SELECT AsText(g) FROM geom; +---+
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS +---+ | POINT(1 1) | | LINESTRING(0 0,1 1,2 2) | +---+ Lấy dữ liệu theo định dạng WKB SELECT AsBinary(g) FROM geom;
Phân tích thông tin không gian
Các hàm dùng để truy vấn dữ liệu không gian có thể chia thành các 4 nhóm: Các hàm dùng để chuyển đổi kiểu định dạng của đối tượng địa lý
Các hàm dùng để truy xuất đến các thuộc tính về chất lượng và số lượng của đối tượng.
Các hàm mô tả quan hệ giữa 2 đối tượng địa lý.
Các hàm dùng để tạo ra đối tượng dựa trên đối tượng khác
Các hàm dùng để chuyển đổi kiểu định dạng của đối tượng địa lý
AsBinary(g): Chuyển từđịnh dạng riêng bên trong thành WKB và trả về kết quả dạng binary.
AsText(g):Chuyển từ định dạng riêng bên trong thành WKT và trả về kết