Всем привет! Рассмотрим расширение для баз данных, которое добавляет поддержку географических объектов, а значит появляется возможность выполнять запросы местоположения
![](https://habrastorage.org/getpro/habr/upload_files/2c5/e6b/6f6/2c5e6b6f689c4558975d2608527da5d3.png)
В Рамках задачи работы с ClickStream, у нас имелись координаты действий пользователей в определенный момент времени и возникла идея отобразить их на карте. Для этого нам поможет расширение PostGIS.
![](https://habrastorage.org/getpro/habr/upload_files/ef2/776/bd0/ef2776bd0a0424e8fbfe3ad623a4ed39.png)
PostGIS – расширение для географических и пространственных данных, при помощи которого можно:
· обрабатывать точки, кривые, фигуры;
· получать статистику по ним;
· строить карты или находить маршруты;
· сохранять полученные данные в таблицу;
· преобразовывать географические и/или пространственные данные в друг друга;
· индексировать и обрабатывать полученные данные.
Библиотека включает в себя:
· геометрические типы
· вычислительные и аналитические функции
· GIST индексы
· инструменты импорта/экспорта
· GDAL — Geospatial Data Abstraction Library
· параллельную обработку
Для использования расширения можно:
· в коммерческой версии скачивается и устанавливается package;
· или это расширение можно собрать их исходников и установить самостоятельно
Для примера создадим таблицу, где одним из типов данных будет geometry, в качестве IDE будем использовать DBeaver.
Полученные геометрические данные можно обрабатывать на сегментах, частями ускоряя обработку массива. Можно вставить:
— полигон (POLYGON);
— линию (LINESTRING), прямую или ломаную;
— ломаную линию, из которой будет создан полигон (MULTIPOINTS)
CREATE TABLE geom_test (gid int4, geom geometry, name varchar(25) ); INSERT INTO geom_test ( gid, geom, name ) VALUES (1, 'POLYGON((0 0 0,0 5 0,5 5 0,5 0 0,0 0 0))', '3D Square'); INSERT INTO geom_test ( gid, geom, name ) VALUES (2, 'LINESTRING((1 1 1,5 5 5,7 7 5))', '3D Line'); INSERT INTO geom_test ( gid, geom, name ) VALUES (3, 'MULTIPOINT((3 4,8 9))', '2D Aggregate Point'); INSERT INTO geom_test ( gid, geom, name ) VALUES (1, ST_Polygon(ST)GeomFromText('LINESTRING(75.15 29.53,77 30,77.6 29.5 75.15 29.53)'), 4326, '3D Poly');
![](https://habrastorage.org/getpro/habr/upload_files/708/cfb/860/708cfb86061d5d84aa96019a56cbbf68.png)
Можно выбрать из таблицы, какие типы данных содержатся в каком поле с каким именем
SELECT geometrytype (geom), NAME FROM geom_test;
![](https://habrastorage.org/getpro/habr/upload_files/66a/8d9/4a1/66a8d94a15eaf0e04ce95648ed8a6a1c.png)
Можно выбрать все содержимое таблицы и получить наглядное представление об информации, которая хранится в геометрическом поле.
SELECT * FROM geom_test;
![](https://habrastorage.org/getpro/habr/upload_files/961/0af/45f/9610af45fe5cc638c5f6f48d2b786756.png)
Еще одной возможностью DBeaver является его способность отобразить объект на карте и посмотреть, что это такое.
SELECT ST_Polygon( ST_GeomFromText('LINESTRING(75.15 29.53,77 30,77.6 29.5, 75.15 29.53)'), 4326 );
![](https://habrastorage.org/getpro/habr/upload_files/5ac/5df/2a6/5ac5df2a6b9a4ed0a76cc2b26f60a5c4.png)
Можно поставить точку для произвольных координат и посмотреть ее местонахождение на реальной карте.
Расширение PostGIS оно также работает в PostgreSQL. При необходимости анализа большого объема информации она складывается в Greenplum и обрабатывается параллельно на всех сегментах.
PostGIS поддерживает создание GiST, что позволяет ускорить обработку географических запросов и проще выполнять операции поиска-вхождения или принадлежности к одной и той же зоне разных объектов. Такой географический GiST индекс будет представлять собой дерево, в котором будут последовательно отображаться все объекты.
Геометрические поля можно добавлять к уже существующим таблицам. Для этого применяется специфический оператор AddGeometryColumn
DROP TABLE geotest; CREATE TABLE geotest (id INT4, name VARCHAR(32) ); SELECT AddGeometryColumn ('geotest','geopoint', 4326,'POINT',2); После создания таблицы, можно добавить к ней колонку с геометрическими данными, которые можно дополнять и смотреть их на карте. INSERT INTO geotest (id, name, geopoint) VALUES (1, 'Olympia', ST_GeometryFromText('POINT(-122.90 46.97)', 4326)); INSERT INTO geotest (id, name, geopoint) VALUES (2, 'Renton', ST_GeometryFromText('POINT(-122.90 47.50)', 4326)); SELECT name, ST_AsText(geopoint) FROM geotest;
![](https://habrastorage.org/getpro/habr/upload_files/c24/ba3/e10/c24ba3e105c8014674535b7505e23cb8.png)
SELECT geopoint FROM geotest WHERE name = 'Olympia'
![](https://habrastorage.org/getpro/habr/upload_files/90e/b15/989/90eb15989e978856868c45753f1a41ec.png)
Geohash
Для удобной работы с координатами можно использовать geohash. Геохэши позволяют из любой точки создать набор символов, который с некоторой точность задает нашу точку.
Их преимущество заключается в том, что:
· можно явно задавать точность
· каждый геохэш более высокого порядка входит в геохэш более низкого порядка, поэтому легко производить операции включения/исключения
· использование геохешей экономит место, так как их хранить проще, чем координаты
Например, зададим точку и посмотрим, какой геохэш будет ей соответствовать:
SELECT ST_GeoHash(ST_SetSRID(ST_MakePoint(-126,48),4326));
Здесь ST_SetSRID — устанавливает SRID для геометрии в определенное целочисленное значение. SRID (spatial referencing system identifier) — уникальный идентификатор, однозначно определяющий систему координат, например, используемый нами код 4326 соответствует географической системе координат WGS84.
Уменьшим длину геохеша, например, до 5. Видим, что полученное значение входит в полученный ранее более точный геохэш:
SELECT ST_GeoHash(ST_SetSRID(ST_MakePoint(-126,48),4326),5);
Подобными образом можно явно задавать точность геохэша. Например, геохэш в 6 символов дает погрешность ≈ 600 м.
Идея алгоритма состоит в том, что широта и долгота кодируется в число, которое
затем кодируется в base-32.
Карта разбивается на 32 квадрата и нумеруется от 1 до z.
![](https://habrastorage.org/getpro/habr/upload_files/434/c07/872/434c078729eed0ebbd6545d2c3aed830.jpg)
Подробно алгоритм построения можно почитать на википедии.
Его идея похожа на арифметическое кодирование.
Как видим из примера
![](https://habrastorage.org/getpro/habr/upload_files/7aa/d78/5d6/7aad785d66a26edeff83c232437fc886.png)
Хешированная координата указывает на квадрат C, что находится в Северной Америке.
Таким образом, расширение PostGIS позволяет манипулировать большими объемами картографических и географических данных, а его регулярное обновление дает большие перспективы для дальнейшего применения.
ссылка на оригинал статьи https://habr.com/ru/post/667986/
Добавить комментарий