Εγγραφή

Ιστολόγιο

2 Μαρ 2008

Αξιοποίηση αρχείων kml με ελεύθερο λογισμικό ανοιχτού κώδικα

Και λίγα σχόλια περί της τοπολογίας ανυσματικών δεδομένων.
Άρθρο του Νίκου Αλεξανδρή για τον Τήλαφο

Η πρώτη απόπειρα "ανάγνωσης" του αρχείου Korinthia_estimate_2007.kml για την μετέπειτα εισαγωγή του σε μια βάση γεωγραφικών δεδομένων, στημένη με το GRASS-GIS [1], δεν ήταν επιτυχής. Μετά από αναζήτηση στο διαδίκτυο [2,3] και προσωπική επικοινωνία με τον "Τήλαφο", προέκυψε ότι δεν είναι τόσο δύσκολο να μετατραπούν αρχεία μορφής kml [4] σε άλλες πιο κοινές μορφές αρχείων που (μετα)φέρουν γεω-χωρικά δεδομένα (π.χ. ESRI shapefile [5], GML[6], GRASS vector[7]).

Τα αρχεία kml δεν είναι παρά αρχεία xml [8]. Με απλή επεξεργασία της κεφαλίδας (πρώτες γραμμές του αρχείου) και με την "συνοδεία" ενός ακόμα αρχείου επέκτασης xsl [9] (το οποίο προσδιορίζει την μορφή εμφάνισης των περιεχομένων αρχείων xml), είναι δυνατόν να προβληθεί το περιεχόμενό τους για παράδειγμα σε έναν φυλλομετρητή ιστοσελίδων (π.χ. firefox [10]).

Τα παραδείγματα που ακολουθούν υλοποιήθηκαν με το αρχείο "Korinthia_estimate_2007.kmz" [11]. Η μετέπειτα αξιοποίησή του με τα QGIS [12], FWTools [13], GRASS-GIS υπό το λειτουργικό σύστημα Ubuntu-linux [14, 15]. Σε ό,τι αφορά στο Ubuntu, αξίζει να σημειωθεί ότι είναι ιδιαίτερα φιλικό για εφαρμογές Συστημάτων Γεωγραφικών Πληροφοριών και με ελάχιστη προσπάθεια είναι εφικτή η εγκατάσταση των Quantum-GIS, GRASS-GIS καθώς και πολλών άλλων (περισσότερες πληροφορίες στην ιστοσελίδα Ubuntu-GIS [16]).

Βήμα-προς-βήμα η μετατροπή

