Ondrej Harnúšek, FIIT STU, 2019
Hlavná funkcionalita:
Aplikácia má čast frontend, ktorý je html stránka
používajúca mapbox API a mapbox.js a
backendovú časť napísanú vo
Flask, používajúcu
PostGIS databázu. Frontend komunikuje s backendom pomocou
rozhrania REST API.
export PYTHONPATH=.
python server/app.py
Mapa je dostupná na adrese:
http://localhost:8080/map

zobrazenie zariadení, farebne podľa ich typu
príklad query: Vyhľadanie reštaurácii, krčiem a kaviarní v okolí 250 m od pozície [17.107341368562373, 48.148054257071266]
select array_to_json(array_agg(row_to_json(rows)))
from (select name, amenity, st_asgeojson(st_transform(way, 4326))::json geometry
from interest
where st_dwithin(st_transform(way, 4326)::geography, st_setsrid(st_makepoint(17.107341368562373, 48.148054257071266), 4326), 250)
and (amenity='restaurant' or amenity='pub' or amenity='cafe')
) as rows

pgr_dijkstra
select array_to_json(array_agg(row_to_json(rows)))
from (
select ways.name, st_asgeojson(st_transform(ways.way, 4326))::json geometry
from pgr_dijkstra('select osm_id as id, source, target, length as cost from ways',
(select ways.source source_id
from ways
order by st_distance(way, 'SRID=4326;POINT(17.107341368562373 48.148054257071266)'::geometry)
limit 1),
(select ways.source target_id
from ways
order by st_distance(way, 'SRID=4326;POINT(17.107197 48.146478)'::geometry)
limit 1),
directed := false) dij
join ways on (dij.edge = ways.osm_id)
) as rows
Frontendová časť je HTML stránka (map.html), ktorá zobrazuje
mapbox.js widget. Stránka takisto zobrazuje bočný panel s polami
pre vstup užívateľa a textový výstup.
Stránka obsahuje javascriptové funkcie zodpovedné za:
Backend aplikácia je napísaná vo Flasku a je zodpovedná za dopytovanie geo dát, vytváranie zoznamu geojson objektov a vytvorenie REST rozhrania.
Dáta boli získané z Open Street Maps a importované s použitím
osm2pgsql nástroja.
create table interest as
(select name, amenity, way
from planet_osm_point
where (amenity='restaurant' or amenity='pub' or amenity='cafe')
and name is not null
union
select name, amenity, st_transform(st_centroid(way), 4326) as way
from planet_osm_polygon
where (amenity='restaurant' or amenity='pub' or amenity='cafe')
and name is not null
)
create table ways as
select osm_id, name, way, st_length(way) as length
from planet_osm_roads
alter table ways
add column way_transform geometry;
update ways
set way_transform = st_transform(ways.way, 4326);
alter table ways add column "source" integer;
alter table ways add column "target" integer;
pgRouting vytvorenie topologie
select pgr_createtopology('ways', 0.00001, 'way', 'osm_id');
1. Nájdi v zadanej oblasti od vybraného bodu podľa výberu reštaurácie, krčmy alebo kaviarne
POST /api/points
{
"lng":number,
"lat":number,
"distance_meters":integer,
"restaurants":boolean,
"pubs":boolean,
"cafes":boolean
}
API vracia zoznam zariadení s občerstvením
[
{
"name":"Agnezo",
"amenity":"restaurant",
"geometry":{
"type":"Point",
"coordinates":[
17.1100946,
48.1474876
]
}
},
...
]
2. Nájdi cestu medzi dvomi zadanými bodmi
POST /api/lines
{
"lng_source":number,
"lat_source":number,
"lng_target":number,
"lat_target":number
}
API vracia zoznam ciest, ktoré tvoria trasu
[
{
"name":"Hodžovo námestie",
"geometry":{
"type":"LineString",
"coordinates":[
[
17.1084367,
48.1485912
],
[
17.1081819,
48.14842
],
[
17.107594,
48.1480647
]
]
}
},
...
]