12/08/2018, 14:55

Làm việc với kiểu dữ liệu không gian trong mysql

Trong nhiều ứng dụng, ta phải làm việc với các dữ liệu địa lý, các dữ liệu thuộc hệ thống thông tin địa lý. Mysql cung cấp cho chúng ta một kiểu dữ liệu để biểu diễn dữ liệu loại này: Spatial 1, Giới thiệu Mysql có các kiểu dữ liệu tương ứng với các lớp của OpenGIS. Một số biểu diễn các giá trị ...

Trong nhiều ứng dụng, ta phải làm việc với các dữ liệu địa lý, các dữ liệu thuộc hệ thống thông tin địa lý. Mysql cung cấp cho chúng ta một kiểu dữ liệu để biểu diễn dữ liệu loại này: Spatial 1, Giới thiệu Mysql có các kiểu dữ liệu tương ứng với các lớp của OpenGIS. Một số biểu diễn các giá trị hình học đơn:

  • GEOMETRY
  • POINT
  • LINESTRING
  • POLYGON Kiểu Geometry có thể lưu trữ giá trị hình học của bất kì loại nào kể trên. Những kiểu giá trị khác: Point, LineString, Polygon chỉ lưu trữ kiểu giá trị cụ thể thuộc loại đó. Và các kiểu giá trị khác để lưu trữ một tập hợp:
  • MULTIPOINT
  • MULTILINESTRING
  • MULTIPOLYGON
  • GEOMETRYCOLLECTION Tương tự, GEOMETRYCOLLECTION có thể lưu trữ một tập hợp thuộc bất kì loại nào. Còn các loại khác chỉ lưu trữ dữ liệu cụ thể thuộc loại đó

2, Hệ thống lớp GEOMETRY

Hệ thống lớp GEOMETRY được biểu diễn theo sơ đồ dưới đây:

  • Geometry (noninstantiable)
    • Point (instantiable)
    • Curve (noninstantiable) + LineString (instantiable) _ Line _ LinearRing
    • Surface (noninstantiable) + Polygon (instantiable)
    • GeometryCollection (instantiable) + MultiPoint (instantiable) + MultiCurve (noninstantiable) _ MultiLineString (instantiable) + MultiSurface (noninstantiable) _ MultiPolygon (instantiable)

Không thể tạo những đối tượng thuộc những lớp noninstanceable mà chỉ tạo được các đối tượng thuộc những lớp instanceable. Tất cả các lớp có các thuộc tính và các lớp instance có thể có các assertion. Geometry là lớp cơ sở, nó là một lớp trìu tượng. Những lớp con thể hiện của Geometry biểu diễn các đối tượng 0, ,1, 2 chiều trong không gian tọa độ 2 chiều. Lớp cơ sở Geometry có các lớp con là Point, Curve, Surface, và GeometryCollection:

  • Point: Đại diện cho những đối tượng vô hướng
  • Curve: Đại diện cho những đối tượng 1 chiều, có 1 lớp con là LineString có 2 lớp con là Line và LinearRing
  • Surface: Được thiết kế cho các đối tượng 2 chiều, có 1 lớp con là Polygon
  • GeometryCollection: Gồm các lớp chứa các đối tượng hình học 0, 1 ,2 chiều là: MultiPoint, MultiLineString, và MultiPolygon

