GML w wolnym oprogramowaniu
Tomasz Kubik
Politechnika Wrocławska
Warszawa, 12 kwietnia 2012
T.Kubik: GML w wolnym oprogramowani
2/32
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
3/32
Transformacja UML-XSD
T.Kubik: GML w wolnym oprogramowani
4/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
5/32
ShapeChange
•
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:
http://shapechange.net/
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
6/32
UML/INTERLIS-Editor oraz
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)
http://www.umleditor.org/
T.Kubik: GML w wolnym oprogramowani
7/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
8/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
9/32
DOM i SAX
T.Kubik: GML w wolnym oprogramowani
10/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
11/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
12/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
13/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
14/32
XML data binding: korzystanie z JAXB
T.Kubik: GML w wolnym oprogramowani
15/32
<?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>
Korzystanie z JAXB
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());
> xjc dane.xsd
<?xml version="1.0" encoding="UTF-8"?>
<Kontakt>
<Imie>Jan</Imie>
<Email>jan@ex.com</Email>
</Kontakt>
T.Kubik: GML w wolnym oprogramowani
16/32
CodeSynthesis 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)
http://www.codesynthesis.com/products/xsd/
auto_ptr<Kontakt> k = Kontakt ("c.xml");
cout << k->imie () << ", "
<< k->email () << endl;
<?xml version="1.0" encoding="UTF-8"?>
<Kontakt>
<Imie>Jan</Imie>
<Email>jan@ex.com</Email>
</Kontakt>
T.Kubik: GML w wolnym oprogramowani
17/32
CodeSynthesis XSD
- ró
ż
nice w przetwarzaniu XML
// XML Binding: C++/Tree
Kontakt k = ...
cout << k.imie () << ", "
<< k.email () << endl;
// 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 version="1.0" encoding="UTF-8"?>
<Kontakt>
<Imie>Jan</Imie>
<Email>jan@ex.com</Email>
</Kontakt>
T.Kubik: GML w wolnym oprogramowani
18/32
CodeSynthesis XSD
- ró
ż
nice w przetwarzaniu XML
// XML Binding: C++/Parser
class KontaktParser: ... {
virtual void imie (const string& n){
cout << n << ", "; }
virtual void email (const string& e){
cout << e << endl; }
};
// 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 version="1.0" encoding="UTF-8"?>
<Kontakt>
<Imie>Jan</Imie>
<Email>jan@ex.com</Email>
</Kontakt>
T.Kubik: GML w wolnym oprogramowani
19/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
20/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
21/32
FDO - Feature Data Object
• 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
http://fdo.osgeo.org/
T.Kubik: GML w wolnym oprogramowani
22/32
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)
http://www.osgeo.org/geotools
T.Kubik: GML w wolnym oprogramowani
23/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
24/32
GeoTools – wykorzystywane parsery
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.
Filter GML SLD WMS
WFS1.0 WFS1.1
WPS XSD
xml
dom
sax
GTXML
Proof of concept of schema assisted parsing
allowing streaming into Java Objects.
Code is fast and well tested but is hard to
trace through
Filter GML SLD WMS
WFS1.0 XSD
xml
dom
sax
XDO
Should combine the ease of DOM with the
streaming performance of XDO and
GTXML
n/a
dom
sax
Pull
Fast but not suitable for dynamic data,
precomplied
n/a
xml
dom
sax
JABX
Easy to trace through and debug, difficult to
configure for specific data
Filter GML2 SLD
xml
Transform
Forgiving and easy to trace through and debug,
memory limitation for GIS data
Filter GLM SLD
dom
DOM
Hard to trace through, parse not easily
extended
Filter GML SLD
dom
sax
SAX
Notes
Support
Encode
DOM
SAX
Technology
T.Kubik: GML w wolnym oprogramowani
25/32
GML Parser for Java
• Lekki parser GML
– Plik GML do geometrii JTS
– Geometrie JTS do pliku GML
• Wspiera GML 3.1.1
• Distrybucja z repozytorium Maven
http://confluence.highsource.org/display/OGCS/Home
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
26/32
GDAL
• 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
http://www.gdal.org
GML 2.1.2
GML2 i ograniczony GML3
OGR < 1.8.0
GML 2.1.2 lub GML 3 SF-0
(GML 3.1.1 Compliance level SF-0)
GML2 i GML3 które mogą być
przetłumaczone na model SF
OGR >= 1.8.0
Zapis
Odczyt
Wersja
T.Kubik: GML w wolnym oprogramowani
27/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
28/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
29/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
30/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
31/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
32/32
Koniec
• Dzi
ę
kuj
ę
za uwag
ę