Làm thế nào để bạn xử lý các tính năng 3d một phần trong PostGIS?


10

Chúng tôi có các tính năng từ dữ liệu khảo sát có chứa thông tin 3d một phần.

Ví dụ phổ biến nhất sẽ là LineString 2D đại diện cho một con đường, chứa thông tin độ cao ở một số điểm nhất định nơi nó được khảo sát. Các ví dụ khác bao gồm hình dạng mái - MultiLineString trong đó một số điểm chính có độ cao được chỉ định từ kế hoạch xây dựng, nhưng không phải tất cả.

Sử dụng PostGIS, mô hình dữ liệu nào bạn muốn giới thiệu để lưu trữ loại thông tin này, để giữ cho nó có thể truy cập càng tốt, mà không làm mất hoặc tạo thông tin nội suy?


2D LineString đại diện cho một con đường có chứa độ cao - cũng là 3D - sử dụng ST_Force_3D cho dữ liệu của bạn - postgis.refraction.net/documentation/manual-1.5SVN/iêu
Mapperz

Tọa độ 0 z không đúng và không biểu thị cùng giá trị với nguồn dữ liệu. ST_Force_3D sẽ không hoạt động đối với chúng tôi. Ý tưởng là để có thể có một ánh xạ hai chiều chính xác giữa nguồn dữ liệu và cơ sở dữ liệu của chúng tôi.
Relet

Câu trả lời:


2

Bạn có thể lưu trữ các giá trị Z không được đo là 'nan'::float8. Ví dụ:

SELECT ST_AsText(g), ST_X(g), ST_Y(g), ST_Z(g), ST_Z(g) <> 'nan'::float8 AS has_z
FROM (
  SELECT ST_MakePoint(1, 2, 'nan'::float8) AS g
  UNION SELECT ST_MakePoint(4, 5, 6) AS g
) AS f;

       st_astext       | st_x | st_y | st_z | has_z
-----------------------+------+------+------+-------
 POINT Z (1 2 1.#QNAN) |    1 |    2 |  NaN | f
 POINT Z (4 5 6)       |    4 |    5 |    6 | t
(2 rows)

Tuy nhiên, điều này có thể khiến bạn gặp rắc rối vì các giá trị NaN không phải lúc nào cũng được kiểm tra hoặc xử lý bởi các nhà phát triển phần mềm. Ví dụ, PostGIS không thể phân tích phiên bản WKT ở trên

SELECT 'POINT Z (1 2 1.#QNAN)'::geometry;

ERROR:  parse error - invalid geometry
LINE 1: SELECT 'POINT Z (1 2 1.#QNAN)'::geometry;
               ^
HINT:  "POINT Z (1 2 1.#Q" <-- parse error at position 17 within geometry

1

Tạo một cột hình học thứ cấp có ba chiều để giữ các đỉnh của dòng có giá trị ba (ba). Để lược đồ này hoạt động, các giả định sau đây được giả định:

  • linestring là hợp lệ, nó không chứa các điểm trùng lặp
  • hình học là linestrings
  • phải có ít nhất hai đỉnh có tọa độ 3d thành một hình học nhất định để có thể lưu trữ vào cột hình học thứ cấp
  • một kích hoạt sẽ điền vào cột hình học thứ cấp để giữ cho nó ACID.

Hình dạng hợp lệ phải đủ để không cho phép các điểm trùng lặp trong dòng và không tự giao nhau. Vì vậy, mỗi tọa độ sẽ hoạt động giống như một khóa nguyên thủy để xác định đỉnh trong hình học nguồn.

Điều này cũng đúng từ mô hình quan hệ:

  • sẽ không có sự chuyển hướng, đỉnh không có thông tin không xuất hiện trong cột hình học thứ cấp
  • những thay đổi trên dữ liệu nguồn sẽ được truyền đến dữ liệu dẫn xuất bởi trình kích hoạt.
  • chỉ thông tin được coi là sự thật sẽ được lưu trữ trong cơ sở dữ liệu, không có dữ liệu nhân tạo nào được tạo.

Đối với trường hợp đa tuyến, mọi thứ có thể khó hơn một chút vì bây giờ phải có một bảng bổ sung với khóa chính tổng hợp là:

  • Rowid (gid, một định danh duy nhất) của hình học nguồn
  • vị trí hình họcN bên trong MultiGeometry đã cho phải được kiểm tra bên trong khoảng [1-N]
  • một chìa khóa cho bảng Rowid liên quan (gid)
  • một chức năng kích hoạt / kiểm tra để đảm bảo khoảng thời gian là hợp lệ

Khóa chính ở trên sẽ ngăn chèn các chỉ mục hình học trùng lặp cho một hình học nhất định. Việc kích hoạt / kiểm tra sẽ ngăn chặn các chỉ mục không hợp lệ. Ngoài ra các hàng ở đây phải từ dữ liệu nguồn được cung cấp khóa ngoại. Tất cả các quy tắc trước đây được áp dụng.

Một sự đơn giản hóa sẽ là việc sử dụng trên cột bổ sung nhưng không phải là dạng hình học mà là cùng loại giá trị Z được khai báo là mảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.