Mục đích của PostGIS trên PostgreSQL là gì?


49

PostgreSQL đã hỗ trợ các kiểu dữ liệu không gian, toán tử và lập chỉ mục.

PostGIS cung cấp chính xác điều gì khiến nó cần thiết để tồn tại như một phần mở rộng cho PostgreSQL?

Tại sao tất cả chúng ta không chỉ sử dụng chức năng không gian của PostgreSQL?


2
Đó là PostGIS cung cấp các loại dữ liệu không gian, toán tử và lập chỉ mục đó ...
DPSSpatial

5
Không, anh ấy đang nói về các loại hình học PostgreSQL bản địa.
Evan Carroll

4
Câu trả lời ngắn gọn là PostGIS (hiện tại) có chức năng gấp 10 lần so với các loại PGQuery. Câu trả lời dài, bao gồm câu hỏi "tại sao phát triển các loại mới, và không chỉ cải thiện các loại đã có" được giải quyết dưới đây.
Paul Ramsey

1
Điều tương tự cũng xảy ra với khung công tác Java Spring. Java có lỗi / thiếu tính năng. Spring đã sửa nhiều lỗi Java và thêm các tính năng hữu ích. Java đã sao chép các bản sửa lỗi + tính năng của Spring. Mọi người sau đó hỏi tại sao mùa xuân tồn tại ...
Neil McGuigan

Câu trả lời:


86

Nếu bạn làm lại vũ trụ vào đầu năm 2001, và không chỉ để cho các nhà phát minh của PostGIS nhìn thấy tương lai, mà còn để PSC của PGQuery nhìn thấy tương lai, có lẽ PostGIS sẽ là một loạt các bản vá trên PGQuery. Nhưng ở mức tối thiểu, nếu chúng ta đã bắt đầu như các bản vá cho cốt lõi, điều đầu tiên chúng ta sẽ phải đối mặt là:

  • Các khu vực cốt lõi của PGS không hỗ trợ các lỗ hổng, nhưng mô hình GIS thực sự muốn các lỗ hổng, chúng ta có thể thay đổi điều đó không?

Và cốt lõi PGQuery đã nói: "không, tất nhiên là không, các khu vực có một ngữ nghĩa được hiểu rõ và chúng ta không thể thực hiện các thay đổi không tương thích ngược như thế".

Với tư cách là nhà phát triển không cốt lõi, PostGIS đã có thể loại bỏ các bản phát hành hàng tháng và 6 hàng tháng trong một số năm trong khi lõi PGQuery được tích hợp cùng với các bản phát hành hàng năm và dài hơn. Chúng tôi cũng có thể thêm bất kỳ tính năng nào chúng tôi muốn, bất cứ khi nào, vì chúng tôi đã có các quyền trong dự án của mình, nhưng để có được các quyền cam kết trong PGQuery mất một thời gian rất dài.

Vào thời điểm PostGIS đang chứng minh đủ giá trị bên ngoài mà lõi PGQuery nhìn qua và tự nói với mình "huh, điều đó thật tuyệt khi có lõi như một tính năng bổ sung", đã có rất nhiều mã theo tiêu chuẩn và kiểu khác nhau như vậy từ PGS (không đề cập đến theo giấy phép không tương thích) rằng ý tưởng sáp nhập là không thực sự có thể.

Thay vào đó, PostGIS đã trở thành ví dụ điển hình của Phần mở rộng phức tạp thực sự lớn giúp PGS vẫn duy trì mô đun và có thể mở rộng. "Làm thế nào điều này sẽ ảnh hưởng đến một cái gì đó như PostGIS" là một câu hỏi thường được đặt ra khi lõi PGQuery đánh giá một số thay đổi. Đây cũng là một điều tốt, có lẽ không hoàn hảo như PostGIS là một phần cốt lõi, nhưng đủ tốt.

Có những lý do khác, như danh sách dài các phụ thuộc mà lõi PGQuery sẽ ghét phải thấy, tính nhất quán của mã thường thấp hơn và độ sạch API mà họ sẽ không muốn cải thiện và tiếp tục. Ngay cả khi thụ thai, PostGIS là một quả bóng tóc quá lớn để PGS nuốt một miếng.


