Βιβλιοθήκη γεωδαιτικών μετατροπών συντεταγμένων (icoordstrans)

Μετατροπές φ, λ <-> X,Y ΕΓΣΑ87 (GR87), WGS84, κλπ. Έκδοση 0.4.0 - 3 Οκτωβρίου 2006

Την βιβλιοθήκη αυτή την ανέπτυξα με ιδίους πόρους στον ελεύθερό μου χρόνο για να χρησιμοποιηθεί σε ένα ερευνητικό πρόγραμμα της ΙΤΙΑς, ωστόσο πιστεύω πως είναι γενικότερα χρήσιμη και έτσι την βάζω εδώ για να την κατεβάσει όποιος θέλει. Επιπλέον δίνω τον κώδικα της βιβλιοθήκης, ώστε όποιος θέλει να την βελτιώσει, χρησιμοποιήσει σε άλλα προγράμματα κλπ.

Αν και θα ασχοληθώ με την συντήρηση και βελτίωση του κώδικα, θα ήταν πολύ ευχάριστο αν κάποιος που έχει εντοπίσει τυχόν λάθη ή έχει κάνει βελτιώσεις, συντάσσει Makefiles και installation scripts, κλπ μου τις έστελνε για τις εντάξω. Επιπλέον η σελίδα αυτή πρέπει να μεταφραστεί στα αγγλικά (ζητούνται εθελοντές!). Τέλος εθελοντική συμμετοχή χρειάζεται στην μεταφορά του Hatt (βλ. παρακάτω). Λεφτά δεν υπάρχουν, άλλωστε αυτά που δίνουμε σε αυτήν την ιστοσελίδα είναι δωρεάν, ωστόσο μπορώ να σας κάνω ιδιαίτερη μνεία στην ιστοσελίδα! Αν υπάρξει έντονη συμμετοχή θα σκεφτώ να τα βάλω όλα μέσα σε ένα CVS.

Η βιβλιοθήκη σε μορφή DLL

itranscoords.dll (έκδοση 0.4.0)

Κατεβάστε οπωσδήποτε το παραπάνω DLL αν θέλετε να χρησιμοποιήσετε κάποιο από τα προγράμματα ή Excel που δίνω στην συνέχεια. Θα το εγκαταστήσετε στο \Windows\System32 για να είναι διαθέσιμο για όλα τα προγράμματα. Το παραπάνω DLL είναι μεταγλωττισμένο με Visual C++, μπορείτε να το χρησιμοποιήσετε και σε δικά σας προγράμματα ή να το καλείτε π.χ. από φύλλα του Excel. Σύμφωνα με χρήστες της εφαρμογής, η θέση System32 για το dll δεν λειτουργεί πάντα. Μπορείτε να δοκιμάσετε εναλλακτικά την θέση: "C:\Program Files (x86)\Microsoft Office\Office12"

[19/5/2008] Μία μικρή μεταβολή στο δοκιμαστικό πρόγραμμα επιτρέπει την μαζική μετατροπή αρχείων τύπου text με συντεταγμένες..

[3/10/2006] Τέταρτη έκδοση. Προστέθηκε η προβολή HATT καθώς και η ΕΜΠ 3 μοιρών που έχει χρησιμοποιηθεί στην Ελλάδα. Υιοθετείται πλέον ο γενικός μετασχηματισμός Helmert με επτά παραμέτρους για την μεταφορά γεωκεντρικών συστημάτων (3 μετατοπίσεις, 3 στροφές και αλλαγή κλίμακας). Φτιάχτηκε Makefile το οποίο δοκιμάστηκε και μεταγλώττισε επιτυχώς την βιβλιοθήκη με gcc/Linux.

[20/9/2006] Τρίτη έκδοση. Προστέθηκαν τα συστήματα αναφοράς UTM ζώνες 29-37, ED50 (Κύπρος), ζώνη 6, ED50 (Ελλάδα), ζώνες 4 και 5, ED50 (Μέσο ευρωπαϊκό), ζώνες 0 έως 6.

