2011-12-11 24 views
13

Đây có lẽ là một câu hỏi đơn giản, nhưng tôi không giỏi PostGIS và không hoàn toàn lúng túng tất cả điều này.Khoảng cách giữa 2 POINTs trong Postgis trong srid 4326 in mét

Về cơ bản tôi có một bảng (nodes) với cột LƯU Ý (point). Tôi đã tạo ra một chỉ mục trên cột này

create index nodes__points on nodes using gist (point) 

Cột đã được tạo ra với

select addgeometrycolumn('nodes', 'points', 'POINT', 4326, 2) 

Tôi đang sử dụng SRID 4326 vì tôi thêm dữ liệu đó là theo hình thức (vĩ độ, kinh độ). (tức là hệ thống phối hợp nơi vị trí của Dublin, Ireland là lat = 53.353 lon = -6.264 (mà tôi đã thêm với GeomFromText('POINT(-6.264 53.535)'))).

Đối với mỗi điểm, tôi muốn tìm tất cả các điểm nằm trong khoảng cách 1km ở chính giữa điểm đó (vì vậy selcet a.id, count(*) from nodes as a, nodes as b where SOME_DISTANCE_FUNCTION_HERE(a.point, b.point, 1000) group by a.id;. Nó không nhất thiết phải là một con số hunteristic thô. một vòng tròn 1km là tốt, không cần phải chính xác 1km, chỉ là thứ tự độ lớn đó.

ST_Distance/ST_DWithin/etc tất cả các đơn vị của SRID, cho 4326/WGS64 là độ 1 = 1 độ của thái độ/kinh độ) Nhưng tôi muốn sử dụng mét

Tôi đã thử ST_distance_spherest_dwithin có thể sử dụng mét, nhưng nếu tôi làm như vậy, explain cho thấy rằng chỉ mục không được sử dụng.

Làm thế nào tôi có thể nhận được gần như những gì tôi muốn, sử dụng chỉ mục địa lý?

CẬP NHẬT: Đây là phiên bản PostgreSQL 9.1 và PostGIS 2.0 svn.

+0

Có lẽ một số giúp đỡ: [ST_DWithin mất thông số như mức độ, không mét, tại sao?] (Http://stackoverflow.com/questions/8444753/st-dwithin -takes-parameter-as-degree-not-mét-why) – radek

+1

câu hỏi bắt buộc: Phiên bản PostGIS là gì? Phiên bản PostgreSQL nào? – filiprem

Trả lời

5

Kể từ khi viết này, tôi đã phát hiện ra "địa lý" trái ngược với loại "hình học" trong PostGIS, có thể làm chính xác những gì tôi muốn.

+1

Địa lý sẽ hoạt động. bạn đã không đề cập đến kiểu dữ liệu trong câu hỏi. Vấn đề với Geom là nó cuối cùng là một đối tượng 2D. Địa lý là một đối tượng 4D bao gồm độ cao và độ cong của thông số trái đất có thể được trasl hóa thành mét ... mà không có hai tham số này, bạn thực sự không thể ước tính 'mét' là các lat/lons khác nhau có nghĩa là các khoảng cách khác nhau đang chờ bạn ở đâu trên hành tinh. Có thể có vẻ tầm thường khi bạn đang viết, nhưng vui lòng bao gồm một câu lệnh tạo bảng để chúng tôi biết những loại dữ liệu cột nào bạn đang đề cập đến – Twelfth

16

Bạn có thể sử dụng ST_Transform để sử dụng đồng hồ, cũng lưu ý rằng không phải tất cả các chức năng đều có sẵn với các loại địa lý nhưng nếu bạn thực sự cần tốc độ sử dụng ST_DWithin, là cách nhanh nhất. Dưới đây là một aproximation chuyển đổi giữa các trình độ và mét:

| places | degrees | distance | 
| ------ | ---------- | -------- | 
| 0  | 1.0  | 111 km | 
| 1  | 0.1  | 11.1 km | 
| 2  | 0.01  | 1.11 km | 
| 3  | 0.001  | 111 m | 
| 4  | 0.0001  | 11.1 m | 
| 5  | 0.00001 | 1.11 m | 
| 6  | 0.000001 | 0.111 m | 
| 7  | 0.0000001 | 1.11 cm | 
| 8  | 0.00000001 | 1.11 mm |