Baza danych: osmosis_db
, baza zostanie dostarczona później.
Aby stworzyć opis powyższego przykładu w bazie danych, należy:
way
, na których będą definiowane pasy,smnode
dla tych współrzędnych,way
w oparciu o utworzone elementy smnode
.Określenia należy dokonać na podstawie danych znajdujących się w bazie, zaimportowanych z OSM. Dla powyższego przykładu:
id
24193276id
24193282id
114324804id
21929772Współ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:
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):
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
:
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.
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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
Baza danych: rdnr
, baza zostanie dostarczona później.
Skrypt: sample_data_piastowska.sql
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' );
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' );
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.
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;
sample_data_piastowska_K1-N.sql
, punkt pomiarowy V-S.-- 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;
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.
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();
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' ) ;
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' ) ;
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:
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.
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.
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)
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)'));
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);
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;
Poniższa sekcja dotyczy wartości paramtetrów monitorowania.
Do umieszczenia danych konieczne jest wykonanie dwóch zapytań INSERT
:
MonitoringParameterValue
) oraz 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.
http://insigma.kt.agh.edu.pl/K1-S
.6
.2012-04-18 14:15:55
2012-04-30 14:15:55
1
.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;
Jako dane testowe umieszczono w bazie danych Mapy Statycznej (baza osmosis_db
) informacje o:
W repozytorium RDNR (baza rdnr
) umieszczono informacje o:
Uwaga: w RDNR nie umieszczono informacji o Sensorach.
informacje o parkingu