Ngoài ra ... PostGIS là C ++. Đây sẽ là một showstopper cho một PostgreSQL merge.Whether hay không nó nên được. Phụ thuộc cũng sẽ dừng nó hoàn toàn - GDAL? Hà! Tôi thậm chí không thể có được cốt lõi để đồng ý phụ thuộc vào Perl> 5.8.0. Tốc độ phát triển chậm ngay cả khi bạn có quyền cam kết; ủy viên không chỉ được miễn phí cho tất cả các công cụ xô đẩy trên cây, họ phải trải qua quá trình xem xét mã và nhận được những thay đổi lớn trong vài tháng hoặc nhiều năm. Có những lợi ích chất lượng mã nhưng nó chắc chắn không di chuyển nhanh.
Craig Ringer

Đó là một vấn đề cụ thể mà lõi PG tiếp tục phát minh lại những thứ cần tránh tùy thuộc vào nhiều thư viện bên ngoài hơn. Bởi vì nó có nghĩa là $ Ancient_unix_42 với $ lạ_vendor_compiler trên $ dead_arch architecture sẽ phải hỗ trợ nó, tất cả các thành viên buildfarm sẽ cần cập nhật, v.v.
Craig Ringer

@CraigRinger Tại sao bạn nghĩ PostGIS là C ++? Đó là một sự xúc phạm :-)
Nicklas Avén

Nó ... không phải sao? Tôi đã có thể tuyên thệ. Nhưng chắc chắn rằng nó không giống như nó. Lỗi của tôi. Tôi thực sự thích (vừa phải và hạn chế) sử dụng C ++.
Craig Ringer

4
Trong một khoảng thời gian, PostGIS đã có một vài mẩu C ++ để tạo sự ràng buộc với GEOS. Khi GEOS thêm API C của riêng mình, các phần đó đã bị xóa và PostGIS trở thành "thuần túy" C.
Paul Ramsey

34

Điều đó đơn giản là không đúng sự thật, PostgreSQL không hỗ trợ các kiểu dữ liệu không gian. Nó hỗ trợ các loại hình học. Những thứ này hoàn toàn tốt cho một số thứ, nhưng chúng hoàn toàn tách biệt với các hệ thống tọa độ trong thế giới thực. Các loại bản địa

Cập nhật

Đối với câu hỏi về chỉ số, nó nằm trong Câu hỏi thường gặp

Tại sao các chỉ mục R-Tree PostgreSQL không được hỗ trợ?

Các phiên bản ban đầu của PostGIS đã sử dụng các chỉ mục R-Tree của PostgreSQL. Tuy nhiên, PostgreSQL R-Plants đã bị loại bỏ hoàn toàn kể từ phiên bản 0.6 và lập chỉ mục không gian được cung cấp với sơ đồ R-Tree-over-GiST.

Các thử nghiệm của chúng tôi đã cho thấy tốc độ tìm kiếm của R-Tree và GiST gốc tương đương nhau. Cây Rg PostgreQuery bản địa có hai hạn chế khiến chúng không được sử dụng với các tính năng của GIS (lưu ý rằng những hạn chế này là do triển khai R-Tree gốc PostgreQuery hiện tại, chứ không phải khái niệm R-Tree nói chung):

  • Các chỉ mục R-Tree trong PostgreSQL không thể xử lý các tính năng có kích thước lớn hơn 8K. Các chỉ mục GiST có thể, bằng cách sử dụng thủ thuật "mất mát" để thay thế hộp giới hạn cho chính tính năng này.

  • Các chỉ mục R-Tree trong PostgreSQL không "null an toàn", do đó, việc xây dựng một chỉ mục trên cột hình học có chứa hình học null sẽ thất bại. [Chỉ mục GiST là null an toàn]


Bạn có thể mở rộng về điểm cuối cùng của bạn - điểm về chỉ số GiST không? PostgreSQL đã cung cấp R-Tree và hiện đang cung cấp điều này thông qua chỉ số GiST nên tôi bối rối về điểm đó.
Zeruno

cập nhật với văn bản trực tiếp từ faq.
Evan Carroll

1
API Gist là một điều PostgreSQL được cung cấp bởi truy cập / gist.h . Bạn có thể thấy nó được sử dụng trong PostGIS tại đây
Evan Carroll

