GIS on Rails
-
Upload
pivorak-meetup -
Category
Software
-
view
292 -
download
0
Transcript of GIS on Rails
GIS on RailsСергій Тятін Full-stack web developer
GIS1. Трохи теорії 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
Знайти маршрути для пассажира
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 )