Какой тип данных для широты и долготы?

Я новичок в PostgreSQL и PostGIS. Я хочу хранить значения широты и долготы в таблице базы данных PostgreSQL 9.1.1. Я буду вычислять расстояние между двумя точками, находить более близкие точки, используя эти значения местоположения.

Какой тип данных следует использовать для широты и долготы?

Ответ 1

Вы можете использовать тип данных point - объединяет (x,y), который может быть вашим лат/длинный. Занимает 16 байт: 2 float8 номера внутри.

Или сделайте два столбца типа float (= float8 или double precision), 8 байтов.
Или real (= float4), если дополнительная точность не нужна. 4 байта.
Или даже numeric, если вам нужна абсолютная точность. 2 байта для каждой группы из 4 цифр, плюс 3 - 8 байтов накладных расходов.

Прочитайте прекрасное руководство по числовые типы и геометрические типы.


geometry и geography предоставляют дополнительный модуль PostGIS и занимают один столбец в вашей таблице. Каждый из них занимает 32 байта для точки. Есть некоторые дополнительные накладные расходы, такие как SRID. Эти типы хранятся (long/lat), а не (lat/long).

Начните читать Руководство по PostGIS здесь.

Ответ 2

Я решительно выступаю за PostGis. Он специфичен для такого типа данных и имеет методы, позволяющие вычислять расстояние между точками, среди других операций ГИС, которые вы можете найти полезными в будущем.

Ответ 3

В PostGIS для точек с широтой и долготой существует тип данных географии.

Чтобы добавить столбец:

alter table your_table add column geog geography;

Вставить данные:

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

4326 - это пространственный идентификатор ссылки, в котором указаны данные в градусах долготы и широты, так же как и в GPS. Подробнее об этом: http://epsg.io/4326

Order is Longitude, Latitude - поэтому, если вы нарисуете его как карту, это (x, y).

Чтобы найти ближайшую точку, вам нужно сначала создать пространственный индекс:

create index on your_table using gist (geog);

а затем запросите, скажем, 5, ближайшую к данной точке:

select * 
from your_table 
order by geog <-> 'SRID=4326;POINT(lon lat)' 
limit 5;