gis on rails

33
GIS on Rails Сергій Тятін Full-stack web developer

Upload: serge-tyatin

Post on 13-Apr-2017

160 views

Category:

Technology


0 download

TRANSCRIPT

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 )

PostGIS Cheatsheet

Дякую за увагу

Сергій Тятін [email protected] skype: tyatin

DRIDER.IO