[20/7/2006] Δεύτερη έκδοση, διορθώθηκαν κάποια λάθη που έδιναν λάθος στον μετασχηματισμό GR87<->WGS84, κάπου 10-20 μέτρα στο φ (~0.5 δευτερόλεπτο της μοίρας). Ο κώδικας αρχίζει να γίνεται πιο modular ώστε να μπορούν να εισαχθούν εύκολα νέα συστήματα αναφοράς.

[10/2/2006] Πρώτη έκδοση.

Αυτόνομο πρόγραμμα μετατροπής συντεταγμένων

Αφού εγκαταστήσετε το DLL, μπορείτε να χρησιμοποιήσετε αυτό το πρόγραμμα για να το δοκιμάσετε:

test_program.zip (νέα έκδοση, 19/5/2008)

Ενδεχομένως να καλύψει τις ανάγκες σας για μετατροπή συντεταγμένων. Μπορείτε να κατεβάσετε τον κώδικα του (Delphi): delphi_source.zip ώστε μεταξύ άλλων να δείτε με ποιόν τρόπο θα μπορούσατε να χρησιμοποιήσετε την βιβλιοθήκη.

Excel

Για να «τρέξετε» το παρακάτω Excelόφυλλο, πρέπει προηγουμένως να έχετε εγκαταστήσει το αρχείο DLL (βλ. οδηγίες παραπάνω). Το αρχείο excel:

gr87transformsV2.xls [κατασκευασμένο πάνω στην έκδοση 0.4 - 3/10/2006]

Περιλαμβάνει 4 φύλλα με 4 μετατροπές (x, y -> x, y  φ, λ -> φ, λ   x, y -> φ, λ   φ, λ -> x, y). Αρχικά κάντε Enable τα Macros σε τυχόν προειδοποίηση ασφαλείας. Δείτε τον κώδικα Visual Basic, πατώντας Alt+F11 για να πάρετε ιδέες. Μπορείτε να τροποποιήσετε τόσο τον κώδικα VBA όσο και τα φύλλα στις ανάγκες σας. Τα φύλλα δεν είναι κλειδωμένα, για αυτό προσέξτε τα κελιά με τις σχέσεις, καλού κακού κρατάτε κάπου μία original έκδοση. To excel σε ορισμένους υπολογιστές δεν καταφέρνει να «δει» το DLL, δεν μπορώ για την ώρα να καταλάβω πότε συμβαίνει αυτό. Το πιο πιθανό είναι να δουλέψει χωρίς πρόβλημα. Κάποια στιγμή ίσως φτιάξω μερικές μετατροπές με το Hatt ώστε να συμπεριληφθούν όλα τα δυνατά φύλλα χάρτη.

Η Excel VBA κάνει χρήση τύπων Double, Long Integer και τα περνάει στο DLL. Σε μελλοντικές 64 bit εκδόσεις, ίσως υπάρχουν προβλήματα συμβατότητας καθώς η VBA καθορίζει συγκεκριμένους τύπους. (Το πρόβλημα συγκεκριμένα είναι στα enum types της C και στο μέγεθος των ακεραίων που περνιούνται από την VBA).

[ΝΕΟ!! 2011-09-21]

Κατόπιν παράκλησης πολλών χρηστών, έφτιαξα ένα ανεξάρτητο φύλλο μετατροπής Excel για τη μετατροπή X,Y (Hatt) <-> φ,λ (WGS-84). Μπορείτε να το κατεβάσετε από εδώ:

gr87transformsHatt.xls

Έχω βάλει κάποιες preset τιμές συντεταγμένων φύλλων χάρτη ΓΥΣ σε μορφή φ, δλ, όχι όμως όλη τη λίστα. Εσείς είτε μπορείτε να εισάγετε "custom" τιμές για συγκεκριμένο φύλλο χάρτη είτε μπορείτε και να συμπληρώσετε τη λίστα. Αν κάποιος αναλάβει να συμπληρώσει όλη τη λίστα και θέλει, μπορεί να μου στείλει το φύλλο συμπληρωμένο για να το αναρτήσω, πιστεύω πως ενδιαφέρει πολλούς χρήστες. Στοιχεία για τα Φ.Χ. μπορείτε να βρείτε σε αυτήν την σελίδα: http://www.geographer.gr/ci/index.php/hatt/ φαντάζομαι πως θα υπάρχουν και αλλού διαθέσιμα καθώς πρόκειται για δημόσια δεδομένα. Προσοχή μόνο. Όταν γράφει π.χ. φ=38.15 εννοεί 38 μοίρες και 15 λεπτά, οπότε σε δεκαδική μορφή πρέπει να εισάγετε 38.25 και όχι 38.15!! Άλλο παράδειγμα: γράφει -0.45, εσείς θα εισάγετε -0.75 κ.ο.κ.

