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 INTERLIS-compiler http://www.umleditor.org/ 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 Ładowanie do pamięci Duże koszty (czas i zasoby) Pełny dostęp (dostęp do całego drzewa) Odczyt/zapis SAX Simple API for XML 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>jan@ex.com</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>jan@ex.com</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>jan@ex.com</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>jan@ex.com</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 DOM Encode Support Notes SAX sax dom Filter GML SLD Hard to trace through, parse not easily extended DOM dom Filter GLM SLD Forgiving and easy to trace through and debug, memory limitation for GIS data Transform xml Filter GML2 SLD Easy to trace through and debug, difficult to configure for specific data JABX sax dom xml n/a Fast but not suitable for dynamic data, precomplied Pull sax dom n/a Should combine the ease of DOM with the streaming performance of XDO and GTXML XDO sax dom xml Filter GML SLD WMS WFS1.0 XSD Proof of concept of schema assisted parsing allowing streaming into Java Objects. Code is fast and well tested but is hard to trace through GTXML sax dom xml Filter GML SLD WMS WFS1.0 WFS1.1 WPS XSD Schema assisted parsing backed by Eclipse XSD to represent schema. Easier to trace through but still not straight forward Allows streaming for large GIS data volumnes. 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 OGR >= 1.8.0 OGR < 1.8.0 Odczyt GML2 i GML3 które mogą być przetłumaczone na model SF GML2 i ograniczony GML3 GML 2.1.2 lub GML 3 SF-0 (GML 3.1.1 Compliance level SF-0) GML 2.1.2 Zapis 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