ST_DWithin Calc Mét - biến đổi hoặc đúc?


9

Tôi muốn sử dụng ST_DWithin trên dữ liệu được lưu trữ trong hình học SRID là 4326 và sử dụng mét làm tham số khoảng cách. Có hiệu quả hơn khi thực hiện phân vai (ví dụ: data.geom :: geography) hoặc biến đổi thành SRID với đơn vị mét (ví dụ ST_Transform (geom, 3857)? Hoặc không?


Dữ liệu của bạn ở phạm vi không gian nào?
DPSSpatial

Các dữ liệu bao gồm toàn bộ Hoa Kỳ.
kingzing1

Nếu dữ liệu được lập chỉ mục không phải là địa lý thì bạn nên sử dụng xấp xỉ bằng độ trong ST_DWithin, sau đó sử dụng truyền với ST_Distance ..
Vince

Tôi sẽ cố gắng chuyển đổi thành Albers Equal Area Conic cho Continential USA, nơi tôi tin là tính bằng mét (mét?) ... trước tiên hãy thử một vài tính năng ... đó là nơi tôi sẽ bắt đầu ...
DPSSpatial

Thế còn "chỉ thử cái nào nhanh hơn"?
Stophface

Câu trả lời:


14

Theo mô tả, câu trả lời là "không", vì những lý do sau:

  • Lấy một bảng không gian trong 4326. Xây dựng một chỉ số không gian trên đó. Chỉ số không gian là một chỉ số phẳng, bao gồm các giới hạn 2D của các tính năng, trong 4326, được sắp xếp thành một cấu trúc cây.
  • (a) chạy truy vấn bộ lọc khoảng cách bằng cách sử dụng, như ST_DWithin(geom::geography, %anothergeom, %radius). Vì địa lý có liên quan, hệ thống sẽ tìm kiếm một chỉ số địa lý (được xây dựng trên một hình cầu, không phải trên một mặt phẳng) và sẽ không tìm thấy. Vì nó không có chỉ mục, nó sẽ thực hiện phép nối bằng cách quét toàn bộ (các) bảng. Nó sẽ chậm thôi.
  • (b) chạy truy vấn bộ lọc khoảng cách bằng cách sử dụng một biến đổi, như ST_DWithin(ST_Transform(geom, 2163), %anothergeom, %radius). Các thử nghiệm của bạn không chống lại cột được lập chỉ mục (geom), nhưng đối với một hàm được áp dụng cho cột ( ST_Transform(geom,2163)) và một lần nữa, chỉ mục không gian của bạn sẽ không được sử dụng. Nó sẽ chậm thôi.

Bạn cần cho truy vấn của bạn và chỉ mục của bạn để hài hòa. Nếu bạn không muốn thay đổi phép chiếu dữ liệu của mình, bạn sẽ phải sử dụng chỉ mục chức năng, ví dụ: nếu bạn tạo chỉ mục địa lý chức năng, bạn có thể sử dụng truy vấn dựa trên địa lý:

CREATE INDEX mytable_geog_x 
  ON mytable USING GIST (geography(geom));

SELECT * 
  FROM mytable 
  WHERE ST_DWithin(geography(geom), %anothergeography, %radius);

Hoặc, trong trường hợp chuyển đổi:

CREATE INDEX mytable_geog_x 
  ON mytable USING GIST (ST_Transform(geom, 2163));

SELECT * 
  FROM mytable 
  WHERE ST_DWithin(ST_Transform(geom, 2163), %another2163geometry, %radius);

Hiệu suất nhanh nhất tuyệt đối sẽ là nếu bạn chuyển đổi dữ liệu trong bảng của mình sang phép chiếu phẳng (như EPSG: 2163 ), tạo chỉ mục không gian và sau đó sử dụng ST_DWithin()kết quả.

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 2163) 
  USING ST_Transform(geom, 2163);

CREATE INDEX mytable_geom_x ON mytable USING GIST (geom);

SELECT * 
  FROM mytable
  WHERE ST_DWithin(geom, %some2163geom, %radius)

Cảm ơn vì điều này Paul. Rất hữu ích - nó tăng tốc đáng kể thời gian để xử lý.
kingzing1

Nhưng hai truy vấn cuối cùng sẽ khác với truy vấn đầu tiên trong đó truy vấn sau tính toán khoảng cách hai mặt phẳng và truy vấn trắc địa trước đây?
Andre Silva

Đây là một câu trả lời tuyệt vời, nhưng điều khiến tôi bối rối là cảm giác như nó mâu thuẫn với các tài liệu: postgis.net/docs/manual-dev/PostGIS_FAQ.html#idm1363 Các tài liệu không chính xác hay tôi đang đọc sai chúng?
Olshansk
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.