Μετά την αποθήκευση του αρχείου τοπικά και πριν από οποιαδήποτε ενέργεια πρέπει να εξαχθεί (αποσυμπίεση) το ζητούμενο αρχείο kml από τo kmz (το kmz [17] είναι απλά ένα συμπιεσμένο kml).

  1. Από kml σε html [18] και ανάγνωση με έναν φυλλομετρητή.
    1. Το αρχείο Korinthia_estimate_2007.kml πρέπει να μετονομαστεί σε xml (αλλαγή της επέκτασης) και να τοποθετηθεί σε έναν κατάλογο μαζί με το kml2html.xsl.
    2. Επεξεργασία του αρχείου (με έναν απλό επεξεργαστή κειμένου) και αντικατάσταση της γραμμής

       <kml xmlns="http://earth.google.com/kml/2.2">

       με τις (2 γραμμές)

       <?xml-stylesheet type="text/xsl" href="kml2html.xsl" ?>
       <kml>
    3. Αποθήκευση και άνοιγμα του αρχείου Korinthia_estimate_2007.xml με έναν φυλλομετρητή όπου και είναι δυνατή η ανάγνωση του.
  2. Από kml σε gml και ανάγνωση με το QuantumGIS
    1. Το αρχείο Korinthia_estimate_2007.xml πρέπει να αποθηκευτεί μαζί με το kml2gml.xsl σε έναν ξεχωριστό κατάλογο.
    2. Επεξεργασία του αρχείου (με έναν απλό επεξεργαστή κειμένου) και αντικατάσταση της γραμμής

       <kml xmlns="http://earth.google.com/kml/2.2">

       με τις (2 γραμμές)

       <?xml-stylesheet type="text/xsl" href="kml2gml.xsl" ?>
       <kml>
    3. Άνοιγμα του αρχείου Korinthia_estimate_2007.xml με έναν φυλλομετρητή και αποθήκευση ως Korinthia_estimate_2007.gml
    4. Άνοιγμα με το QuantumGIS
  3. Χρησιμοποιώντας το OpenEV [19] (μέρος των FWTools) ή το QuantumGIS

    Ο πιο απλός τρόπος είναι η χρήση του OpenEV για άμεση ανάγνωση αρχείων kml και αποθήκευση για παράδειγμα σε αρχεία ESRI shapefile. Η ανάγνωση και εγγραφή αρχείων kml στηρίζεται στα εργαλεία ogrinfo και ogr2ogr [20] τα οποία αποτελούν μέρος μιας ευρύτερης συλλογής εργαλείων διαχείρισης γεω-χωρικών δεδομένων, την GDAL/OGR [21].
    Άμεση ανάγνωση μπορεί να γίνει και με το QuantumGIS υπό την προϋπόθεση ότι θα χρησιμοποιηθεί η νεότερη έκδοση GDAL/OGR. Την ώρα που γράφονται αυτές οι γραμμές, υπό το Ubuntu είναι διαθέσιμη μια παλιότερη έκδοση της βιβλιοθήκης (libgdal1-1.4.0 [22]) που δεν επιτρέπει το άνοιγμα των αρχείων kml. Αυτό όμως θα αλλάξει σύντομα μιας και οι "πηγές" που τροφοδοτούν το Ubuntu με πακέτα λογισμικού ανανεώνονται συνεχώς.
 Μερικά σχόλια επιπλέον:

Στην προσπάθεια να εισαγάγω στο GRASS-GIS το αρχείο Korinthia_2007.kml [23] (όχι το Korinthia_estimate_2007.kml) προέκυψε ότι τα δεδομένα δεν είναι τοπολογικά σωστά. Δεν γνωρίζω με ποιο τρόπο έχουν συλλεχθεί τα δεδομένα και έχουν μετατραπεί σε kml. Θέλω όμως να σχολιάσω επί των περίφημων αρχείων shapefile (που είναι η πιο κοινή μορφή αποθήκευσης και μεταφοράς ανυσματικών δεδομένων).

Τα αρχεία "ESRI shapefile" μπορούν να μεταφέρουν “σημεία”,“γραμμές” ή “πολύγωνα”. Στην ουσία πρόκειται μόνο για συντεταγμένες (συνήθως μόνο x,y). Ακόμη και στην περίπτωση περίπτωση "γραμμών" ή "πολυγώνων" πρόκειται μόνο για σημεία των οποίων η νοητή σύνδεση ορίζει γραμμικά αντικείμενα (π.χ. οδικό δίκτυο) ή επιφάνειες (π.χ. δασικές εκτάσεις). Οι μαθηματικές σχέσεις που ορίζουν τον τρόπο με τον οποίο συνδέονται τα σημεία στο χώρο (σε τρεις ή μόνο σε 2 διαστάσεις) είναι η τοπολογία. Το μειονέκτημα των περίφημων shapefiles είναι ότι δεν περιέχουν πληροφορίες για την τοπολογία των σημείων [5][24]. Έτσι είναι δυνατόν να υφίστανται πολλά τοπολογικά λάθη όπως αλληλοεπικαλυπτόμενα πολύγωνα και ανοιχτά πολύγωνα. Δίχως τον απαιτούμενο τοπολογικό έλεγχο [25] αυτά τα λάθη συνεχίζουν να υφίστανται και να δημιουργούν άλλα προβλήματα. Δεν γνωρίζω σε βάθος τη δομή των αρχείων kml αλλά αμφιβάλλω για το αν περιέχουν πληροφορίες για την τοπολογία των σημείων.

