2009-08-17 29 views
5

Tôi có một cơ sở dữ liệu không gian được kích hoạt (DB2, trong trường hợp này). Tôi cần phải lưu trữ một số lượng lớn các ô vuông trong một bảng. Loại dữ liệu SQL không gian chuẩn nào phù hợp nhất?SQL không gian: Kiểu dữ liệu thích hợp nhất cho một hình vuông?

Tôi đoán tôi có thể sử dụng một ST_polygon, nhưng có lẽ đó là một loại chuyên biệt hơn mà sẽ cung cấp hiệu suất

  • tốt hơn
  • dữ liệu tốt hơn đảm bảo (Tôi muốn bắt nó như là một lỗi nếu ai đó nơi để lưu trữ một giá trị không vuông trong cột cụ thể)

tôi đã cố gắng để tìm một ST_rectangle hoặc ST_squar e loại, nhưng chúng dường như không tồn tại (?)

Trong khi tôi đang làm việc với DB2, tôi cũng quan tâm đến các giải pháp không hoạt động trên DB2, miễn là chúng tuân thủ các tiêu chuẩn .

Trả lời

1

Trong DB2, nó cũng là Đa giác. Có vẻ như bạn đang lưu trữ lưới, do đó, một kiểm tra nhanh chóng có thể là nếu ST_ENVELOPE (hình học) == hình học sau đó bạn có một hình vuông

Mã này là từ

DB2's documentation

SET CURRENT PATH = CURRENT PATH, db2gse; 
CREATE TABLE sample_geoms (id INTEGER, geometry ST_Geometry); 

INSERT INTO sample_geoms VALUES 
(1, ST_Geometry(ST_Point('point EMPTY',0))); 

INSERT INTO sample_geoms VALUES 
(2, ST_Geometry(ST_Point('point zm (10 10 16 30)' ,0))); 

INSERT INTO sample_geoms VALUES 
(3, ST_Geometry(ST_Multipoint('multipoint m (10 10 5, 50 10 6, 
     10 30 8)' ,0))); 

INSERT INTO sample_geoms VALUES 
(4, ST_Geometry(ST_Linestring('linestring (10 10, 20 10)',0))); 

INSERT INTO sample_geoms VALUES 
(5, ST_Geometry(ST_Polygon('polygon((40 120, 90 120, 90 150, 
     40 150, 40 120))',0))); 


SELECT id, CAST(ST_AsText(ST_Envelope(geometry)) as VARCHAR(160)) Envelope 
FROM sample_geoms; 

Kết quả:

ID   ENVELOPE 
----------- --------------------------------------------------------------- 
     1  - 

     2  POLYGON ((9 9, 11 9, 11 11, 9 11, 9 9)) 

     3  POLYGON ((10 10, 50 10, 50 30, 10 30, 10 10)) 

     4  POLYGON ((10 9, 20 9, 20 11, 10 11, 10 9)) 

     5  POLYGON ((40 120, 90 120, 90 150, 40 150, 40 120)) 

Xem ID = 5? POLYGON cuối cùng == ST_ENVELOPE (hình học)

1

Bạn có thể đang tìm kiếm ST_Envelope - Tôi không biết chắc chắn về DB2 nhưng nó là một phần của tiêu chuẩn OGC. Bất kỳ đường thẳng hoặc không theo chiều dọc hoặc đa giác nào sẽ tạo ra một hình chữ nhật thông qua chức năng này, lưu trữ các tọa độ thường là các phao.

+1

Nhưng ST_envolope là một chức năng, không phải là một loại, như xa như tôi có thể nhìn thấy? –

+0

Xin lỗi, tôi đã xóa rất nhiều điều vô nghĩa phức tạp vừa nãy. Các điểm được lưu trữ như là một chuỗi các float4 trong Postgis, không chắc chắn về DB2 nhưng nó phải gần như giống nhau, hoặc có thể là một trong các kiểu db2/Oracle 'number'. Tôi đoán rằng tất cả các hình chữ nhật chỉ là tọa độ được lưu trữ như một số loại float cơ bản, với chức năng địa lý được kích hoạt thông qua lập chỉ mục thông minh cho các truy vấn không gian chung. – unmounted

+1

Tro là chính xác. ST_ENVELOPE là một hàm trả về một ST_POLYGON; ST_ENVELOPE không phải là một loại. Tối ưu hóa "float" là đặc trưng cho PostGIS. –

4

Ngay cả khi dữ liệu của bạn đại diện cho hình chữ nhật hoặc hình vuông, bạn vẫn sẽ cần phải sử dụng loại ST_POLYGON. Tuy nhiên, khi bạn thực hiện truy vấn đối với dữ liệu, bạn có thể sử dụng bộ lọc đơn hàng đầu tiên như ST_EnvIntersects.

Thông thường, cơ sở dữ liệu không gian sẽ so sánh các phong bì (ví dụ: hình chữ nhật chứa đa giác) cho giao lộ. Sau đó, nó thực hiện tính toán giao điểm đa giác-đa giác đắt tiền hơn. Trong trường hợp này, vì đa giác của bạn bằng với phong bì, bạn có thể bỏ qua bước đắt hơn thứ hai.

Theo như xác nhận dữ liệu, bạn có thể thêm một kích hoạt cơ sở dữ liệu để kiểm tra ST_EQUALS (ST_ENVELOPE (Geom), Geom) = 1.

Các vấn đề liên quan