Những loại dữ liệu cho vĩ độ và kinh độ?


154

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 tôi nên sử dụng cho vĩ độ và kinh độ?


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

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

Câu trả lời:


140

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 float8số nội bộ.

Hoặc làm cho nó hai cột loại float(= float8hoặc double precision). 8 byte mỗi cái.
Hoặc real(= float4) nếu không cần độ chính xác bổ sung. Mỗi 4 byte.
Hoặc thậm chí numericnế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 tốt về các loại sốcác loại hình học .


Các loại geometrygeographydữ liệu được cung cấp bởi mô-đun bổ sung PostGIS và chiếm một cột trong bảng của bạn. Mỗi chiếm 32 byte cho một điểm. Có một số chi phí bổ sung như SRID trong đó. Những loại cửa hàng này (dài / lat), không (lat / long).

Bắt đầu đọc hướng dẫn PostGIS tại đây .


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

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

1
Sẽ nhanh hơn để lưu trữ lâu, lat và geog qua việc thử phân tích geog cho lat dài ban đầu?
Dan

1
@Dan: Phụ thuộc. Xin hỏi một câu hỏi mới với các chi tiết. Bạn luôn có thể liên kết đến cái này cho bối cảnh. Bình luận không phải là nơi cho câu hỏi mới.
Erwin Brandstetter

40

Trong PostGIS, đối với các điểm có vĩ độ và kinh độ có kiểu dữ liệu đị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à ID tham chiếu không gian cho biết dữ liệu theo độ kinh độ và vĩ độ, giống như trong GPS. Thêm về nó: http://epsg.io/4326

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

Để tìm điểm gần nhất trước tiên bạn cần tạo chỉ mục không gian:

create index on your_table using gist (geog);

và sau đó yêu cầu, giả sử, 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;

1
Làm rõ SRID 4326 muốn kinh độ vĩ độ theo thứ tự đó. Nhưng cách giải thích SRID 4326 của PostGIS muốn có kinh độ theo thứ tự đó. Ví dụ là chính xác cho việc sử dụng PostGIS. postgis.net/2013/08/18/tip_lon_lat
hahmed

26

Tôi ủng hộ mạnh mẽ cho PostGis . Nó đặc trưng cho loại kiểu dữ liệu đó và nó có các phương thức vượt trội để tính 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


5

Nếu bạn không cần tất cả các chức năng mà PostGIS cung cấp, Postgres (ngày nay) cung cấp một mô-đun mở rộng được gọi là earthdistance . Nó sử dụng điểm hoặc khối kiểu dữ liệu tùy thuộc vào nhu cầu độ chính xác của bạn để tính toán khoảng cách.

Bây giờ bạn có thể sử dụng hàm earth_box để -cho ví dụ- truy vấn các điểm trong một khoảng cách nhất định của một vị trí.


2

Trong PostGIS Geometry được ưa thích hơn Geography (mô hình trái đất tròn) vì các tính toán đơn giản hơn nhiều do đó nhanh hơn. Nó cũng có NHIỀU chức năng khả dụng hơn nhưng kém chính xác hơn trong khoảng cách rất dài.

Nhập CSV của bạn vào các trường lat dài vào DECIMAL(10,6)các cột. 6 chữ số có độ chính xác 10cm, nên có nhiều cho hầu hết các trường hợp sử dụng.

Sau đó bỏ dữ liệu đã nhập của bạn

SELECT 
    --ST_SetSRID(ST_Point(long, lat),4326) geom -- the wrong way because SRID not set in geometry_columns table
    ST_Point(long, lat)::geometry(Geometry, 4326) geom
INTO target_table
FROM source_table;

Xác minh SRID không bằng không!

SELECT * FROM public.geometry_columns WHERE f_table_name = 'target_table';

Xác thực thứ tự của tham số lat dài của bạn bằng trình xem WKT và ST_AsEWKT(target_table.geom).

Sau đó lập chỉ mục cho hiệu suất tốt nhất

CREATE INDEX idx_target_table_geom_gist
    ON target_table USING gist(geom);
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.