Παρατίθεται ένα διορθωμένο Korinthia_2007_clean.shp, σε συμπίεση zip [26] (η διόρθωση έγινε με το v.digit [27] στο GRASS-GIS).
----------
Πηγές (στην Αγγλική γλώσσα εκτός από τις 10, 15, 18):

1 http://grass.osgeo.org
2 http://spanring.eu/blog/2005/12/11/kml2gml/
3 http://www.perrygeo.net/wordpress/?p=3
4 http://code.google.com/apis/kml/documentation/
5 http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf
6 http://www.opengeospatial.org/standards/gml
και
http://filext.com/file-extension/GML
7 http://grass.gdf-hannover.de/wiki/Vectordata
και
http://www.ing.unitn.it/~grass/conferences/GRASS2002/proceedings/proceedings/pdfs/Blazek_Radim.pdf
8 http://en.wikipedia.org/wiki/XML
9 http://en.wikipedia.org/wiki/Extensible_Stylesheet_Language
10 http://www.mozilla-europe.org/el/
11 http://tilaphos.googlepages.com/Korinthia_estimate_2007.kmz
12 http://www.qgis.org/
13 http://fwtools.maptools.org/
14 http://www.ubuntu.com/
15 http://www.ubuntu-gr.org/
16 https://wiki.ubuntu.com/UbuntuGIS
17 http://en.wikipedia.org/wiki/Keyhole_Markup_Language
18 http://tilaphos.googlepages.com/kml2html.xsl
19 http://openev.sourceforge.net/
20 http://www.gdal.org/ogr/ogrinfo.html
και
http://www.gdal.org/ogr/ogr2ogr.html
21 http://www.gdal.org/
και
http://www.gdal.org/ogr/
22 http://packages.ubuntu.com/gutsy/libgdal1-1.4.0
23 http://tilaphos.googlepages.com/Korinthia_2007.kmz
24 http://www.esri.com/news/arcuser/0401/topo.html
25 http://en.wikipedia.org/wiki/Geographic_information_system#Topological_modeling
και
http://en.wikipedia.org/wiki/Geographic_information_system#Data_capture
26 http://tilaphos.googlepages.com/Korinthia_2007_clean.zip
27 http://grass.itc.it/grass62/manuals/html62_user/v.digit.html

5 σχόλια:

dzach είπε...

Τα αρχικά δεδομένα από τα οποία προήλθε το αρχείο Korinthia_2007.kml ήταν σε μορφή DWG και έχουν εισαχθεί με το πρόγραμμα Autocad.

Ανώνυμος είπε...

(Ζητώ προκαταβολικά συγγνώμη για το μακροσκελές σχόλιό.)

Η ανάγνωση των εν λόγω δεδομένων απευθείας με το εργαλείο ogrinfo υπό το linux είναι "αποκαλυτπική"!

Η εντολή "ogrinfo Korinthia_2007.kml -al | less" εμφανίζει τα περιεχόμενα του Korinthia_2007.kml ως εξής (παραθέτω ένα μικρό απόσπασμα όπου το "[...]" είναι δική μου σημείωση ότι ακολουθούν πολλά δεδομένα):

Layer name: Στεφάνι
Geometry: Polygon
Feature Count: 2
Extent: (22.782076, 37.765520) - (22.796997, 37.778989)
Layer SRS WKT:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.01745329251994328,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4326"]]
Name: String (0.0)
Description: String (0.0)
OGRFeature(Στεφάνι):0
Name (String) = Στεφάνι
Description (String) =

[...]

POLYGON ((22.783299840000009 37.77047369000001 0,22.782790339999998 37.769974240000003 0,22.78314504 37.769356000000002 0, [...] ))