a, Geometry Class Geometry là lớp root của hệ thống, nó là 1 lớp noninstanceable với danh sách các thuộc tính dưới đây:

  • type: mỗi geometry thuộc về một lớp instanceable nào đó trong hệ thống phân cấp
  • SRID: hệ quy chiếu cho đối tượng hình học
  • coordinates: tọa độ của đối tượng được xác định theo hệ quy chiếu bên trên
  • interior, boundary, và exterior: mỗi một geometry chiếm một vị trí nào đó trong không gian. exterior là tất cả không gian không bị geometry này chiếm hữu, interior là không gian bị chiếm hữu bởi geometry này, boundary là bề mặt giữa interior và exterior
  • MBR(minimum bounding rectangle): là hình chữ nhật nhỏ nhất bao ngoài geometry được hình thành bởi các điểm: ((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
  • dimension: một geometry có thể các các chiều: -1, 0, 1, 2
    • -1 cho một geometry rỗng.
    • 0 cho một geometry với no length và no area.
    • 1 cho một geometry với nonzero length và zero area.
    • 2 cho một geometry với nonzero area.

Các đối tượng Point có chiều là 0. LineString có chiều là 1, Polygon là 2...

b, Point Class Một Point là một geometry đại diện cho một vị trí đơn lẻ trong không gian tọa độ. Ví dụ: Trong một bản đồ quy mô lớn của thế giới với nhiều thành phố, mỗi một đối tượng Point có thể đại diện cho 1 thành phố, trong bản đồ thành phố Point có thể đại diện cho một bus stop Các thuộc tính của Point:

  • X- giá trị tung độ.
  • Y-giá trị hoành độ.
  • Point được định nghĩa như một geometry vô hướng.
  • Boundary của Point là rỗng.

c, Curve Class

Là geometry một chiều, được sử dụng để đại diện cho một tập hợp các điểm, Curve là một lớp noninstanceable Các thuộc tính:

  • Một curve có các tọa độ cho các điểm của nó
  • Một curve được định nghĩa là một geometry 1 chiều
  • Một curve là simple nếu nó không đi qua một điểm nào đó của nó lần thứ 2, trừ trường hợp điểm bắt đầu chính là điểm cuối
  • Một curve là closed nếu điểm bắt đầu chính là điểm kết thúc
  • Một curve vừa là simple vừa là closed chính là một LinearRing

d, Surface Class Surface Class là một geometry 2 chiều, là một lớp noninstanceable, nó chỉ có 1 lớp instanceable duy nhất là Polygon. Một Polygon là một đa giác, là vùng không gian giới hạn bởi 1 đường boundary ngoài, exterior, không hoặc nhiều interior boundaries. Trong bản đồ khu vực, một Polygon có thể là 1 khu rừng, 1 quận hoặc một khu dân cư.

3, Using spatial data

a, Supported Spatial Data Formats Có 2 cách để biểu diễn một đối tượng geometry trong truy vấn:

  • Well-Known Text (WKT) format: biểu diễn dữ liệu hình học dưới dạng ASCII Ví dụ: Một Point:
    POINT(15 20)
    
    mysql> SELECT ST_X(Point(15, 20));
    +---------------------+
    | ST_X(POINT(15, 20)) |
    +---------------------+
    |                  15 |
    +---------------------+

    mysql> SELECT ST_X(ST_GeomFromText('POINT(15 20)'));
    +---------------------------------------+
    | ST_X(ST_GeomFromText('POINT(15 20)')) |
    +---------------------------------------+
    |                                    15 |
    +---------------------------------------+

Một LineString với 4 điểm:

    LINESTRING(0 0, 10 10, 20 25, 50 60)

Một Polygon với 1 vòng ngoài và 1 vòng trong:

    POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))

Một MultiPoint với 3 Point:

    MULTIPOINT(0 0, 20 20, 60 60)
  • Well-Known Binary (WKB) format: biểu diễn dữ liệu hình học dưới dạng nhị phân Ví dụ:
    0101000000000000000000F03F000000000000F03F
    Cụ thể:
    Byte order:   01
    WKB type:     01000000
    X coordinate: 000000000000F03F
    Y coordinate: 000000000000F03F

b, Handle Spatial Columns Để tạo một bảng trong Mysql với 1 cột spatial:

    CREATE TABLE geom (g GEOMETRY);

Để thêm hoặc xóa một cột spatial trong một bảng đang tồn tại:

    ALTER TABLE geom ADD pt POINT;
    ALTER TABLE geom DROP pt;

Giá trị được lưu trữ trong database theo format internal của geometry, nhưng ta có thể convert chúng sang các format khác như WKT hay WKB. Để insert giá trị vào trong một cột spatial bằng cách convert 1 giá trị WKT thành format internal của geometry:

    INSERT INTO geom VALUES (ST_GeomFromText('POINT(1 1)'));

    SET @g = 'POINT(1 1)';
    INSERT INTO geom VALUES (ST_GeomFromText(@g));
    
    SET @g = ST_GeomFromText('POINT(1 1)');
    INSERT INTO geom VALUES (@g);
    
    SET @g = 'LINESTRING(0 0,1 1,2 2)';
    INSERT INTO geom VALUES (ST_GeomFromText(@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 (ST_GeomFromText(@g));

    SET @g =
    'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
    INSERT INTO geom VALUES (ST_GeomFromText(@g));
    
    SET @g = 'POINT(1 1)';
    INSERT INTO geom VALUES (ST_PointFromText(@g));

    SET @g = 'LINESTRING(0 0,1 1,2 2)';
    INSERT INTO geom VALUES (ST_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 (ST_PolygonFromText(@g));

    SET @g =
    'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
    INSERT INTO geom VALUES (ST_GeomCollFromText(@g));

Convert từ giá trị WKB:

    mysql> INSERT INTO geom VALUES
       (ST_GeomFromWKB(X'0101000000000000000000F03F000000000000F03F'));

Giá trị geometry được lưu trữ có thể được fetch theo đúng format internal của nó. Bạn cũng có thể convert đến WKT hoặc WKB:

    CREATE TABLE geom2 (g GEOMETRY) SELECT g FROM geom;

    SELECT ST_AsText(g) FROM geom;

    SELECT ST_AsBinary(g) FROM geom;

Trên đây là những khái niệm cơ bản khi làm quen với kiểu dữ liệu không gian trong Mysql. Ở bài tiếp theo chúng ta sẽ tìm hiểu về các function và operator của kiểu dữ liệu này! Nguồn: https://dev.mysql.com/doc/refman/5.7/en/spatial-extensions.html

0