Τεχνικά στοιχεία

Τα GR87, WGS84, βασίζονται στα ελλειψοειδή GRS80 / WGS84. Οι παράμετροι των ελλειψοειδών είναι

Τα ελλειψοειδή GRS80, WGS84 έχουν πολύ μικρή διαφορά που δίνει γύρω στα 0.1 mm διαφορά στον μικρό ημιάξονα. Μία πολύ καλή αναφορά υπάρχει στην wikipedia: http://en.wikipedia.org/wiki/Reference_ellipsoid, δες και http://en.wikipedia.org/wiki/GRS_80

Η προβολή όπως αναφέραμε είναι Εγκάρσια Μερκατορική Προβολή (ΕΜΠ - UTM - Universal Transverse Mercatoric).

H παράλληλη μετατόπιση του ελλειψοειδούς που εφαρμόζεται στο WGS84 ως προς το GR87, σύμφωνα με στοιχεία του ΥΠΕΧΩΔΕ:

(ΔΧ, ΔΥ, ΔΖ) = (-199.72, 74.03, 246.02) σε μέτρα.

Το GR87 (Ε.Γ.Σ.Α. 87) είναι προσαρμοσμένο ελλειψοειδές στην Ελλάδα ώστε να έχουμε τα μικρότερα δυνατά σφάλματα. Το δε WGS84, είναι γεωκεντρικό. Η μετατροπή μεταξύ WGS84 <-> ΕΓΣΑ87 είναι καλύτερη από μέτρο.

Το ED50 βασίζεται στο διεθνές ελλειψοειδές του Hayfford (a=6378388.155, f=1/297). Για την Κύπρο χρησιμοποιείται η ζώνη 6 με (ΔΧ, ΔΥ, ΔΖ) = (-104, -101, -140), για την Ελλάδα ζώνες 4 και 5 (ΔΧ, ΔΥ, ΔΖ) = (-83.8, -96.3, -115.7) και το μέσο Ευρωπαϊκό, ζώνες 0 - 6 (ΔΧ, ΔΥ, ΔΖ) = (-87, -98, -121). Οι αρχικές συντεταγμένες του ED50 ανά την Ευρώπη προέκυψαν από κλασσικούς τριγωνισμούς. Όταν εφαρμόζεται ωστόσο δορυφορική επίλυση GPS, παρατηρούνται κατά τόπους διαφοροποιήσεις στις μετατοπίσεις των ελλειψοειδών (όπως παραπάνω). Επιπλέον τα ελλειψοειδή WGS84, ED50 δεν είναι παράλληλα μετατεθημένα και κανονικά ένας πλήρης μετασχηματισμός Helmert θα έπρεπε να εφαρμοστεί (λαμβάνοντας υπόψη στροφή και αλλαγή κλίμακας). Ωστόσο και με την απλή μετατόπιση που εφαρμόζεται , παραμένουμε στα όρια της ακρίβειας WGS84<->ED50, ελαφρά χειρότερη δηλαδή από ±10 μέτρα σε κάθε άξονα.

Το σύστημα ΕΜΠ 3 μοιρών καλύπτει την Ελλάδα σε τρεις ζώνες. kappa0=0.9999, x0=200000, phi0=34, lambda0=23.7163375. Η τιμή του phi0=34 μεταφράζεται ουσιαστικά σε ένα y0=-3762911.963.

