GML w wolnym oprogramowaniu - Konferencja GML w praktyce
Transkrypt
GML w wolnym oprogramowaniu - Konferencja GML w praktyce
GML w wolnym oprogramowaniu Tomasz Kubik Politechnika Wrocławska Warszawa, 12 kwietnia 2012 Plan prezentacji • Narzędzia do transformacji UML/XMI do XSD • Programowe przetwarzanie dokumentów XSD/XML • Biblioteki i narzędzia wspierające XSD/XML/GML • Przykład: WFS (GML) + PostGIS T.Kubik: GML w wolnym oprogramowani 2/32 Transformacja UML-XSD T.Kubik: GML w wolnym oprogramowani 3/32 HollowWorld • Szablon UML, w którym uwględniono standardy związane z geoinformacją – Główne komponenty ISO 19100 pochodzą z ISO/TC 211 "Harmonized Model" (http://www.isotc211.org/hmmg/HTML/root.html), rozszerzone o UML-ową reprezentacją komponentów GML (z ISO 19136, których nie ma w modelu zharmonizowanym) oraz kilka drobnych rozszerzeń modelu Coverages (wg OGC 06-188r1), wspiera komponenty SWE • Umożliwia definiowanie własnych szablonów oraz wspierane formaty – EAP (projektu Enterprise Architect) – XMI 1.1 z rozszerzeniami ED (import pakietów do modeli EA) + XML plik dla profilu aplikacyjnego GML (do konfiguracji EA) – XMI 1.0 – bez diagramów (do importu pakietów do innych narzędzi UML) • • • Posiada profil UML dla EA zawierający standardowe stereotypy oraz otagowane wartości z SO 19136 Możliwa weryfikacja zgodności z profilem UML ISO 19136 w środowisku FullMoon (https://www.seegrid.csiro.au/wiki/bin/view/AppSchemas/FullMoon) Więcej informacji o szablonie schematu aplikacyjnego GML: – https://www.seegrid.csiro.au/wiki/AppSchemas/HollowWorld • Źródła do pobrania: – https://www.seegrid.csiro.au/subversion/HollowWorld/trunk/ T.Kubik: GML w wolnym oprogramowani 4/32 ShapeChange • http://shapechange.net/ Wymaga/wspiera profil UML – Schemat aplikacji powinien być zgodny z ISO 19109:2005, oraz GML 3.2 (ISO 19136) Annex E, GML 3.3 oraz ISO/TS 19139. – Obsługuje zdefiniowane w specyfikacji UML oraz standardach ISO serii 19100 (ISO/TS 19103:2005, ISO 19109:2005 oraz GML 3.2/ISO 19136:2007). • Format wejścia – Pliki projektów Enterprise Architect, dokumenty XMI 1.0, GSIP Microsoft Access Database • Format wyjścia (XML Schema) – – – – • GML 3.2 Encoding Rule, GML 3.3 Encoding Rule, ISO/TS 19139 Encoding Rule Wspiera generowanie reguł schematrnu z ograniczeń OCL SWE Common Data Model 2.0 Encoding Rule (w przygotowaniu) Inne: GSIP, INSPIRE, CityGML ADEs, ISO 19115 metadata profiles, OKSTRA Uruchamiany z linii komend: java -jar ShapeChange-2.0.0-SNAPSHOT.jar -Dfile.encoding=UTF-8 -c http://shapechange.net/resources/test/testXMI.xml T.Kubik: GML w wolnym oprogramowani 5/32 UML/INTERLIS-Editor oraz http://www.umleditor.org/ INTERLIS-compiler • Eksport diagramów (JPEG, WMF, SVG), import modeli (w tym XMI) • GUI dla większości elementów ze składnią INTERLIS • Odczyt/zapis w składni INTERLIS 2 – (bieżąca wersja to 2.3, standard szwajcarski SN612031) • Odczyt w składni INTERLIS 1 – Standard szwajcarski SN612030 • • • • • Wielojęzykowy interfejs (de,en,fr) Wbudowany weryfikator modelu Zapis schematów GML 3.2 Zapis katalogów cech w HTML i XML API do budowania rozszerzeń (Java, LGPL) T.Kubik: GML w wolnym oprogramowani 6/32 Schematy i pliki GML • Schemat GML zapisany jako XSD • Dane GML zapisane jako XML • Model danych wewnątrz aplikacji T.Kubik: GML w wolnym oprogramowani 7/32 Metody programowego przetwarzania dokumentów XML • DOM – Document Object Model – – – – • SAX – Simple API for XML – – – – • Ładowanie do pamięci Duże koszty (czas i zasoby) Pełny dostęp (dostęp do całego drzewa) Odczyt/zapis Przetwarzanie wsadowe Duża wydajność (czas i zasoby) Sekwencyjność, selektywność (dostęp do wybranych elementów) Tylko odczyt XML data binding – wiązanie XML-a – Reprezentowanie danych zawartych w dokumentach XML jako obiektów w pamięci komputera – Intuicyjność interfejsu, ale ograniczenie możliwości modyfikacji struktury i wartości (dotyczy dokumentów o tym samym schemacie XSD) – Mniejsze koszty niż przy DOM • Pull parsing – przetwarzanie strumieniowe – Aplikacja kontroluje przetwarzanie, „wyciągając” zdarzenia z parsera – Działanie parsera podobne do iteratora, kursora lub strumienia danych – duża wydajność, alternatywa do SAX T.Kubik: GML w wolnym oprogramowani 8/32 DOM i SAX T.Kubik: GML w wolnym oprogramowani 9/32 Standardy i implementacje Java • Java API for XML Processing (JAXP) – JSR 63 (JAXP 1.1 and 1.2) – JSR 5 (JAXP 1.0) – W3C Recomendation: Document Object Model (DOM) Level 2 Core Specification • Java Architecture for XML Binding (JAXB) – Java SE 7: JAXB 2.2.3 (JSR 222, maintenance release 2) – Java SE 6: JAXB 2.0 (JSR 222) T.Kubik: GML w wolnym oprogramowani 10/32 Działanie parsera DOM http://docs.oracle.com/cd/B19306_01/appdev.102/b14252/adx_j_parser.htm T.Kubik: GML w wolnym oprogramowani 11/32 Działanie pasera SAX http://docs.oracle.com/cd/B19306_01/appdev.102/b14252/adx_j_parser.htm T.Kubik: GML w wolnym oprogramowani 12/32 Parsowanie XML z JAXP http://docs.oracle.com/cd/B19306_01/appdev.102/b14252/adx_j_parser.htm T.Kubik: GML w wolnym oprogramowani 13/32 XML data binding: korzystanie z JAXB T.Kubik: GML w wolnym oprogramowani 14/32 Korzystanie z JAXB <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="KontaktType"> <xs:sequence> <xs:element name="Imie" type="xs:string"></xs:element> <xs:element name="Email" type="xs:string"></xs:element> </xs:sequence> </xs:complexType> <xs:element name="Kontakt" type="KontaktType"></xs:element> </xs:schema> <?xml version="1.0" encoding="UTF-8"?> <Kontakt> <Imie>Jan</Imie> <Email>[email protected]</Email> </Kontakt> > xjc dane.xsd JAXBContext jc = JAXBContext.newInstance("generated" ); Unmarshaller u = jc.createUnmarshaller(); FileInputStream f = new FileInputStream("mojeDane.xml"); JAXBElement<generated.KontaktType> k = (JAXBElement<generated.KontaktType>) u.unmarshal(f); System.out.println(k.getValue().getImie()); System.out.println(k.getEmail ().getEmail()); T.Kubik: GML w wolnym oprogramowani 15/32 CodeSynthesis XSD http://www.codesynthesis.com/products/xsd/ • Kompilator schematów XML do C++, open-source, cross-platform • Generuje klasy C++ pozwalające na parsowanie plików XML oraz serializowanie danych do plików XML (file-per-schema, file-per-type) • Nazwy występujące w wygenerowanych automatycznie klasach odzwierciedlają nazwy ze schematu • Używa statycznego typowania, co pozwala wychwytywać błędy na etapie kompilacji • Bazuje na bibliotece Xerces-C++ • Wspiera dwa mapowania: – in-memory C++/Tree (podobnie do DOM) – stream-oriented C++/Parser (podobnie do SAX) <?xml version="1.0" encoding="UTF-8"?> <Kontakt> <Imie>Jan</Imie> <Email>[email protected]</Email> </Kontakt> auto_ptr<Kontakt> k = Kontakt ("c.xml"); cout << k->imie () << ", " << k->email () << endl; T.Kubik: GML w wolnym oprogramowani 16/32 CodeSynthesis XSD - różnice w przetwarzaniu XML <?xml version="1.0" encoding="UTF-8"?> <Kontakt> <Imie>Jan</Imie> <Email>[email protected]</Email> </Kontakt> // DOM DOMElement* k = ... DOMNodeList* l; l = k->getElementsByTagName ("Imie"); DOMNode* imie = l->item (0); l = c->getElementsByTagName ("Email"); DOMNode* email = l->item (0); cout << name->getTextContent () << ", „ << email->getTextContent () << endl; // XML Binding: C++/Tree Kontakt k = ... cout << k.imie () << ", " << k.email () << endl; T.Kubik: GML w wolnym oprogramowani 17/32 CodeSynthesis XSD - różnice w przetwarzaniu XML <?xml version="1.0" encoding="UTF-8"?> <Kontakt> <Imie>Jan</Imie> <Email>[email protected]</Email> </Kontakt> // SAX class KontaktParser: ... { virtual void endElement (const string& name) { if (name == "Imie") cout << ", " else if (name == "Email") cout << endl; } virtual void characters (const string& s) { cout << s; } }; // XML Binding: C++/Parser class KontaktParser: ... { virtual void imie (const string& n){ cout << n << ", "; } virtual void email (const string& e){ cout << e << endl; } }; T.Kubik: GML w wolnym oprogramowani 18/32 CodeSynthesis XSD - wspierane standardy i schematy • • • • • • • • • • • • • • • • • • RSS 2.0 XML Metadata Interchange (XMI) Dimensional Markup Language (DML) Deployment and Configuration (DnC) XML Schema Standard Type Library (XSSTL) XML-Signature Syntax and Processing (XMLDSIG) Open Vulnerability and Assessment Language (OVAL) Financial products Markup Language (FpML) ACORD Insurance Standard CoT (Cursor On Target) COLLADA (COLLAborative Design Activity) FpML (Financial products Markup Language) NIST-ITL (Interchange of Fingerprint, Facial, & Other Biometric Information) RailML (Data exchange format for railway applications) SMIL (Synchronized Multimedia Integration Language) UDDI (Universal Description, Discovery & Integration) X3D (Integrated 3D graphics and multimedia framework) 3D XML (3D data sharing) T.Kubik: GML w wolnym oprogramowani 19/32 CodeSynthesis XSD - GML • GML (Geography Markup Language) – 3.1.1 (C++/Tree mapping, file-per-schema) • rozwiązano problem zapętlenia zależności smil20.xsd and smil20-language.xsd – 3.2.0 (C++/Tree mapping, file-per-type) • pliki w jednym katalogu lub podkatalogach – http://wiki.codesynthesis.com/Schemas/GML • CityGML (Virtual 3D city and landscape models) – CityGML 1.0.0 (C++/Tree mapping) • Problem z wykorzystaniem grup podstawień – http://wiki.codesynthesis.com/Schemas/CityGML T.Kubik: GML w wolnym oprogramowani 20/32 FDO - Feature Data Object http://fdo.osgeo.org/ • API do manipulowania, definiowania i analizowania informacji przestrzennej o różnym pochodzeniu • Korzysta z modelu bazującego na „dostawcach” • (C++/.NET, LGPL) • Pakiet OSGeo::FDO::Xml FDO 3.5 wspiera GML 2.1.2 FDO 3.6 wspiera GML 3.0 T.Kubik: GML w wolnym oprogramowani 21/32 GeoTools • http://www.osgeo.org/geotools Dostarcza metod do przetwarzania danych przestrzennych – Obsługuje geometrię poprzez Java Topology Suite (JTS) – Wspiera obsługę atrybutów i filtrów przestrzennych zgodnie z OGC Filter Encoding • • Umożliwia dostęp transakcyjny i wielowątkowych Obsługuje – bazy danych (db2, h2, mysql, oracle, postgis, spatialite, sqlserver) – pliki różnych formatów • Rastry (arcsde, arcgrid, geotiff, grassraster, gtopo30, image (JPEG, TIFF, GIF, PNG), imageio-ext-gdal, imagemoasaic, imagepyramid, JP2K, matlab) • Wektory (app-schema, arcsde, csv, dxf, edigeo, excel, geojson, org, property, shapefile, wfs) • Biblioteka Java (LGPL) T.Kubik: GML w wolnym oprogramowani 22/32 GeoTools • • • • Wspiera różne układy współrzędnych i transformacje Obsługuje różne projekcje Pozwala filtrować atrybuty przestrzenne i nieprzestrzenne Pozwala parsować dokumenty XML z wykorzystaniem schematów – Dostarcza dowiązania do GML, FE, KML, SLD, and SE. • • Pozwala na tworzenie i wykorzystanie rozszerzeńOGC Style Layer Descriptor / Symbology Encoding data structures and rendering engine Wspiera standardy: – – – – – OGC General Feature Model oraz Simple Feature OGC Grid Coverage OGC Filter and Common Constraint Language (CQL) Stronę klientów WFS, WMS, WPS (eksperymentalnie) ISO 19107 Geometry T.Kubik: GML w wolnym oprogramowani 23/32 GeoTools – wykorzystywane parsery Technology SAX SAX sax DOM DOM Pull XDO GTXML sax sax sax sax Support Notes dom Filter GML SLD Hard to trace through, parse not easily extended dom Filter GLM SLD Forgiving and easy to trace through and debug, memory limitation for GIS data xml Filter GML2 SLD Easy to trace through and debug, difficult to configure for specific data xml n/a Fast but not suitable for dynamic data, precomplied dom n/a Should combine the ease of DOM with the streaming performance of XDO and GTXML dom xml Proof of concept of schema assisted parsing Filter GML SLD WMS allowing streaming into Java Objects. WFS1.0 XSD Code is fast and well tested but is hard to trace through xml Schema assisted parsing backed by Eclipse Filter GML SLD WMS XSD to represent schema. WFS1.0 WFS1.1 Easier to trace through but still not straight WPS XSD forward Allows streaming for large GIS data volumnes. Transform JABX Encode dom dom T.Kubik: GML w wolnym oprogramowani 24/32 GML Parser for Java http://confluence.highsource.org/display/OGCS/Home • Lekki parser GML – Plik GML do geometrii JTS – Geometrie JTS do pliku GML • Wspiera GML 3.1.1 • Distrybucja z repozytorium Maven JAXBContext context = JAXBContext.newInstance("org.jvnet.ogc.gml.v_3_1_1.jts"); WKTWriter wktWriter = new WKTWriter(); Unmarshaller unmarshaller = context.createUnmarshaller(); Geometry geometry = (Geometry) unmarshaller.unmarshal(resource); System.out.println(wktWriter.write(geometry)); T.Kubik: GML w wolnym oprogramowani 25/32 GDAL http://www.gdal.org • biblioteka służąca do odczytu i zapisu rastrowych danych geoprzestrzennych, korzystająca z Xerces lub Expat • GDAL używa OGR do odczytu i zapisu wektorowych danych • OGR posiada sterownik GML – http://www.gdal.org/ogr/drv_gml.html Wersja Odczyt Zapis OGR >= 1.8.0 GML2 i GML3 które mogą być GML 2.1.2 lub GML 3 SF-0 przetłumaczone na model SF (GML 3.1.1 Compliance level SF-0) OGR < 1.8.0 GML2 i ograniczony GML3 GML 2.1.2 T.Kubik: GML w wolnym oprogramowani 26/32 Narzędzia wspierające GML (odczyt/zapis) • Każdy serwis WFS musi umieć zapisać GML, przy czym serwis transakcyjny musi czytać GML • Klienci serwisów WFS powinny wspierać obsługę plików GML (przynajmniej częściowo) • Listę narzędzi wspierających GML i WFS można znaleźć pod adresem: – http://www.opengeospatial.org/resource/products/byspec T.Kubik: GML w wolnym oprogramowani 27/32 Narzędzia wspierające GML • • • • • • Carbon Tools GAIA – platforma zbudowana na bazie CarbonTools PRO pozwalająca na dostęp i przeglądanie wielu źródeł naych przestrzennych (usługi OGC: WMS, WMTS, WCS, WFS, obsługa FE; inne usługi: Microsoft Bing Maps, Yahoo! Maps, OSM; pliki w formacie SHP, KML/KMZ, DXF, MIF, GML oraz GML Simple Features) (Microsoft .NET >= 2.0) Snowflake GML Viewer - pozwala m.in. odczytać i zobrazować dane o schemacie GML2 lub GML3, posiada predefiniowane style dla OS MasterMap (Wielka Brytania), IMRO2006 (Holandia), TOP10NL (Holandia) and AAA-NAS (Niemcy) gvSIG 1.1 – aplikacja, która obsługuje m.in. WFS 1.1 oraz pozwala na odczyt/zapis plików GML 3.1.1. (Java, GPL). QGIS (Quantum GIS) – aplikacja wspierająca obsługę GML (odczyt/zapis) za pośrednictwem biblioteki OGR (C++/Python; GPL) uDig (User-friendly Desktop Internet GIS) - aplikacja pozwalająca obsługiwać różne źródła danych przestrzennych (usługi WMS, WFS; pliki w różnych formatach) (Java, EPL oraz BSD) OpenLayers (wersje 2.12 – stabilna, 3 – rozwojowa) – biblioteka pozwalająca na wyświetlanie map w przeglądarkach internetowycha (strona klienta). Obsługuje profil GML simple feature przy zapisie i odczycie (JavaScript, FreeBSD) uDig 1.4: GML files in udig can currently only be supported if they meet two very strict restrictions: filename.xsd - an xml schema document defining the “data product” being loaded filename.gml - an xml document defined against the schema provided above We only support GML2 based schemas with simple content at this time. There is improved GML support for WFS 1.1 access; this has not been packaged for offline use at this time. T.Kubik: GML w wolnym oprogramowani 28/32 PostgreSQL + PostGIS • System zarządzania relacyjno-obiektową bazą danych z rozszerzenie pozwalającym na zapisywanie danych geograficznych wprost do bazy danych zgodnie ze specyfikacją OpenGIS Simple Features dla profilu SQL • Wspiera: – GML 3.2.1 Namespace – GML 3.1.1 Simple Features profile SF-2 (with GML 3.1.0 and 3.0.0 backward compatibility) – GML 2.1.2 geometry ST_GeomFromGML(text geomgml); geometry ST_GeomFromGML(text geomgml, integer srid); text ST_AsGML(geometry g1); text ST_AsGML(geometry g1, integer precision); text ST_AsGML(integer version, geometry g1); text ST_AsGML(integer version, geometry g1, integer precision); text ST_AsGML(integer version, geometry g1, integer precision, integer options); T.Kubik: GML w wolnym oprogramowani 29/32 Przykład zastosowania PostGIS • Utworzenie bazy danych przestrzennych # createdb -U postgres -h localhost -W -T postgistemplate mojaBD • Zapytanie do PRNG wybierające wszystkie nazwy zaczynające się na A: http://sdi.geoportal.gov.pl/wfsg_prng/wfservice.as px?service=WFS&request=GetFeature&version=1.1.0&typena me=gmgml:Polska&namespace=xmlns(gmgml=http://www.inter graph.com/geomedia/gml)&filter=<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:gmgml="http://www.intergraph.com/geomedia/gml">< ogc:PropertyIsLike wildCard="*" singleChar="."escapeChar="!"><ogc:PropertyName>NAZWA</ ogc:PropertyName><ogc:Literal>A*</ogc:Literal></ogc:Pr opertyIsLike></ogc:Filter> T.Kubik: GML w wolnym oprogramowani 30/32 Pobieranie danych z serwisów WFS • Powyższe produkuje GML, w którym należy odwrócić współrzędne (ze względu na różnice pomiędzy wersjami GML-a) # export FORMAT=GML3 # export GML3_LONGSRS=YES # export GML_INVERT_AXIS_ORDER_IF_LAT_LONG=YES # ogr2ogr -nlt POINT -f "GML" Aout.gml A.gml • Załadowanie pliku GML do bazy danych ogr2ogr -f "PostgreSQL" PG:"dbname=mojaBD host=localhost port=5432 user=postgres password=******" Aout.gml T.Kubik: GML w wolnym oprogramowani 31/32 Koniec • Dziękuję za uwagę T.Kubik: GML w wolnym oprogramowani 32/32