2011-11-16 38 views
87

Tôi là người mới sử dụng PostgreSQL và PostGIS. Tôi muốn lưu trữ các giá trị vĩ độ và kinh độ trong bảng cơ sở dữ liệu PostgreSQL 9.1.1. Tôi sẽ tính khoảng cách giữa hai điểm, tìm điểm gần hơn bằng cách sử dụng giá trị vị trí này.Loại dữ liệu nào cho vĩ độ và kinh độ?

Tôi nên sử dụng loại dữ liệu nào cho vĩ độ và kinh độ?

+4

Nếu bạn đang làm hai điểm (Bản đồ lat/lon 2D) Tôi muốn sử dụng kiểu dữ liệu Hình học. Nếu bạn cần phải giới thiệu độ cao hoặc độ cong của trái đất trong khoảng cách của bạn, Địa lý là nơi bạn muốn đi. – Twelfth

+2

Có bất kỳ câu trả lời nào dưới đây giải quyết câu hỏi của bạn không?Nếu vậy, tôi khuyến khích bạn chọn một câu trả lời :) – Volte

+0

có câu trả lời cho điều này không? –

Trả lời

81

Bạn có thể sử dụng kiểu dữ liệu point - kết hợp (x,y) có thể là lat/long của bạn. Chiếm 16 byte: 2 float8 số nội bộ.

Hoặc đặt hai cột theo loại float (= float8 hoặc double precision). 8 byte mỗi.
Hoặc real (= float4) nếu không cần thêm độ chính xác. 4 byte mỗi.
Hoặc thậm chí numeric nếu bạn cần độ chính xác tuyệt đối. 2 byte cho mỗi nhóm gồm 4 chữ số, cộng thêm 3 - 8 byte trên đầu.

Đọc hướng dẫn sử dụng tốt về numeric typesgeometric types.


Các geometrygeography kiểu dữ liệu được cung cấp bởi các thành phần phụ PostGIS và chiếm một cột trong bảng. Mỗi chiếm 32 byte cho một điểm. Có một số chi phí bổ sung như SRID trong đó. Các loại lưu trữ (dài/lat), không (lat/long).

Bắt đầu đọc PostGIS manual here.

+1

Tôi sẽ không khuyên bạn nên sử dụng kiểu dữ liệu 'float'. Nó làm cho tính toán với các tọa độ rất phức tạp. Bạn nên sử dụng PostGIS và datatype 'geography' để tính toán như vậy. – m13r

+0

Nó thực sự là một hướng dẫn sử dụng tốt phải không? Một ví dụ sáng trong tài liệu. – otocan

17

Tôi ủng hộ mạnh mẽ cho PostGis. Nó dành riêng cho loại dữ liệu đó và nó có trong số các phương pháp hộp để tính toán khoảng cách giữa các điểm, trong số các hoạt động GIS khác mà bạn có thể thấy hữu ích trong tương lai

4

Trong PostGIS, cho các điểm có vĩ độ và kinh độ có datatype địa lý .

Để thêm một cột:

alter table your_table add column geog geography; 

Để chèn dữ liệu:

insert into your_table (geog) values ('SRID=4326;POINT(longitude latitude)'); 

4326 là không gian ID tham khảo nói rằng dữ liệu của nó trong độ kinh độ và vĩ độ, tương tự như trong GPS. Thông tin thêm về nó: http://epsg.io/4326

Thứ tự là Kinh độ, Vĩ độ - vì vậy nếu bạn vẽ nó làm bản đồ, đó là (x, y).

Để tìm điểm gần nhất bạn cần đầu tiên để tạo ra chỉ số không gian:

create index on your_table using gist (geog); 

và sau đó yêu cầu, chẳng hạn, 5 gần nhất với một điểm nhất định:

select * 
from your_table 
order by geog <-> 'SRID=4326;POINT(lon lat)' 
limit 5; 
Các vấn đề liên quan