====== Przykłady Użycia RDNR ======
Rozmieszczenie instancji parametrów monitorwania przedstawia poniższy rysunek.
{{skrzyzowanie_agh.jpg?600}}
===== Umieszczanie informacji na mapie statycznej =====
Baza danych: ''osmosis_db'', baza zostanie dostarczona później.
Aby stworzyć opis powyższego przykładu w bazie danych, należy:
* określić elementy ''way'', na których będą definiowane pasy,
* określić współrzędne początków i końców pasów,
* stworzyć elementy ''smnode'' dla tych współrzędnych,
* stworzyć elementy ''way'' w oparciu o utworzone elementy ''smnode''.
==== Określenie elementów way ====
Określenia należy dokonać na podstawie danych znajdujących się w bazie, zaimportowanych z OSM. Dla powyższego przykładu:
* droga od północy (ul. Piastowska) ma ''id'' 24193276
* droga od południa (ul. Piastowska) ma ''id'' 24193282
* droga od zachodu (ul. Armii Krajowej) ma ''id'' 114324804
* droga od wschodu (ul. Nawojki) ma ''id'' 21929772
==== Określenie współrzędnych początków i końców pasów ====
Współrzędne można określić na podstawie pomiaru w terenie, lub np. w oparciu o zdjęcie lotnicze w Google Maps.
Zastosowano następujące określenia pasów:
* F - jazda na wprost
* L - skręt w lewo
* R - skręt w prawo
oraz kombinacje powyższych.
Dla powyższego przykładu mamy następujące współrzędne początków i końców pasów (oraz ew. punktów pośrednich):
* dla drogi od północy (ul. Piastowska):
* pas FL: 50.070792, 19.904298 [18], 50.070293, 19.904045 [19]
* pas FR: 50.070800, 19.904257 [20] – 50.070636, 19.904154 [21] – 50.070299, 19.904000 [22]
* dla drogi od południa (ul. Piastowska):
* pas FL: 50.069064, 19.903589 [8] – 50.069815, 19.903919 [9]
* pas FR: 50.069037, 19.903628 [10] – 50.069800, 19.903966 [11]
* dla drogi od zachodu (ul. Armii Krajowej):
* pas FR: 50.070180, 19.902561 [12] – 50.070031, 19.903616 [13]
* pas F: 50.070212, 19.902566 [14] – 50.070064, 19.903624 [15]
* pas L: 50.070193, 19.902915 [16] – 50.070089, 19.903642 [17]
* dla drogi od wschodu (ul. Nawojki):
* pas FR: 50.069906, 19.905308 [6] – 50.070070, 19.904351 [7]
* pas F: 50.069875, 19.905290 [4] – 50.070038, 19.904341 [5]
* pas L: 50.069937, 19.904814 [2] – 50.070009, 19.904334 [3]
==== Dodanie elementów smnode ====
Aby dodać węzły ''smnode'' dla pasów należy użyć następującego kodu SQL:
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904814 50.069937)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904334 50.070009)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.905290 50.069875)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904341 50.070038)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.905308 50.069906)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904351 50.070070)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.903589 50.069064)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.903919 50.069815)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.903628 50.069037)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.903966 50.069800)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.902561 50.070180)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.903616 50.070031)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.902566 50.070212)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.903624 50.070064)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.902915 50.070193)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.903642 50.070089)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904298 50.070792)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904045 50.070293)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904257 50.070800)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904154 50.070636)', 4326));
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.904000 50.070299)', 4326));
W wyniku powyższych zapytań na istniejącej bazie danych uzyskano następujące ''id'' elementów ''smnode'':
* dla drogi od północy (ul. Piastowska), id 24193276:
* pas FL: [18] - [19]
* pas FR: [20] - [21] - [22]
* dla drogi od południa (ul. Piastowska), id 24193282:
* pas FL: [8] - [9]
* pas FR: [10] - [11]
* dla drogi od zachodu (ul. Armii Krajowej), id 114324804:
* pas FR: [12] - [13]
* pas F: [14] - [15]
* pas L: [16] - [17]
* dla drogi od wschodu (ul. Nawojki), id 21929772:
* pas FR: [6] - [7]
* pas F: [4] - [5]
* pas L: [2] - [3]
==== Dodanie elementów lane ====
W oparciu o utworzone elementy ''smnode'' możemy utworzyć elementy ''lane''. Zakładamy, że numer pasa 1 oznacza pas skrajnie prawy, kolejne pasy (idąc w lewo) mają numery 2, 3, itd.
=== dla drogi od północy (ul. Piastowska), id 24193276 ===
* pas FL: [18] - [19]
INSERT INTO lanes (number, way_id) VALUES (2, 24193276); -- id: 1
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (1, 18, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (1, 19, 2);
* pas FR: [20] - [21] - [22]
INSERT INTO lanes (number, way_id) VALUES (1, 24193276); -- id: 2
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (2, 20, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (2, 21, 2);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (2, 22, 3);
=== dla drogi od południa (ul. Piastowska), id 24193282 ===
* pas FL: [8] - [9]
INSERT INTO lanes (number, way_id) VALUES (2, 24193282); -- id: 3
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (3, 8, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (3, 9, 2);
* pas FR: [10] - [11]
INSERT INTO lanes (number, way_id) VALUES (1, 24193282); -- id: 4
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (4, 10, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (4, 11, 2);
=== dla drogi od zachodu (ul. Armii Krajowej), id 114324804 ===
* pas FR: [12] - [13]
INSERT INTO lanes (number, way_id) VALUES (1, 114324804); -- id: 5
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (5, 12, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (5, 13, 2);
* pas F: [14] - [15]
INSERT INTO lanes (number, way_id) VALUES (2, 114324804); -- id: 6
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (6, 14, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (6, 15, 2);
* pas L: [16] - [17]
INSERT INTO lanes (number, way_id) VALUES (3, 114324804); -- id: 7
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (7, 16, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (7, 17, 2);
=== dla drogi od wschodu (ul. Nawojki), id 21929772 ===
* pas FR: [6] - [7]
INSERT INTO lanes (number, way_id) VALUES (1, 21929772); -- id: 8
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (8, 6, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (8, 7, 2);
* pas F: [4] - [5]
INSERT INTO lanes (number, way_id) VALUES (2, 21929772); -- id: 9
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (9, 4, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (9, 5, 2);
* pas L: [2] - [3]
INSERT INTO lanes (number, way_id) VALUES (3, 21929772); -- id: 10
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (10, 2, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (10, 3, 2);
==== Punkty pomiarowe ====
Poniżej podano koordynaty punktów pomiarowych: ZV-S, ZV-N, ZV-W, ZV-E.
ZV-W:
50.070183, 19.903592
ZV-S:
50.069798, 19.903781
ZV-E:
50.069902, 19.904454
ZV-N:
50.070301, 19.904186
===== Umieszczanie informacji o parametrach monitorowania =====
Baza danych: ''rdnr'', baza zostanie dostarczona później.
==== Dodanie informacji o parametrach monitorowania ====
=== Typy parametrów monitorowania ===
Skrypt: ''sample_data_piastowska.sql''
* Długość kolejki z wideodetektora i metadane
INSERT INTO param_monitoringparametertype (
id,
label,
applies_to_lane,
applies_to_area,
applies_to_crossroads,
applies_to_location,
applies_to_turn,
datatype,
is_deprecated,
min_value,
is_directly_measured,
max_value,
unit
) VALUES (
1,
'Długość kolejek pojazdow, nadjezdzajacych z zadanych kierunkow.',
true,
false,
false,
false,
true,
'xsd:integer',
false,
'0',
true,
'1000',
'http://mapserv.kt.agh.edu.pl/ontologies/units.owl#Unit.m'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
1,
'param_monitoringparametertype',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.LengthQueueVehiclesMonitoringaParameterType'
);
* Prędkość z wideodetektora i metadane
INSERT INTO param_monitoringparametertype (
id,
label,
applies_to_lane,
applies_to_area,
applies_to_crossroads,
applies_to_location,
applies_to_turn,
datatype,
is_deprecated,
min_value,
is_directly_measured,
max_value,
unit
) VALUES (
2,
'Prędkość pojazdow poruszajacych się w zadanych kierunkach',
true,
false,
false,
false,
false,
'xsd:integer',
false,
'0',
true,
'200',
'http://mapserv.kt.agh.edu.pl/ontologies/units.owl#Unit.km_h'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
2,
'param_monitoringparametertype',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.VelocityVehiclesMonitoringaParameterType'
);
* Ilość pojazdów z wideodetektora i metadane
INSERT INTO param_monitoringparametertype (
id,
label,
applies_to_lane,
applies_to_area,
applies_to_crossroads,
applies_to_location,
applies_to_turn,
datatype,
is_deprecated,
min_value,
is_directly_measured,
max_value,
unit
) VALUES (
3,
'Liczba pojazdow poruszającch się w zadanym kierunku.',
true,
false,
false,
false,
false,
'xsd:integer',
false,
'0',
true,
'200',
'http://mapserv.kt.agh.edu.pl/ontologies/units.owl#Unit.km_h'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
3,
'param_monitoringparametertype',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.CountVehiclesMonitoringaParameterType'
);
Uwaga: informacje o sensorach zostały w niniejszym przykładzie pominięte. W środowisku produkcyjnym powinny być umieszczone w odpowiednich tabelach.
=== Instancje parametrów monitorowania ===
* dla drogi od Północy, ul. Piastowska, pas FR, skrypt: ''sample_data_piastowska_K1-N.sql'', kolejka pomiarowa K1-N
-- Umożliwienie przyporządkowanie instancji do lokalizacji (turn, area, lane, crossroads, albo lokalizacji geograficznej)
INSERT INTO param_instanceassignment (
id
) VALUES (
1
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
1,
'param_instanceassignment',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.LaneInstanceAss
ignment'
);
-- Instancja parametru monitorowania
INSERT INTO param_monitoringparameterinstance (
id,
time_interval,
type,
label,
assignment,
min_frequency,
max_frequency,
lifetime,
time_created
) VALUES (
1,
90,
1, -- http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.LengthQueu
eVehiclesMonitoringaParameterType
'K1-N',
2,
0.0166, -- co 60 s
0.0083, -- co 120 s
360,
'2012-04-18 13:13:04'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
1,
'param_monitoringparameterinstance',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.FixedMonitoring
ParameterInstance'
);
-- Powiązanie instancji z lokalizacją
INSERT INTO param_instanceassignment_sm_lane (
param_instanceassignment,
sm_lane
) VALUES (
1,
2 -- lane id: 2, ul. Piastowska, pas FR
);
-- Stan parametru monitorowania
INSERT INTO param_monitoringparameterstate (
id,
parameter_instance,
time_entered,
type
) VALUES (
1,
1,
'2012-04-18 13:13:04',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#MonitoringParameterSt
ateType.Active'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
1,
'param_monitoringparameterstate',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaPara
meterState'
);
-- Powiązanie stanu z instancją
UPDATE param_monitoringparameterinstance
SET current_state=1
WHERE id=1;
* dla drogi od Południa, ul. Piastowska, skrypt: ''sample_data_piastowska_K1-N.sql'', punkt pomiarowy V-S.\\ Uwaga: punkt reprezentowany w RDNR bez powiązania z Mapą Statyczną tzw. instancja niepowiązana.
-- Instance: V-S
BEGIN;
-- InstanceAssignment
-- point, geo location
INSERT INTO imp_location (
id,
latitude,
longitude
) VALUES (
1,
50.069798,
19.903781
);
INSERT INTO param_instanceassignment (
id,
location
) VALUES (
2,
1
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
2,
'param_instanceassignment',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.LocationInstanceAssignment'
);
-- MonitoringParameterInstance
INSERT INTO param_monitoringparameterinstance (
id,
time_interval,
type,
label,
assignment,
min_frequency,
max_frequency,
lifetime,
time_created
) VALUES (
2,
90,
2, -- http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.VelocityVehiclesMonitoringaParameterType
'V-S',
1,
0.0166, -- co 60 s
0.0083, -- co 120 s
360,
'2012-04-18 13:13:04'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
2,
'param_monitoringparameterinstance',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.FixedMonitoringParameterInstance'
);
-- MonitoringParameterState
INSERT INTO param_monitoringparameterstate (
id,
parameter_instance,
time_entered,
type
) VALUES (
2,
2,
'2012-04-18 13:13:04',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#MonitoringParameterStateType.Active'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
2,
'param_monitoringparameterstate',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterState'
);
-- MonitoringParameterInstance id:2, update: current_state=2
UPDATE param_monitoringparameterinstance
SET current_state=2
WHERE id=2;
=== Pozostałe instancje ===
Analogicznie należy dodać pozostałe instancje dotyczące instancji reprezentujących pomiary: K1-W, K2-W, K3-W, K1-E, K2-E, K3-E, K2-N, V-S, V-W, V-E, V-N, Z-S, Z-N, Z-W, Z-E.
=== Instancje niezwiązane ===
Należy zwrócić uwagę, że zogdnie z Ontologią, instancja parametru monitorowania nie musi być związana z obiektem mapy statycznej (turn, area, lane, crossroad).
W tym przypadku do lokalizacji instancji wykorzystywane są koordynaty geograficzne umieszczane w tabeli ''imp_location''.
Ponieważ porządane jest wyszukiwanie z uwzględnieniem koordynatów geograficznych ''rdnr'' musi zostac wzbogacone o rozszerzenie PostGIS:
DBNAME=rdnr
POSTGIS_DIR=/usr/share/postgresql/8.4/contrib/postgis-1.5
createlang -d $DBNAME plpgsql
psql -d $DBNAME -f $POSTGIS_DIR/postgis.sql
psql -d $DBNAME -f $POSTGIS_DIR/spatial_ref_sys.sql
Ponadto do tabeli ''imp_location'' należy dodać kolumne przestrzenną ''geom'':
SELECT AddGeometryColumn('imp_location', 'geom', 4326, 'GEOMETRY', 2);
Oraz zapewnić synchronizację wartości ''latitude'' i ''longitude'' z kolumną przestrzenną :
UPDATE imp_location SET geom=GeomFromText('POINT('||longitude||' '||latitude||')', 4326)
Powyższe wymagania zostały spełnione: zainstalowano rozszerzenie PostGIS dla ''rdnr'' oraz zaprogramowano odpowiedni wyzwalacz na tabeli ''imp_location'' automatycznie uaktualniający wartości kolumny ''geom'' na podstawie ''latitude'' i ''longitude'':
-- Adding geom column to imp_location
SELECT AddGeometryColumn('imp_location', 'geom', 4326, 'GEOMETRY', 2);
-- A trigger for generating appropriate values in imp_location.geom, complying with PostGIS.
CREATE or REPLACE FUNCTION imp_location_geom_update_trg() RETURNS trigger AS $$
BEGIN
NEW.geom=GeomFromText('POINT(' ||NEW.longitude||' '||NEW.latitude||')', 4326);
return NEW;
END;
$$ LANGUAGE 'plpgsql';
CREATE TRIGGER imp_location_geom BEFORE INSERT OR UPDATE ON imp_location FOR each row execute procedure imp_location_geom_update_trg();
==== Dodanie wartości parametrów monitorowania ====
=== dla drogi od północy (ul. Piastowska) ===
W poniższym przykładzie dodano 3 wartości parametrów monitorowania do instancji związanej z pasem FR na północnym odcinku ul. Piastowskiej (oznaczenie K1-N na rysunku skrzyżowania).
Są to pierwsze trzy rekordy z przykładowych danych pochodzących z wideodetektora (kolumna K1-N, zamieszczone na początku dokumentu).
-- Wartości parametrów monitorowania.
INSERT INTO param_monitoringparametervalue (
id,
confidence,
precision,
valid_until,
time_measured,
value,
instance
) VALUES
( -- K1-N
1,
1,
'1',
'2012-04-30 14:15:55',
'2012-04-18 14:15:55',
'18',
1
),
( -- K1-N
2,
1,
'1',
'2012-04-30 14:17:25',
'2012-04-18 14:17:25',
'18',
1
),
( -- K1-N
3,
1,
'1',
'2012-04-30 14:18:55',
'2012-04-18 14:18:55',
'19',
1
)
;
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES
(
1,
'param_monitoringparametervalue',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterValue'
),
(
2,
'param_monitoringparametervalue',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterValue'
),
(
3,
'param_monitoringparametervalue',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterValue'
)
;
=== dla drogi od południa (ul. Piastowska) ===
W poniższym przykładzie dodano 3 wartości parametrów monitorowania do instancji związanej z punktem V-S na południowym odcinku ul. Piastowskiej (oznaczenie V-S na rysunku skrzyżowania).
Są to pierwsze trzy rekordy z przykładowych danych pochodzących z wideodetektora (kolumna V-S, zamieszczone na początku dokumentu).
INSERT INTO param_monitoringparametervalue (
id,
confidence,
precision,
valid_until,
time_measured,
value,
instance
) VALUES
( -- V-S
4,
1,
'1',
'2012-04-30 14:15:55',
'2012-04-18 14:15:55',
'31',
2
),
( -- V-S
5,
1,
'1',
'2012-04-30 14:17:25',
'2012-04-18 14:17:25',
'34',
2
),
( -- V-S
6,
1,
'1',
'2012-04-30 14:18:55',
'2012-04-18 14:18:55',
'33',
2
)
;
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES
(
4,
'param_monitoringparametervalue',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterValue'
),
(
5,
'param_monitoringparametervalue',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterValue'
),
(
6,
'param_monitoringparametervalue',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterValue'
)
;
===== Odczyt parametrów monitorowania z danego obszaru =====
Instancje parametrów monitorowania mogą być przyporządkowane do obiektów Mapy Statycznej: Area, Crossroads, Lane, Turn, albo do lokalizacji geograficznej określonej przez długość, szerokość, wysokość oraz promień (na podstawie Ontologii parametrów monitorowania: http://mapserv.kt.agh.edu.pl/ontologies/param.owl )
Zatem procedura odczytu parametrów monitorowania dla zdefiniowanego obszaru powinna przebiegać następująco:
- Określenie obszaru będącego krzywą zamkniętą: A.
- Odnalezienie odpowiednio identyfikatorów obiektów Area, Crossroads, Lana lub Turn na mapie statycznej (baza osmosis_db): zbiór identyfikatorów Id
- Identyfikacja tabel w RDNR (baza rdnr) przechowujących dane o instancjach i przyporządkowaniu instancji, na podstawie tabeli metadanych oraz ontologii
- Identyfikacja instancji skojarzonych z Id: zbiór identyfikatorów instajcji IdI
- Poszerzenie zbioru IdI o instancje o zdefiniowanej lokalizacji (niepowiązane) przecinającej się z A
- Odczyt wartości parametrów monitorowania dla instancji IdI.
==== Identyfikaotry Lane, Crossroad, Turn, Area ====
W niniejszej sekscji opisano znajdywanie identyfikatorów obiektów, do których mogą być przyporządkowane instancje parametrów monitorowania (baza osmosis_db) tj. Lane, Crossroad, Turn, Area.
Proces poszukiwania należy rozpocząć od zdefiniowania obszaru za pomocą współrzędnych geograficznych, przykładowo:
POLYGON((19.9 50.1, 19.9 49.98, 20 49.98, 20 50.1, 19.9 50.1))
Wykorzystując funkcje PostGIS można odnaleźć identyfikatory obiektów:
-- dla Crossroad
SELECT id FROM crossroads
WHERE ST_Intersects(boundary, ST_GeomFromText('POLYGON((19.9 50.1, 19.9 49.98, 20 49.98, 20 50.1, 19.9 50.1))', 4326));
-- dla Area
SELECT ways.id FROM ways, way_tags, way_geometry
WHERE way_tags.k='area' AND way_tags.v='yes' AND way_tags.way_id=ways.id AND
ST_Intersects(way_geometry.geom, ST_GeomFromText('POLYGON((19.9 50.1, 19.9 49.98, 20 49.98, 20 50.1, 19.9 50.1))', 4326)) AND
way_geometry.way_id=ways.id;
-- dla Lane
SELECT id FROM lanes
WHERE ST_Intersects(geom, ST_GeomFromText('POLYGON((19.9 50.1, 19.9 49.98, 20 49.98, 20 50.1, 19.9 50.1))', 4326));
-- dla Turn
SELECT id FROM turns
WHERE ST_Intersects(geom, ST_GeomFromText('POLYGON((19.9 50.1, 19.9 49.98, 20 49.98, 20 50.1, 19.9 50.1))', 4326));
Za pomocą w/w otrzymuje się zbiór Id.
==== Identyfikacja table RDNR na podstawie Ontologii ====
Należy wybrać klasę oraz własność klasy, dla której chcemy odnaleźć wartości w ''rdnr''.
Przykładowo, wartości parametrów monitorowania definiowane są przez własność http://mapserv.kt.agh.edu.pl/ontologies/param.owl#value klasy http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringParameterValue .
Zapytanie:
SELECT tbl, att FROM
meta_param
WHERE
cls='http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringParameterValue'
and prop='http://mapserv.kt.agh.edu.pl/ontologies/param.owl#value';
tbl | att
--------------------------------+-------
param_MonitoringParameterValue | value
(1 row)
Identyfikuje lokalizację danych w tabeli ''param_MonitoringParameterValue'', kolumna: ''value''.
Podobnie należy odnaleźć informacje na temat powiązania wartości z instancjami oraz instanacji z obiektami z Mapy Statycznej.
==== Odczyt wartości parametrów monitorowania dla instancji powiązanych z obiektami Mapy Statycznej ====
Mając zidentyfikowane tabele można wykonać zapytanie pobierające odpowiednie wartości parametrów monitorowania powiązane z obiektami Mapy Statycznej.
Przykładowo dla obiektów Lane o identyfikatorach: 1,2,3,4,5,6,7,8,9,10 (identyfikatory zwrócone jako rezultat zapytania identyfikującego obiekty Lane w podanym obszarze, w poprzedniej sekcji) zapytanie zwracające wszystkie wartości parametrów monitorowania ma postać:
SELECT label, time_measured,value
FROM param_monitoringparametervalue v
JOIN param_monitoringparameterinstance i ON (v.instance=i.id)
JOIN param_instanceassignment a ON (i.assignment=a.id)
JOIN param_instanceassignment_sm_lane l ON (l.param_instanceassignment=a.id)
WHERE sm_lane in (1,2,3,4,5,6,7,8,9,10);
label | time_measured | value
-------+---------------------+-------
K1-N | 2012-04-18 14:15:55 | 18
K1-N | 2012-04-18 14:17:25 | 18
K1-N | 2012-04-18 14:18:55 | 19
(3 rows)
==== Odczyt wartości parametrów monitorowania dla instancji niepowiązanych ====
Dla wartości parametrów monitorowania instancji niepowiązanych z Mapą Statyczną, należy posłużyć się bezpośrednio koordynatami wybranego obszaru.
Poniższe przykładowe zapytanie zwraca informacje o wartościach parametrów monitorowania dla instancji niepowiązanych, których punktowe współrzędne geograficzne znajdują się w zdefinuowanym obszarze.
SELECT label, time_measured,value
FROM param_monitoringparametervalue v
JOIN param_monitoringparameterinstance i ON (v.instance=i.id)
JOIN param_instanceassignment a ON (i.assignment=a.id)
JOIN imp_location l ON (l.id=a.location)
WHERE ST_Intersects(geom, ST_GeomFromText('POLYGON((19.9 50.1, 19.9 49.98, 20 49.98, 20 50.1, 19.9 50.1))', 4326));
label | time_measured | value
-------+---------------------+-------
V-S | 2012-04-18 14:15:55 | 31
V-S | 2012-04-18 14:17:25 | 34
V-S | 2012-04-18 14:18:55 | 33
(3 rows)
W przypadku zdefiniowania lokalizacji instancji za pomocą współrzędnych geograficznych i promienia (''param_instanceassignment.radius'') można posłużyć się poniższymi funkcjami PostGIS:
Odległość punktu od obszaru:
SELECT ST_Distance(ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'), ST_GeomFromText('POINT(12 5)'));
Wersja z podzapytaniem i rzutowaniem:
SELECT ST_Distance(ST_GeomFromText((SELECT 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))')::text), ST_GeomFromText('POINT(13 12)'));
===== Parking D-6 =====
{{:pl:ztb:img_20150421_104000.jpg?600|}}
==== Mapa statyczna ====
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.9145686 50.0665605)', 4326)); -- 23
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.9146225 50.0666678)', 4326)); -- 24
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.9146608 50.0666889)', 4326)); -- 25
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.9147913 50.0666598)', 4326)); -- 26
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.9148792 50.0666689)', 4326)); -- 27
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.9152793 50.0665842)', 4326)); -- 28
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.9148409 50.0666334)', 4326)); -- 29
INSERT INTO smnodes (geom) VALUES (ST_GeomFromText('POINT(19.9147203 50.0664021)', 4326)); -- 30
INSERT INTO lanes (number, way_id) VALUES (1, 286755420); -- 11
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (11, 29, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (11, 30, 2);
INSERT INTO lanes (number, way_id) VALUES (1, 323800732); -- 12
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (12, 26, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (12, 25, 2);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (12, 24, 3);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (12, 23, 4);
INSERT INTO lanes (number, way_id) VALUES (1, 323800732); -- 13
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (13, 27, 1);
INSERT INTO lane_smnodes (lane_id, smnode_id, sequence_id) VALUES (13, 28, 2);
==== Mapa dynamiczna ====
Parametr monitorowania: obecność pojazdu.
BEGIN;
-- MonitoringParameterType
-- video_presence
-- http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.PresenceVehiclesMonitoringaParameterType -- FIXME might be not present in the ontology, unable to verify the ontology is offline
INSERT INTO param_monitoringparametertype (
id,
label,
applies_to_lane,
applies_to_area,
applies_to_crossroads,
applies_to_location,
applies_to_turn,
datatype,
is_deprecated,
min_value,
is_directly_measured,
max_value,
unit
) VALUES (
4,
'Wykrywanie ruchu',
true,
true,
true,
true,
true,
'xsd:integer',
false,
'0',
true,
'1',
'http://mapserv.kt.agh.edu.pl/ontologies/units.owl#Unit.m'
);
-- video_queue, metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
4,
'param_monitoringparametertype',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.PresentVehiclesMonitoringaParameterType' -- FIXME might be not present in the ontology, unable to verify the ontology is offline
);
COMMIT;
Przykładowa instanacja wraz z przykładowymi danymi.
BEGIN;
-- Instance: K1-S, http://insigma.kt.agh.edu.pl/K1-S
-- InstanceAssignment
INSERT INTO param_instanceassignment (
id
) VALUES (
17
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
17,
'param_instanceassignment',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.LaneInstanceAssignment'
);
-- MonitoringParameterInstance
INSERT INTO param_monitoringparameterinstance (
id,
time_interval,
type,
label,
assignment,
min_frequency,
max_frequency,
lifetime,
time_created
) VALUES (
17,
90,
1, -- http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.LengthQueueVehiclesMonitoringaParameterType
'http://insigma.kt.agh.edu.pl/K1-S',
17,
0.0166, -- co 60 s
0.0083, -- co 120 s
360,
'2012-04-18 13:13:04'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
17,
'param_monitoringparameterinstance',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.FixedMonitoringParameterInstance'
);
-- InstanceAssignmentSmLane
INSERT INTO param_instanceassignment_sm_lane (
param_instanceassignment,
sm_lane
) VALUES (
17,
11 -- lane id: 11
);
-- MonitoringParameterState
INSERT INTO param_monitoringparameterstate (
id,
parameter_instance,
time_entered,
type
) VALUES (
17,
17,
'2012-04-18 13:13:04',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#MonitoringParameterStateType.Active'
);
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES (
17,
'param_monitoringparameterstate',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterState'
);
-- MonitoringParameterInstance id:15, update: current_state=1
UPDATE param_monitoringparameterinstance
SET current_state=1
WHERE id=17;
-- Sensors omitted for now, TODO
-- MonitoringParameterValue
INSERT INTO param_monitoringparametervalue (
id,
confidence,
precision,
valid_until,
time_measured,
value,
instance
) VALUES
( -- K1-S
17,
1,
'1',
'2012-04-30 14:15:55',
'2012-04-18 14:15:55',
'18',
17
)
;
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES
(
17,
'param_monitoringparametervalue',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterValue'
)
;
COMMIT;
==== Przykładowe umieszczanie danych ====
Poniższa sekcja dotyczy wartości paramtetrów monitorowania.
Do umieszczenia danych konieczne jest wykonanie dwóch zapytań ''INSERT'':
* danych właściwych (''MonitoringParameterValue'') oraz
* metadanych (''meta_param_pk_table_class'') nawiązujących do ontologii.
Muszą one być wykonane w ramach tego samego połączenia z bazą danych w sekwencji: najpierw dane, potem metadane.
Najlepiej w ramach transakcji (tak jak w przykładzie poniżej), aby uniknąć ewentualnych niespójności.
* Instancja o etykiecie: ''http://insigma.kt.agh.edu.pl/K1-S''.
* Wartość pomiaru: ''6''.
* Czas pomiaru: ''2012-04-18 14:15:55''
* Ważność pomiaru: ''2012-04-30 14:15:55''
* Dokładność: ''1''.
* Pewność: ''1''.
BEGIN;
-- MonitoringParameterValue
INSERT INTO param_monitoringparametervalue (
confidence,
precision,
valid_until,
time_measured,
value,
instance
) VALUES
( -- K1-S
1,
'1',
'2012-04-30 14:15:55',
'2012-04-18 14:15:55',
'6', -- wartośc mierzona (value)
(SELECT id FROM param_monitoringparameterinstance WHERE label='http://insigma.kt.agh.edu.pl/K1-S') -- etykieta instancji (label)
)
;
-- metadata
INSERT INTO meta_param_pk_table_class (pk, tbl, cls) VALUES
(
(SELECT currval('pmpv_seq')),
'param_monitoringparametervalue',
'http://mapserv.kt.agh.edu.pl/ontologies/param.owl#param.MonitoringaParameterValue'
)
;
COMMIT;
===== Uwagi końcowe =====
Jako dane testowe umieszczono w bazie danych Mapy Statycznej (baza ''osmosis_db'') informacje o:
* 10 obiektach Lane modelujących sytuacje na testowym skrzyżowaniu.
W repozytorium RDNR (baza ''rdnr'') umieszczono informacje o:
* 3 typach instancji parametrów monitorowania,
* 2 instancjach (K1-N oraz V-S)
* 6 wartościach parametrów monitorowania, po 3 dla każdej z instancji.
Uwaga: w RDNR nie umieszczono informacji o Sensorach.
FIXME informacje o parkingu