Какой тип данных для широты и долготы?
Я новичок в 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;