Είναι εμφανές ότι οι συντεταγμένες των σημείων που συστοιχειώνουν τα πολύγωνα είναι τοποθετημένες με την εξής μορφή (για κάθε πολύγωνο με i σημεία όπου x, y και z το γεωγραφικό μήκος, πλάτος και η υψομετρική τιμή για κάθε σημείο αντίστοιχα):

POLYGON ((x1 y1 z1,x2 y2 z2, [...] ,xi yi zi))

(Παρεπιπτόντως, οι υψομετρικές τιμές (z) όπως υποδεικνύει το παραπάνω απόσπασμα είναι όλες μηδενικές.)

Μια προσεκτική εξέταση του αρχείου Korinthia_estimate_2007.kml αποκαλύπτει ότι, για κάθε κλειστό πολύγωνο, η πρώτη τριπλέτα (x1 y1 z1) ταυτίζεται με την τελευταία (xi yi zi) (παραέτω ένα ακόμη "μικρό απόσπασμα"):

OGRFeature(Κορινθία-εκτίμηση):1
Name (String) = Στεφάνι

[...]

POLYGON ((22.790377759297879 37.779065854562063 0,[...],22.790377759297879 37.779065854562063 0))

Υποθέτω ότι πρόκειται για μια μέθοδο να σημειώνεται το πολύγωνο ως "κλειστό". Αν είναι "ανοιχτό", απλά δεν είναι πολύγωνο.

Η ταύτιση αυτή δεν υφίσταται στο αρχείο Korinthia_2007.kml (το οποίο και ήταν η αφορμή για τα σχόλια περί της μη-τοπολογίας των ESRI shapefiles).

Η σύγκριση με το "διορθωμένο" αρχείο Korinthia_2007_clean.shp (βλέπε άρχικό άρθρο) επιβεβαιώνει ότι στα "κλειστά πολύγωνα" η 1η πρώτη και η τελευταία τριπλέτα τιμών (x y z) ταυτίζονται.

Είναι πιθανό το "λάθος" να έγινε κατά την μετατροπή από DWG σε KML.

Ίσως κάποιος με βαθύτερη γνώση επί του αντικειμένου να βοηθήσει περισσότερο στην κατανόηση των διαφορών.


Με εκτίμηση,

Νίκος Αλεξανδρής

dzach είπε...

Είναι γεγονός ότι πολλά σχεδιαστικά προγράμματα δεν χρειάζονται να κλείνουν τα πολύγωνα για να τα παρουσιάσουν σαν πολύγωνα. Από όσα λίγα γνωρίζω, πολλές βιβλιοθήκες γραφικών κάνουν το ίδιο. Το SVG για παράδειγμα σχεδιάζει και κλειστά και ανοιχτά πολύγωνα (τα ανοιχτά φαίνονται όταν είναι γεμάτα - filled).

Το Korinthia_estimate_2007.kml ψηφιοποιήθηκε με το χέρι (τελείως κατ εκτίμηση και είναι ακατάλληλο για οποιαδήποτε αναφορά με απαιτήσεις ακρίβειας) με το Google Earth, όπου δεν χρειάζεται να κλείνει κανείς τα πολύγωνα με το χέρι γιατί τα δημιουργεί κλειστά το πρόγραμμα από μόνο του.

Αν έχεις διάθεση να το κοιτάξεις περισσότερο, μπορώ να σου στείλω το αρχικό αρχείο DWG.

Ανώνυμος είπε...

Μετά χαράς θα εξετάσω και τα αρχικά δεδομένα.

(Δεν γνωρίζω όμως τα σχετικά με την άδεια χρήσης, αντιγραφής, διακίνησης κ.λπ. αρχείων DWG)

Ανώνυμος είπε...

Εξέτασα και το αρχικό αρχείο (υπό μορφής DXF τελικά) και συμπεραίνω ότι (όπως και στο πρώτο μου σχόλιο) κάτι "χάθηκε" κατά την μετατροπή από DXF/DWG σε ΚΜL.
---
Σημειώνω επίσης τα εξής:

1. Τα αρχικά δεδομένα είναι σε ΕΓΣΑ87

