SlideShare a Scribd company logo
GIS on Rails
Сергій Тятін Full-stack web developer
GIS
1. Трохи теорії
2. Інструменти
3. PostGiS SQL
Geoid
Еліпсоїд
Datum WGS 84
Датум (лат. Datum) — набір параметрів, які
використовуються для зміщення і
трансформації референц-еліпсоїду в
локальні географічні координати.
Mercator projection
SRID
Spatial Reference System Identifier
SRID=4326;POINT(24.0267731
49.8386644)
SRID=3785;POINT(2674648.14689752
6418382.09688131)
Інструменти
• PostGIS (http://postgis.net/)
• gem ‘rgeo’
• gem 'activerecord-postgis-adapter’
PostGIS
• Geometry, Geography functions
• Data types: POINT, LINESTRING, POLYGON, CURVE ..
gem ‘rgeo’
• репрезентація данних
• базові функції
gem ‘activerecord-postgis-
adapter’
The activerecord-postgis-adapter provides access to
features of the PostGIS geospatial database from
ActiveRecord
Історія створення стартапа для
car-pooling
Як працює
Дошка оголошень
Маршрути водіів
Запити пасажирів
Матчінг
Запис маршрута водія
GPS locations
geometry ST_MakeLine(geometry
set geoms)
Алгоритм Рамера —
Дугласа — Пекера
geometry ST_Simplify(geometry
geomA, float tolerance);
Порівняння маршрутів
• Мають починатися і закінчуватись поряд
• Мають проходити поряд
boolean ST_DWithin(geography gg1,
geography gg2, double precision
distance_meters);
Мають починатися і
закінчуватись поряд
SELECT
FROM routes WHERE
ST_DWithin( ?, routes.start, 500)
AND
ST_DWithin( ?, routes.end, 500)
Мають проходити поряд
Відстань Гаусдорфа
float ST_HausdorffDistance(geometry
g1, geometry g2);
SELECT * FROM (
SELECT ST_HausdorffDistance(routes.route, ? )
as distance, …
FROM routes WHERE
ST_DWithin( ?, routes.start, 500)
AND
ST_DWithin( ?, routes.end, 500)
) ORDER BY distance ASC LIMIT 1
Gis On Rails
Знайти маршрути для
пассажира
start
finish
• Місце зустрічі/виходу близько
• Де найкраще зустрітись/вийти
• Напрямок має значення
Місце зустрічі/виходу
близько
SELECT
FROM routes
WHERE
ST_DWithin(routes.route, ?, 500 )
AND

ST_DWithin(routes.route, ?, 500 )
Де найкраще зустрітись/вийти
Найближча точка
geometry ST_ClosestPoint(geometry g1, geometry g2);
Де найкраще зустрітись/
вийти
SELECT
ST_ClosestPoint(route, ?) as pickup_location,

ST_ClosestPoint(route, ?) as drop_location,
FROM routes
WHERE
ST_DWithin(routes.route, ?, 500 )
AND

ST_DWithin(routes.route, ?, 500 )
Напрямок має значення
Маємо вибрати тільки ті маршрути які йдуть від
точки старт до точки фініш
float ST_LineLocatePoint(geometry a_linestring,
geometry a_point);
Повертає значення між 0 та 1 яке визначає
положення найближчої точки на лінії до заданої
точки
Напрямок має значення
SELECT
ST_LineLocatePoint(route, ?) as pickup_float,

ST_LineLocatePoint(route, ?) as drop_float,
ST_ClosestPoint(route, ?) as pickup_location,

ST_ClosestPoint(route, ?) as drop_location,
FROM routes
WHERE
ST_DWithin(routes.route, ?, 500 )
AND

ST_DWithin(routes.route, ?, 500 )
PostGIS Cheatsheet
Дякую за увагу
Сергій Тятін
700@2rba.com
skype: tyatin
DRIDER.IO

More Related Content

PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
PDF
GIS on Rails
PPTX
Свалка
PDF
Mysql replication
PPTX
Drider
PPTX
Cхватка найскладніше технологічне рішення
PPTX
Схватка
Storytelling For The Web: Integrate Storytelling in your Design Process
2024 Trend Updates: What Really Works In SEO & Content Marketing
GIS on Rails
Свалка
Mysql replication
Drider
Cхватка найскладніше технологічне рішення
Схватка
Ad

Gis On Rails