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

Podobne dokumenty