Η προβολή του Hatt στο ελλειψοειδές του Bessel αφορά στην ουσία πάνω από 100 τοπικά συστήματα συντεταγμένων σε διάφορα φύλλα χάρτη. Μία πλήρη μεταφορά Helmert εφαρμόζεται, δίνοντας στροφή ε=17.6 ppm (=3"63) και αλλαγή κλίμακας dS=15.9 ppm. Για την εφαρμογή της μεταφοράς από το παλιό σύστημα στο νέο δεν βρήκα επαρκή τεκμηρίωση πλην των σημειώσεων του ΟΚΧΕ για το ΕΓΣΑ87. Ειδικά για την στροφή την εφάρμοσα στις συντεταγμένες του κεντρικού σημείου του ΕΓΣΑ87 (βάθρο Διονύσου), οπότε αναλύεται στις τρεις παρακάτω συνιστώσες:

RX =-12.664 ppm
RY =  -5.620 ppm
RZ = -10.854 ppm

Από δοκιμές που έκανα σε συντεταγμένες στα άκρα χαρτών της ΓΥΣ, οι μετατροπές μου απέχουν έως 0.1"-0.3" από τις αντίστοιχες της ΓΥΣ, στα όρια της μειωμένης ακρίβειας που δίνει ο μετασχηματισμός με τις τρεις μετατοπίσεις, την αλλαγή κλίμακας και τις τρεις στροφές. Λόγω της ακρίβειας του μετασχηματισμού, οι μετασχηματισμένες συντεταγμένες (π.χ. χ,ψHatt ->X,YΕΓΣΑ87) δεν χρησιμοποιούνται σε γεωδαιτικές ή και τοπογραφικές εργασίες ακριβείας αλλά μπορούν να χρησιμοποιηθούν για εντοπισμό σε χάρτη, κλπ. Μπορείτε να δείτε τον κώδικα για να έχετε μία εικόνα πως γίνεται η μετατροπή. Οποιοσδήποτε θα μπορούσε να ελέγξει τις παραμέτρους της μετατροπή Hatt, να με βοηθήσει να ρυθμίσω σωστά τις παραμέτρους μεταφοράς καθώς και να με βοηθήσει στην τεκμηρίωση για τις παραμέτρους μεταφοράς (Hatt και ED50) είναι ευπρόσδεκτος.

Κώδικας (source code)

Ο κώδικας είναι standard C προσαρμοσμένος να compile σε Visual C++ (φτιάξτε ένα άδειο dll project σε VC++ και προσθέστε όλα τα *.h, *.cpp, *.def, έχει δοκιμαστεί σε VC++ 6). Με ελάχιστες τροποποιήσεις κομπιλάρει σε οποιοδήποτε compiler, μάλιστα θα βρείτε ένα Makefile το οποίο φτιάχνει μία shared lib με gcc καθώς και ένα test program. Το κομμάτι αυτό (Makefile - Linux) θέλει λίγη δουλίτσα ακόμα για να είναι πλήρως χρησιμοποιήσιμο (αν θέλετε να βοηθήσετε σε αυτό το σημείο, η βοήθεια θα είναι ευπρόσδεκτη!). Το αρχείο με τον πηγαίο κώδικα (source code):

Source code - πηγαίος κώδικας (github)

Περιλαμβάνει το κύριο αρχείο πηγαίου κώδικα (main.cpp) καθώς και ένα .def αρχείο για τις συναρτήσεις που γίνονται export (για την VC++). Αν δεν περιλάβετε το .def θα πρέπει να ορίσετε τις συναρτήσεις με την macro DLLAPI, ωστόσο αυτό δεν είναι καλή ιδέα, διότι τα ονόματα των συναρτήσεων γίνονται τότε decorated.

Interface

Οι παρακάτω συναρτήσεις είναι για την ώρα υλοποιημένες. Θα καταβληθεί προσπάθεια ώστε το interface να αποκτήσει γενικότερη μορφή. Οι συναρτήσεις επιστρέφουν έναν ακέραιο αριθμό. Μηδενικό αποτέλεσμα σημαίνει υπολογισμός χωρίς κάποιο σφάλμα κατά την εκτέλεση. Μη μηδενικό αποτέλεσμα σημαίνει κάποιο errno<>0, μπορείτε να λάβετε αφορμή από μή-μηδενική τιμή ώστε να σηκώσετε exception. Οι επιστρεφόμενες τιμές γίνονται μέσω κλήσης κατά αναφορά, περνώντας pointer. Σε άλλες γλώσσες προγραμματισμού, αυτό αντιστοιχεί π.χ. σε var για την Pascal, ByRef για την Visual Basic, κλπ. Το τι κάνουν οι παρακάτω συναρτήσεις είναι προφανές από το όνομά τους. Μπορείτε να δείτε τους κώδικες Pascal, Excel που έχω δώσει για να δείτε πως χρησιμοποιούνται οι παρακάτω συναρτήσεις:

αρχείο icoordstrans.h

Τα GSTYPE είναι αριθμητικοί τύποι των Datum και λαμβάνουν τις παρακάτω ακέραιες τιμές:

typedef enum gstype {
GS_GR87 = 0,
GS_WGS84 = 1,
GS_ED50_CYPRUS = 2,
GS_ED50_GREECE = 3,
GS_ED50_MEANEUROPE = 4,
GS_GR_BESSEL = 5

} GSTYPE;

Ενώ τα PCTYPE αφορούν DATUM και προβολή:

typedef enum pctype {
PC_GR87 = 0,
PC_UTM_ZONE29 = 1,
PC_UTM_ZONE30 = 2,
PC_UTM_ZONE31 = 3,
PC_UTM_ZONE32 = 4,
PC_UTM_ZONE33 = 5,
PC_UTM_ZONE34 = 6,
PC_UTM_ZONE35 = 7,
PC_UTM_ZONE36 = 8,
PC_UTM_ZONE37 = 9,
PC_ED50_CYPRUS_ZONE6 = 10,
PC_ED50_GREECE_ZONE4 = 11,
PC_ED50_GREECE_ZONE5 = 12,
PC_ED50_MEANEUROPE_ZONE0 =13,
PC_ED50_MEANEUROPE_ZONE1 =14,
PC_ED50_MEANEUROPE_ZONE2 =15,
PC_ED50_MEANEUROPE_ZONE3 =16,
PC_ED50_MEANEUROPE_ZONE4 =17,
PC_ED50_MEANEUROPE_ZONE5 =18,
PC_ED50_MEANEUROPE_ZONE6 =19,
PC_GR_HATT_ATHINA_CHALKIS = 20,
PC_GR_HATT_ATHINA_LAVRION = 21,
PC_GR_HATT_AEGINA = 22,
PC_GR_HATT_NEA_PSARA = 23,
PC_GR_HATT_THESSALONIKI = 24,
PC_GR_HATT_GIANNITSA = 25,
PC_GR_UTM3_WEST = 26,
PC_GR_UTM3_CENTRAL = 27,
PC_GR_UTM3_EAST = 28
} PCTYPE;

Έχω περιλάβει μερικά βασικά φύλλα χάρτη της Hatt που περιλαμβάνουν περιοχές της Αθήνας και της Θεσσαλονίκης. Για τα υπόλοιπα 130 κάπου φύλλα χάρτη, ο χρήστης μπορεί να χρησιμοποιήσει τις συναρτήσεις για Hatt <-> άλλο σύστημα και να εισάγει ο ίδιος το κέντρο φύλλο χάρτη.

Αποποίηση ευθυνών

Ο κατασκευαστής του λογισμικού και των βιβλιοθηκών, Στέφανος Κοζάνης, καθώς και το Εθνικό Μετσόβιο Πολυτεχνείο το οποίο παρέχει το παραπάνω υλικό μέσα από τις ιστοσελίδες του αποποιούνται από κάθε ευθύνη για τυχόν προβλήματα και ζημιές πάσης φύσεως που μπορεί να ανακύψουν από την εφαρμογή του παραπάνω λογισμικού / βιβλιοθηκών.

’δεια χρήσης

Δικαιώματα, Copyright (c) 2006 Στέφανος Κοζάνης. Το λογισμικό είναι κοινής χρήσης (Public Domain) και επιτρέπεται να αναπαραχθεί, τροποποιηθεί και διανεμηθεί με κάθε τρόπο και οπουδήποτε χωρίς όρους. Επιτρέπεται η εμπορική διάθεσή του αυτούσια ή ως τμήμα μεγαλύτερου έργου χωρίς να απαιτείται η άδεια του συγγραφέα, αυτό όμως δεν αποτρέπει την ταυτόχρονη ελεύθερη διανομή του.

Επικοινωνία

Στέφανος Κοζάνης, S.Kozanis@itia.ntua.gr

Ενημέρωση: 21 Σεπτεμβρίου 2011