it-swarm.com.ru

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

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

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

103
user1008404

Вы можете использовать тип данных 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 здесь .

112
Erwin Brandstetter

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

21
tvieira

В 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

Порядок - Долгота, Широта - поэтому, если вы нанесете его на карту, то это (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;
18
Darafei Praliaskouski

Если вам не нужны все функции, которые предлагает PostGIS, Postgres (в настоящее время) предлагает модуль расширения, называемый earthdistance . Он использует тип данных point или cube в зависимости от вашей точности, необходимой для расчета расстояния.

Теперь вы можете использовать функцию earth_box, например, для запроса точек на определенном расстоянии от местоположения.

1
Hans Bouwmeester