Overview

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.

Spustenie aplikácie

Scenáre

1. Zobrazenie zariadení s občerstvením v okolí

uc1.png

  1. umiestnenie vybranie pozície (modrá)
  2. vybratie typov zariadení: reštaurácie, krčmy alebo kaviarne
  3. zadanie maximálnej vzdialenosti od vybranej pozície
  4. zobrazenie zariadení, farebne podľa ich typu

  5. 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
    

2. Zobrazenie cesty do vybraného zariadenia

uc2.png

  1. vybratie konkrétneho zariadenia (oranžová)
  2. zobrazenie mena a typu v bočnom panely
  3. zobrazenie najkratšej cesty do zariadenia pomocov pgr_dijkstra
  4. príklad query: Vyhľadanie cesty z pozície [17.107341368562373, 48.148054257071266] na pozíciu [17.107197 48.146478]
    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
    

Frontend

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

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

Dáta boli získané z Open Street Maps a importované s použitím osm2pgsql nástroja.

Pomocné tabuľky

Vytvorenie pomocnej tabuľky pre všetky pomenované občerstvenia
Vytvorenie pomocnej tabuľky pre dĺžky všetkých cies
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;
Pomocov rozšírenia pgRouting vytvorenie topologie
select pgr_createtopology('ways', 0.00001, 'way', 'osm_id');

Api

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
                ]
            ]
        }
    },
    ...
]