Letter - QGIS Tutorials and Tips

Getting Started with Python Programming
QGIS Tutorials and Tips
Author
Ujaval Gandhi
http://google.com/+UjavalGandhi
Translations by
Christina Dimitriadou
Paliogiannis Konstantinos
Tom Karagkounis
This work is licensed under a Creative Commons Attribution 4.0 International License.
Ξεκιν■ντας προγραµµατισµ■ µε την Python
Το QGIS ■χει µια ισχυρ■ διασ■νδεση προγραµµατισµο■ που σας επιτρ■πει να επεκτε■νεται την
βασικ■ λειτουργικ■τητα του λογισµικο■, καθ■ς και γρ■φει σεν■ρια για την αυτοµατοπο■ηση
εργασι■ν σας. Το QGIS υποστηρ■ζει τη γνωστ■ γλ■σσα Python scripting. Ακ■µα και αν ε■στε
αρχ■ριος, µαθα■νοντας λ■γο Python και QGIS διεπαφ■ προγραµµατισµο■, θα ε■στε πολ■ πιο
παραγωγικο■ στην εργασ■α σας. Αυτ■ το σεµιν■ριο δεν υποθ■τει καµ■α προηγο■µενη γν■ση
προγραµµατισµο■ και ■χει σκοπ■ να δ■σει µια εισαγωγ■ στην Python scripting στο QGIS
(PyQGIS).
Επισκ■πηση του ■ργου
Θα φορτ■σουµε ■να διανυσµατικ■ σηµε■ο στρ■µατος εκπροσωπ■ντας ■λα τα µεγ■λα
αεροδρ■µια και θα χρησιµοποι■σουµε την Python για να δηµιουργ■σουµε ■να αρχε■ο
κειµ■νου µε το ■νοµα του αερολιµ■να, κωδικ■ αεροδροµ■ου, το γεωγραφικ■ πλ■τος και µ■κος
για κ■θε αεροδρ■µιο στο στρ■µα.
Π■ρτε τα δεδοµ■να
Θα
χρησιµοποι■σουµε
τα
Αεροδρ■µια
<http://www.naturalearthdata.com/downloads/10m-cultural-vectors/airports/> _ dataset απ■ Natural
Earth.
Κατεβ■στε το Airports αρχε■ο.
Πηγ■ δεδοµ■νων [naturalearth] _
∆ιαδικασ■α
1. Στο QGIS, µεταβε■τε στη διε■θυνση: menuselection: Επ■πεδα -> Προσθ■κη Vector Layer.
Αναζητ■στε το `` αρχε■ο ne_10m_airports.zip`` και κ■ντε κλικ στο: guilabel: Open.
Επιλ■ξτε το `` ne_10m_airports.shp`` στρ■µα και κ■ντε κλικ στο: guilabel: OK.
2. Θα δε■τε το `` ne_10m_airports`` στρ■µα ■χει τοποθετηθε■ στο QGIS.
3. Επιλ■ξτε το: guilabel: εργαλε■ο Identify και κ■ντε κλικ σε οποιοδ■ποτε απ■ τα σηµε■α για
να εξετ■σετε τα διαθ■σιµα χαρακτηριστικ■. Θα δε■τε ■τι το ■νοµα του αεροδροµ■ου και
ο 3-ψ■φιος κωδικ■ς του περι■χονται στα χαρακτηριστικ■ `` name`` και `` iata_code``
αντ■στοιχα.
4. Το QGIS παρ■χει µια ενσωµατωµ■νη κονσ■λα, ■που µπορε■τε να πληκτρολογ■σετε
εντολ■ς Python και να π■ρετε το αποτ■λεσµα. Αυτ■ η κονσ■λα ε■ναι ■νας πολ■ καλ■ς
τρ■πος για να µ■θετε scripting, αλλ■ και να κ■νετε γρ■γορη επεξεργασ■α δεδοµ■νων.
Ανο■ξτε το: guilabel: Python Console πηγα■νοντας στο: menuselection:` Plugins -> Python
Console`.
5. Θα δε■τε µια ν■α οθ■νη ανοιχτ■ στο κ■τω µ■ρος του QGIS καµβ■. Θα δε■τε µια γραµµ■
■πως `` `` >>> στο κ■τω µ■ρος ■που µπορε■τε να πληκτρολογ■σετε εντολ■ς. Για την
αλληλεπ■δραση µε το περιβ■λλον QGIS, πρ■πει να χρησιµοποι■σετε την `` iface``
µεταβλητ■. Για να αποκτ■σετε πρ■σβαση στο τρ■χον ενεργ■ στρ■µα του QGIS,
πληκτρολογ■στε την παρακ■τω φρ■ση και πατ■στε το πλ■κτρο: kBd: Enter. Η εντολ■ αυτ■
φ■ρνει την αναφορ■ στο ■δη φορτωµ■νο στρ■µα και το αποθηκε■ει στη `` layer``
µεταβλητ■.
layer = iface.activeLayer()
6. Υπ■ρχει µια ε■χρηστη λειτουργ■α που ονοµ■ζεται `` dir () `` στη Python ■που σας δε■χνει
■λες τις διαθ■σιµες µεθ■δους για κ■θε αντικε■µενο. Αυτ■ ε■ναι χρ■σιµο ■ταν δεν ε■στε
σ■γουροι για το τι λειτουργ■ες ε■ναι διαθ■σιµες για το αντικε■µενο. Εκτελ■στε την
ακ■λουθη εντολ■ για να δο■µε τι εν■ργειες µπορο■µε να κ■νουµε για την `` layer``
µεταβλητ■.
dir(layer)
7. Θα δε■τε µια µακρ■ λ■στα µε τις διαθ■σιµες λειτουργ■ες. Προς το παρ■ν, θα
χρησιµοποι■σουµε µια λειτουργ■α που ονοµ■ζεται `` getFeatures () `` η οπο■α θα σας
πα■ρνει την αναφορ■ σε ■λες τις λειτουργ■ες εν■ς στρ■µατος. Στη δικ■ µας περ■πτωση,
κ■θε στοιχε■ο θα ε■ναι ■να σηµε■ο που αντιπροσωπε■ει ■να αεροδρ■µιο. Μπορε■τε να
πληκτρολογ■σετε την ακ■λουθη εντολ■ για να µετακινηθε■τε µ■σα απ■ κ■θε ■να απ■ τα
χαρακτηριστικ■ στην τρ■χουσα στρ■ση. Σιγουρευτε■τε ■τι ■χετε προσθ■σει 2 κεν■ πριν
πληκτρολογ■σετε τη δε■τερη γραµµ■.
for f in layer.getFeatures():
print f
8. ■πως θα δε■τε στην ■ξοδο, κ■θε γραµµ■ περι■χει µια αναφορ■ σε ■να χαρακτηριστικ■
στο εσωτερικ■ του στρ■µατος. Η αναφορ■ στο χαρακτηριστικ■ αποθηκε■εται στην `` f``
µεταβλητ■. Μπορο■µε να χρησιµοποι■σουµε την `` f`` µεταβλητ■ για να αποκτ■σουµε
πρ■σβαση στις ιδι■τητες του κ■θε χαρακτηριστικο■. Πληκτρολογ■στε τα ακ■λουθα για
να εκτυπ■σετε το `` name`` και `` iata_code`` για κ■θε χαρακτηριστικ■ αεροδρ■µιο.
for f in layer.getFeatures():
print f['name'], f['iata_code']
9. ■τσι τ■ρα ξ■ρετε π■ς να ■χετε πρ■σβαση µε προγραµµατισµ■ τις ιδι■τητες του κ■θε
χαρακτηριστικο■ σε ■να στρ■µα. Τ■ρα, ας δο■µε π■ς µπορο■µε να ■χουµε πρ■σβαση
στις συντεταγµ■νες του χαρακτηριστικο■. Οι συντεταγµ■νες του διαν■σµατος
χαρακτηριστικ■ν µπορο■ν να προσεγγιστο■ν µε την κλ■ση geometry() συν■ρτησης. Αυτ■
η συν■ρτηση επιστρ■φει ■να γεωµετρικ■ αντικε■µενο που µπορο■µε να αποθηκε■σουµε
στη µεταβλητ■ `` geom``. Μπορε■τε να εκτελ■σετε την asPoint()` συν■ρτηση` στο
γεωµετρικ■ αντικε■µενο για να π■ρει το x και y τις συντεταγµ■νες του σηµε■ου. Αν το
χαρακτηριστικ■ σας ε■ναι µια γραµµ■ ■ ■να πολ■γωνο, µπορε■τε να χρησιµοποι■σετε
τις `` asPolyline () `` ■ `` asPolygon () `` συναρτ■σεις . Πληκτρολογ■στε τον ακ■λουθο
κ■δικα στη γραµµ■ και πατ■στε το πλ■κτρο: kBd: Enter να δε■τε τις x και y συντεταγµ■νες
του κ■θε χαρακτηριστικο■.
for f in layer.getFeatures():
geom = f.geometry()
print geom.asPoint()
10. Τι θα συµβε■ αν θ■λαµε να π■ρουµε µ■νο τη `` x`` συντεταγµ■νη του χαρακτηριστικο■;
Μπορε■τε να καλ■σετε τη συν■ρτηση x() σχετικ■ µε το αντικε■µενο και να π■ρετε το
σηµε■ο x συντεταγµ■νης.
for f in layer.getFeatures():
geom = f.geometry()
print geom.asPoint().x()
11. Τ■ρα ■χουµε ■λα τα κοµµ■τια που µπορο■µε να εν■σουµε για να δηµιουργ■σουν το
επιθυµητ■ αποτ■λεσµα µας. Πληκτρολογ■στε τον ακ■λουθο κ■δικα για να εκτυπ■σετε τα
■νοµα, iata_code, γεωγραφικ■ πλ■τος και µ■κος καθεν■ς απ■ τα χαρακτηριστικ■ του
αεροδροµ■ου. Το % s και % f συµβολισµο■ ε■ναι τρ■ποι για να διαµορφ■σετε µια σειρ■
και ■ναν αριθµ■ των µεταβλητ■ν.
for f in layer.getFeatures():
geom = f.geometry()
print '%s, %s, %f, %f' % (f['name'], f['iata_code'],
geom.asPoint().y(), geom.asPoint().x())
12. Μπορε■τε να δε■τε το εκτυπωµ■νο αρχε■ο στην ■ξοδο της κονσ■λας. ■νας πιο χρ■σιµος
τρ■πος για να αποθηκε■σετε την ■ξοδο ε■ναι σε ■να αρχε■ο. Μπορε■τε να
πληκτρολογ■σετε τον παρακ■τω κ■δικα για να δηµιουργ■σετε ■να αρχε■ο και να γρ■ψετε
την ■ξοδο εκε■. Αντικαταστ■στε τη διαδροµ■ του αρχε■ου µε ■να µονοπ■τι για το δικ■
σας σ■στηµα. Σηµει■στε ■τι προσθ■τουµε `` n`` στο τ■λος της γραµµ■ς µορφοπο■ησης
µας. Αυτ■ γ■νεται για να προσθ■σετε µια ν■α γραµµ■, µετ■ προσθ■τουµε τα δεδοµ■να
για κ■θε χαρακτηριστικ■. Θα πρ■πει επ■σης να σηµειωθε■ η `` unicode_line = line.encode
('utf-8') `` γραµµ■. Μ■ας και το στρ■µα µας περιλαµβ■νει ορισµ■να στοιχε■α µε τους
χαρακτ■ρες Unicode, δεν µπορο■µε να το γρ■ψουµε απλ■ σε ■να αρχε■ο κειµ■νου.
Κωδικοποιο■µε το κε■µενο χρησιµοποι■ντας την κωδικοπο■ηση UTF-8 και στη συν■χεια
το γρ■φουµε στο αρχε■ο κειµ■νου.
output_file = open('c:/Users/Ujaval/Desktop/airports.txt', 'w')
for f in layer.getFeatures():
geom = f.geometry()
line = '%s, %s, %f, %f\n' % (f['name'], f['iata_code'],
geom.asPoint().y(), geom.asPoint().x())
unicode_line = line.encode('utf-8')
output_file.write(unicode_line)
output_file.close()
13. Μπορε■τε να µεταβε■τε στη θ■ση του αρχε■ου εξ■δου που ■χετε ορ■σει και να ανο■ξετε
το αρχε■ο κειµ■νου. Θα δε■τε τα δεδοµ■να απ■ το shapefile των αεροδροµ■ων που
εξ■γαµε µε την Python scripting.