2009-06-18 10 views
7

Tôi có bảng đơn giản sau đây:truy vấn SQL cho point-in-polygon sử dụng PostgreSQL

CREATE TABLE tbl_test 
(
    id serial NOT NULL, 
    poly polygon NOT NULL 
) 
WITH (OIDS=FALSE); 

sau đó tôi cố gắng để chèn một hàng với một đa giác:

insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))')) 

Và chạy vào lỗi này :

column "poly" is of type polygon but expression is of type geometry

Điều gì là đáng yêu. Vì vậy, câu hỏi đầu tiên của tôi là:

  1. Tôi có thực sự phải truyền không?

Dù sao, sau khi truyền, nó hoạt động. Và bây giờ tôi đang cố gắng để làm một ST_Contains truy vấn đơn giản:

select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)'))) 

Mà cho các lỗi:

ERROR: function st_contains(polygon, point) does not exist 
LINE 1: select id, poly from tbl_test where ST_Contains(poly, Point(... 
              ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

Tôi phải làm gì đây?

Các công trình sau đây:

select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)')) 

Nhưng có lẽ vì cả hai đối số của loại hình học. Truy vấn thực tế đối với dữ liệu bảng không hoạt động.

Trả lời:

Dơi! Vấn đề là DB tôi tạo ra không dựa trên mẫu postgis DB (và do đó không có các chức năng có liên quan và các bảng cột hình học, vv). Có thể tôi chỉ nhận xét, kết luận rằng cách PostGIS yêu cầu bạn thêm hàng trăm chức năng, hàng và một vài bảng vào DB của bạn để bạn có hỗ trợ GIS hoàn toàn bị lame. Nó làm cho bản sao lưu của lược đồ phức tạp hơn nhiều và rất dễ bị lỗi (trời cấm nếu bạn bỏ bê gọi AddGeometryColumn và chỉ thêm một cột hình học).

+0

Nếu poly in poly hoạt động, tại sao không tạo đa giác "1-gon" với điểm bạn đang tìm? –

+0

Tôi không chắc rằng đa giác của 1 điểm được hỗ trợ trong postgres. Bên cạnh đó, nó là một giải pháp cho một vấn đề tôi không chắc chắn tồn tại .. –

Trả lời

8

Đa giác là loại Postgres cơ bản mà PostGIS xây dựng trên đầu trang. Bạn cho phép các cột hình học có chức năng PostGIS select AddGeometryColumn(...). Nếu không, bạn đang làm việc với đa giác thẳng:

=> create table gt (id int, space polygon); 
=> insert into gt values (1, '((2,2),(3,4),(3,6),(1,1))'); 
INSERT 0 1 
=> select point(space) from gt where id = 1; 
    point  
------------- 
(2.25,3.25) 
(1 row) 

Đây là điểm trung tâm của đa giác

=> select circle(space) from gt where id = 1; 
      circle    
-------------------------------- 
<(2.25,3.25),1.93994028704315> 
(1 row) 

Đây là vòng tròn bounding tối thiểu của đa giác, thể hiện dưới dạng một Postgres circle loại. Tất cả các toán tử hình học được ghi lại here: http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html Đa giác cơ sở không có bất kỳ dữ liệu chiếu, SRID, v.v., vì vậy nếu nó hoạt động với PostGIS, nó có thể chỉ là mặc định để cài đặt trước và may mắn.Nhưng tất nhiên có rất nhiều trường hợp bạn chỉ cần hình học trên một quy mô không gian địa lý phụ.

+0

Có một trang tóm tắt sự khác biệt giữa PostGIS và hỗ trợ dữ liệu hình học gốc trong PG không? Dữ liệu tôi đang giữ là địa lý (2D) và tôi không chắc liệu tôi có thực sự cần PostGIS hay không. –

+0

Tôi thực sự thích PostGIS, chắc chắn nó sẽ cung cấp cho bạn nhiều tùy chọn hơn trong thời gian dài, sẽ cho phép bạn tương tác với qgis hoặc thậm chí esri, và thực hiện hàng triệu tính năng (quy tắc đặc biệt cho dữ liệu của chính phủ Phần Lan và Thụy Điển, v.v.). Về cách PostGIS sử dụng và phân kỳ từ các loại Postgres khác, điều đó nghe giống như một câu hỏi cho SO. Không thể tìm thấy giải thích rõ ràng về googling hoặc tìm kiếm ngay bây giờ thông qua nguồn postgis. – unmounted

+0

hỏi: http://stackoverflow.com/questions/1023229/spatial-data-in-postgresql –

4

Ok, lạ, tôi phát hiện ra cú pháp đơn giản hơn nhiều sau hoạt động:

insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)') 

select * from tbl_test where poly @> '(2, 8)' 

Nhưng tôi phải vật lộn để tìm ra sự khác biệt giữa các bộ chức năng và các nhà khai thác. Cú pháp ngắn hơn này (không thực sự tuân thủ OpenGIS) có tận dụng cùng các chỉ mục không gian, v.v. không?

+0

Tôi biết câu hỏi rất cũ của nó ... nhưng có vẻ như bạn có ý tưởng rất tốt về opengis và postgre .... bạn có thể cho tôi biết nếu tôi có thể truy vấn như tìm thấy nếu một điểm có trong "bất kỳ" nào của đa giác. như 'chọn poly từ poly_table trong đó điểm (x, y)' –

+0

@JigarShah, hai thứ. 1, đó là "postgres" và thứ hai đó chính xác là những gì truy vấn thực hiện. –