====== 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