## Klasy do opakowania Postgisa
Musi dostraczać:
* funkcjonalności:
* FastestRoute(point, point) <- przyjmuje jakiś obiekt punktu
* POIPointInBuffer(point, distance) -> Jakiś obiekt punktu
* PointOnRouteAfter(distance)
* FindPoint(x, y) lub (lon, lat) lub nazwa -> Jakiś obiekt punktu
```python=
NEAREST_START_POINT_QUERY = "SELECT t.source, ST_SetSrid(ST_MakePoint(t.x1, t.y1), " \
"4326) FROM (SELECT source, x1, y1 FROM hh_2po_4pgr " \
"ORDER BY sqrt((x1 - {})*(x1 - {}) + (y1 - {})*(y1 - {}))" \
"LIMIT 1) as t;"
NEAREST_END_POINT_QUERY = "SELECT t.target, ST_SetSrid(ST_MakePoint(t.x2, t.y2), " \
"4326) FROM (SELECT target, x2, y2 FROM hh_2po_4pgr " \
"ORDER BY sqrt((x2 - {})*(x2 - {}) + (y2 - {})*(y2 - {}))" \
"LIMIT 1) as t;"
ROUTE_LENGTH_QUERY = "SELECT ST_Length('{}'::geography);"
LOCATIONS_NEAR_ROUTE_QUERY = "SELECT * FROM (SELECT id, geom_coords, ST_Distance" \
"('{}'::geography, geom_coords::geography) AS dist FROM " \
"locations) AS t WHERE t.dist < {}"
POINTS_DISTANCE_QUERY = "SELECT ST_Distance('{}'::geography, '{}'::geography);"
HUMAN_READABLE_QUERY = "SELECT ST_AsText('{}');"
DUMP_POINTS_QUERY = "SELECT ST_DumpPoints('{}');"
ROUTE_AND_TIME_QUERY = "SELECT geom_way, km / kmh as time FROM pgr_dijkstra('" \
"SELECT id, source, target, km as cost FROM hh_2po_4pgr', " \
"{}, {}, false) AS route1 LEFT JOIN hh_2po_4pgr as route2 " \
"ON (route1.edge = route2.id) ORDER BY seq;"
UNION_ROUTE_QUERY = "SELECT ST_Union(%s);"
FORMAT_STRING_POINT = "POINT({:f} {:f})"
FORMAT_STRING_DUMP_POINTS = "(\"<{:d},{:d}>\",{})"
```
## UI
[https://github.com/openlayers/openlayers](https://github.com/openlayers/openlayers)
```javascript=
olMap.on('click', function(event) {
if (startPoint.getGeometry() == null) {
startPoint.setGeometry(new ol.geom.Point(event.coordinate));
} else if (destPoint.getGeometry() == null) {
destPoint.setGeometry(new ol.geom.Point(event.coordinate));
var startCoord = transform(startPoint.getGeometry().getCoordinates());
var destCoord = transform(destPoint.getGeometry().getCoordinates());
var viewparams = {
'start' : { 'x' : startCoord[0], 'y' : startCoord[1] },
'end' : { 'x' : destCoord[0], 'y' : destCoord[1] }
};
params.viewparams = viewparams;
}
});
drawPath = function(points) {
let locations = new Array();
for(let point of points) {
locations.push([point.x, point.y]);
}
var route = new ol.geom.LineString(locations).transform('EPSG:4326', 'EPSG:3857');
var feature = new ol.Feature({
type: 'route',
geometry: route
});
feature.setStyle(styles.route);
vectorSource.addFeature(feature);
}
```