3
Mặc dù PostGIS có triển khai rtree-on-gist của riêng nó nhưng nó rất giống với ứng dụng được sử dụng bởi PGQuery vì sự hỗ trợ cốt lõi của các đối tượng đồ họa vì lý do đơn giản là ban đầu chúng tôi đã sao chép chúng.
Paul Ramsey

1
@Zeruno, Không, sửa đổi trình phân tách rtree trong PGQuery sẽ không thay đổi hành vi của PostGIS, bởi vì chúng tôi có riêng chúng tôi, trong gserialized_gist_picksplit_2d (). Nếu không, nó sẽ không khác biệt hoàn toàn so với PGS, nếu có.
Paul Ramsey

8

PostGIS là một phần mở rộng cơ sở dữ liệu không gian cho cơ sở dữ liệu quan hệ đối tượng PostgreSQL . Nó bổ sung hỗ trợ cho các đối tượng địa lý cho phép chạy các truy vấn vị trí trong SQL.

SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';

Ngoài nhận thức về vị trí cơ bản, PostGIS cung cấp nhiều tính năng hiếm khi được tìm thấy trong các cơ sở dữ liệu không gian cạnh tranh khác như Oracle Locator / Spatial và SQL Server. Tham khảo Danh sách tính năng của PostGIS để biết thêm chi tiết.

Danh sách các tính năng của PostGIS cũng mở rộng các khả năng đó:

PostGIS thêm các loại bổ sung (hình học, địa lý, raster và các loại khác) vào cơ sở dữ liệu PostgreQuery . Nó cũng thêm các chức năng, toán tử và cải tiến chỉ mục áp dụng cho các loại không gian này. Các chức năng bổ sung, toán tử, liên kết chỉ mục và các loại này làm tăng sức mạnh của DBMS PostgreQuery cốt lõi, làm cho nó trở thành một hệ thống quản lý cơ sở dữ liệu không gian nhanh, nhiều tính năng và mạnh mẽ.

Danh sách tính năng

Sê-ri PostGIS 2+ cung cấp:

  • Các hàm xử lý và phân tích cho cả dữ liệu vectơ và raster để ghép, cắt, biến hình, phân loại lại và thu thập / kết hợp với sức mạnh của đại số bản đồ raster SQL để xử lý raster hạt mịn
  • Phân phối lại không gian Các hàm có thể gọi SQL cho cả dữ liệu vectơ và raster Hỗ trợ nhập / xuất dữ liệu vectơ biến đổi ESRI thông qua cả hai công cụ đóng gói dòng lệnh và GUI và hỗ trợ nhiều định dạng hơn thông qua các công cụ Nguồn mở của bên thứ 3 khác
  • Dòng lệnh được đóng gói để nhập dữ liệu raster từ nhiều định dạng tiêu chuẩn: GeoTiff, NetCDF, PNG, JPG

  • Kết xuất và nhập các hàm hỗ trợ dữ liệu vectơ cho các định dạng văn bản tiêu chuẩn như KML, GML, GeoJSON, GeoHash và WKT bằng cách sử dụng SQL Kết xuất dữ liệu raster theo các định dạng tiêu chuẩn khác nhau GeoTIFF, PNG, JPG, NetCDF, để đặt tên cho một số ít sử dụng SQL

  • Các hàm có thể gọi được của SQL raster / vector liền mạch để ép các giá trị pixel theo vùng hình học, chạy các chỉ số theo vùng, cắt các raster bằng hình học và hỗ trợ vectơ hỗ trợ đối tượng 3D, chỉ mục không gian và các chức năng Hỗ trợ cấu trúc mạng / sử dụng dữ liệu Điều tra dân số Hoa Kỳ

Hơn nữa, đến các điểm / phần được đề cập trong bài viết này. Tôi sẽ thêm như đã đề cập trên trang web PostGIS Cách thức hoạt động

Vì PostGIS có trong C, nó có thể sử dụng các thư viện khác trong C và C ++, và nó hoạt động rất tự do. PostGIS phụ thuộc vào:

  • GEOS cho nhiều thuật toán xử lý hình học
  • Proj.4 cho các chức năng chiếu lại tọa độ
  • GDAL để hỗ trợ xử lý và định dạng raster
  • LibXML2 để phân tích cú pháp XML
  • JSON-C để phân tích cú pháp JSON
  • SFCGAL để hỗ trợ 3D mở rộng và các thuật toán xử lý địa lý bổ sung
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.