(Αλήθεια πως δουλεύει το AutoCAD σε ό,τι αφορά στα διαφορερικά προβολικά
συστήματα; Θα ήθελα να ενημερωθώ επ' αυτού αλλά δυστυχώς δεν διαθέτω και δεν έχω πρόσβαση στο συγκεκριμένο λογισιμικό.)

Τα KML είναι εξ' ορισμού σε γεωγραφικές συντεταγμένες... άρα στο
παιχνίδι είναι και η επαναπροβολή των δεδομένων από ΕΓΣΑ87 σε lat-long.

2. το dxf μπορεί να το δει κανείς και με το QCad

3. Με το v.in.dxf (grass module) τα περιεχόμενα του αρχικού αρχείου DXF είναι:

GRASS 6.3.svn (Peloponnese_HGRS87):/grass_db > v.in.dxf -l
in=tilaphos.DXF out= layers=layer
Layer 1: 0
Layer 2: layer1
Layer 3: oria
Layer 4: polygon
Layer 5: dasika
Layer 6: dasika_oria
Layer 7: agroi_oria
Layer 8: akafta_oria
100%
v.in.dxf complete.

4. Τα "πολύγωνα" φαίνεται να είναι κλειστά (με λίγες εξαιρέσεις που,
κρίνοντας από την ονομασία του επιπέδου στο οποίο ανήκουν, ίσως να είναι
ηθελημένα ανοιχτές πολυ-γραμμές ;-)

Βέβαια μετά την εισαγωγή τους στο GRASS είναι γραμμές και η μετατροπή
τους σε areas είναι σχετικά απλή. Ιδού το ιστορικό του τελικού αρχείου
(σημείωση: χωρίς να δώσω ιδιαίτερη προσοχή στις παραμέτρους για την
διόρθωση τοπολογικών λαθών)

COMMAND: v.in.dxf -1 input="tilaphos.DXF" output="korinthia_dxf"
GISDBASE: /grass_db/Peloponnese_DamageAssessment2007
LOCATION: Peloponnese_HGRS87 MAPSET: nik USER: nik DATE: Sun Mar 9
18:40:39 2008
---------------------------------------------------------------------------------
COMMAND: v.type input="korinthia_dxf" output="korinthia_dxf_bnd"
type="line,boundary"
GISDBASE: /grass_db/Peloponnese_DamageAssessment2007
LOCATION: Peloponnese_HGRS87 MAPSET: nik USER: nik DATE: Sun Mar 9
18:42:05 2008
---------------------------------------------------------------------------------
COMMAND: v.category input="korinthia_dxf_bnd"
output="korinthia_dxf_area" type="area" option="add" cat=1 layer=1
step=1
GISDBASE: /grass_db/Peloponnese_DamageAssessment2007
LOCATION: Peloponnese_HGRS87 MAPSET: nik USER: nik DATE: Sun Mar 9
18:43:59 2008
---------------------------------------------------------------------------------
COMMAND: v.clean input="korinthia_dxf_area"
output="korinthia_dxf_area_clean"
type="point,line,boundary,centroid,area"
tool="snap,rmdangle,rmdupl,rmdac"
GISDBASE: /grass_db/Peloponnese_DamageAssessment2007
LOCATION: Peloponnese_HGRS87 MAPSET: nik USER: nik DATE: Sun Mar 9
18:44:38 2008


5. Έχουν διατηρηθεί πολλά πολύγωνα εντός πολυγώνων (μάλλον καλό αυτό) με
κάποια να έχουν χαθεί επειδή δεν πέτυχε η αυτόματη πρόσθεση ενός
κεντροειδούς... κ.λπ. (μικρό το κακό -- μπορεί να γίνει διόρθωση με το
χέρι όπου χρειάζεται).

6. Εξαγωγή σε shapefile
v.out.ogr -e in=korinthia_dxf_area_clean type=area dsn=/grass_db/
format=ESRI_Shapefile