Πίνακας Περιεχομένων

5. Βασικές λειτουργίες

5.1 Λειτουργίες εισαγωγής και διαχείρισης δεδομένων

5.1.1 Δημιουργία βάσης δεδομένων και σύνδεση με αυτή

Ξεκινάμε πηγαίνοντας στο μενού “Start”, “Programs”, “PostgreSQL 8.3”, “pgAdmin III”.

Σημείωση: Η βάση δεδομένων PostGreSQL δεν έχει ή ίδια κάποιο γραφικό περιβάλλον διεπαφής με τον χρήστη. Λειτουργεί σαν υπηρεσία (service). Για την αλληλεπίδραση με την βάση δεδομένων χρησιμοποιείται ένα πρόγραμμα χρήστη (client). Ένα τέτοιο πρόγραμμα είναι και το pgAdminn III που παρέχεται και εγκαθίσταται μαζί με την βάση δεδομένων. Υπάρχει η δυνατότητα να χρησιμοποιηθεί κάποιο διαφορετικό πρόγραμμα με ιδιαίτερες δυνατότητες. Παρόλα αυτά σε αυτό τον οδηγό για λόγους ευκολίας και τυποποίησης θα χρησιμοποιήσουμε το πρόγραμμα που παρέχεται μαζί με την βάση δεδομένων, δηλαδή το pgAdminn III.

Το pgAdmin III έχει την μορφή που παρουσιάζεται στην εικόνα που ακολουθεί. Πάνω αριστερά ακριβώς κάτω από την ένδειξη “Servers (1)” υπάρχει η ένδειξη “PostgreSQL Database Server 8.3 (localhost 5432)”. Εκεί κάνουμε δεξί κλικ και επιλέγουμε “connect”. Μας ζητείται όνομα χρήστη και κωδικός και πλκτρολογούμε το όνομα postgres και τον κωδικό που επιλέξαμε στο βήμα 7 της διαδικασίας εγκατάστασης.

Πατάμε πάνω στο σύμβολο “+” αριστερά από την ένδειξη “PostgreSQL Database Server 8.3 (localhost 5432)” και έτσι επεκτείνουμε το μενού. Κάνουμε το ίδιο και στην ένδειξη “databases”.

Βλέπουμε ότι έχουν δημιουργηθεί δύο βάσεις δεδομένων, η “postgres” και η “postgis”. Κάνουμε δεξί κλικ στην ένδειξη “Databases (2)” και επιλέγουμε “New Database”.

Στην φόρμα που ακολουθεί επιλέγουμε εισαγάγουμε τις ακόλουθες τιμές:

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

και όχι έτσι:

Αν αυτό δεν συμβαίνει, τότε ανανεώνουμε την σύνδεση με την βάση δεδομένων πιέζοντας

και ξαναπροσπαθούμε.

Εναλλακτικά μπορούμε να δημιουργήσουμε την βάση δεδομένων με εντολή SQL ως εξής: Πατάμε πάνω στην βάση δεδομένων postgres και στην συνέχεια επιλέγουμε από το μενού του προγράμματος στο πάνω μέρος της οθόνης “Tools”, “Query tool”. Έτσι εμφανίζεται ένα νέο παράθυρο στο οποίο μπορούμε να πληκτρολογήσουμε κώδικα σε γλώσσα SQL και ενσωματωμένες διαδικαστικές γλώσσες. Εκεί πληκτρολογούμε την ακόλουθη εντολή SQL:

CREATE DATABASE template_postgis WITH ENCODING=’UTF8’ OWNER = postgres TEMPLATE= postgis TABLESPACE = pg_default;

Στην συνέχεια εκτελούμε αυτή την εντολή επιλέγοντας από το μενού στο πάνω μέρος του προγράμματος “Query”, “Execute” ή πιέζοντας F5.

Αντίστοιχα εκτελούμε την παρακάτω εντολή για να δημιουργήσουμε την βάση δεδομένων στην οποία θα εργαστούμε στα πλαίσια του παρόντα οδηγού.

CREATE DATABASE thessaloniki WITH ENCODING=’UTF8’ OWNER = postgres TEMPLATE= template_postgis TABLESPACE = pg_default;

Όταν η βάση έχει πλέον δημιουργηθεί τότε στο κάτω μέρος του παραθύρου ερωτημάτων παίρνουμε την ένδειξη: “Query returned successfully with no result in ....... ms”

Γυρίζουμε στο παράθυρο του pgAdmin III. Πατάμε την ένδειξη “Databases (3)” και ανανεώνουμε την σύνδεση με την βάση δεδομένων.

Τώρα πρέπει πλέον να βλέπουμε τις ακόλουθες βάσεις δεδομένων:

Στην συνέχεια, και προκειμένου να αρχίσουμε να εργαζόμαστε στην βάση δεδομένων “thessaloniki” που μόλις δημιουργήσαμε, πατάμε πάνω της και επιλέγουμε από τα μενού “Tools”, “Query tool”. Έτσι ανοίγουμε ένα παράθυρο ερωτημάτων SQL.

5.1.2 Δημιουργία σχήματος

Μία βάση δεδομένων περιέχει στοιχεία τα οποία είναι ομαδοποιημένα σε σχήματα. Κάθε σχήμα περιέχει πίνακες και συναφή με αυτούς και την βάση δεδομένων στοιχεία όπως δείκτες, περιορισμούς, σχέσεις, σκανδαλιστές, λειτουργίες κ.α. Τα σχήματα εξυπηρετούν και την διαβάθμιση δικαιωμάτων επέμβασης σε μία βάση δεδομένων. Με το που δημιουργούμε μία βάση δεδομένων, αυτή περιέχει ένα σχήμα το οποίο ονομάζεται “public”. Αν θελήσουμε να δημιουργήσουμε ένα άλλο σχήμα τότε μπορούμε να χρησιμοποιήσουμε την ακόλουθη εντολή SQL (έστω ότι θέλουμε να δημιουργήσουμε ένα σχήμα με την ονομασία ονομάζεται health_services):

CREATE SCHEMA health_services AUTHORIZATION postgres; GRANT ALL ON SCHEMA health_services TO postgres; GRANT ALL ON SCHEMA health_services TO public;

Αφού πληκτρολογίσουμε αυτή την εντολή στο παράθυρο ερωτημάτων επιλέγουμε “execute”.

Πλέον, αν ανανεώσουμε την σύνδεση με την βάση δεδομένων, τότε βλέπουμε ότι αυτή έχει πέραν του “public” και ένα σχήμα που ονομάζεται “health_services”.

Αυτή η διαδικασία μπορεί να γίνει γραφικά από το παράθυρο pgAdminIII πατώντας πάνω στην βάση δεδομένων και στην συνέχεια επιλέγοντας “New Object”, “New Schema”.

5.1.3 Δημιουργία πινάκων και εισαγωγή δεδομένων

Το επόμενο βήμα μετά την δημιουργία της βάσης δεδομένων είναι η δημιουργία πινάκων και η εισαγωγή δεδομένων. Τα δεδομένα αποθηκεύονται στην βάση δεδομένων ομαδοποιημένα σε πίνακες. Οι πίνακες περιέχουν κατηγορίες ομοειδών στοιχείων (λ.χ. Ένας πίνακας περιέχει δρόμους, ένας άλλος δήμους, ένας άλλος νοσοκομεία). Ανάλογα με το πλήθος των γνωρισμάτων (δηλαδή στηλών) που περιέχονται στους πίνακες περιλαμβάνονται πληροφορίες για θεματικά και γεωμετρικά χαρακτηριστικά των επιμέρους στοιχείων. Στην συνέχεια θα αναπτύξουμε τρεις διαφορετικούς τρόπους δημιουργίας πινάκων και εισαγωγής δεδομένων: Με την χρήση εντολών SQL Εισαγωγή από αρχεία τύπου *.shp με την χρήση του προγράμματος shp2pgsql Εισαγωγή από αρχεία τύπου *.shp μέσω του QuantumGIS

Δημιουργία πινάκων και εισαγωγή δεδομένων με εντολές SQL

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

Αύξων αριθμός οδικού τμήματος Όνομα οδικού τμήματος Όνομα οδικού τμήματος με λατινικούς χαρακτήρες Δείκτης μέσης ταχύτητας οδικού τμήματος Θέση (γεωμετρία) του οδικού τμήματος

Επιπλέον πρέπει να γνωρίζουμε ποιο όνομα επιθυμούμε να δώσουμε στον σχετικό πίνακα. Έστω ότι επιθυμούμε να τον ονομάσουμε “road_net”. Για να δημιουργήσουμε τον σχετικό πίνακα πληκτρολογούμε την ακόλουθη εντολή στο παράθυρο ερωτημάτων και επιλέγουμε “execute”:

CREATE TABLE health_services.road_net( id INTEGER PRIMARY KEY, name VARCHAR(60), name_eng VARCHAR(60), speed_profile INTEGER );

Η παραπάνω εντολή περιέχει τα εξής: Στην πρώτη γραμμή περιγράφεται το σχήμα στο οποίο θα περιλαμβάνεται ο πίνακας καθώς και το όνομα που θα έχει. Στην δεύτερη γραμμή προσδιορίζεται το γνώρισμα αύξοντος αριθμού που θα είναι ακέραιος αριθμός και το πρωτεύον κλειδί του πίνακα. Το πρωτεύον κλειδί είναι ένα γνώρισμα που έχει μοναδική τιμή για κάθε εγγραφή του πίνακα, και είναι αναγκαίο για την διαχείριση των πινάκων από την βάση δεδομένων. Στην τρίτη και τέταρτη γραμμή προσδιορίζονται τα γνωρίσματα του ονόματος με ελληνικούς και λατινικούς χαρακτήρες που θα έχουν αλφαριθμητική μορφή (δηλαδή θα περιλαμβάνουν γράμματα, λοιπούς χαρακτήρες και αριθμούς) και μέγεθος 60 χαρακτήρων. Στην τέταρτη γραμμή προσδιορίζεται το γνώρισμα speed_profile που θα έχει μορφή ακέραιου αριθμού. Παρόλα αυτά μέχρι στιγμής δεν έχει προσδιοριστεί το γνώρισμα γεωμετρίας του πίνακα. Αυτό γίνεται με την ακόλουθη εντολή:

SELECT AddGeometryColumn(’health_services’,’road_net’,’the_geom’,4121,’LINESTRING’,2);

Αυτή η εντολή καλεί την λειτουργία AddGeometryColumn που δημιουργεί γνωρίσματα γεωμετρίας. Στην παρένθεση που ακολουθεί την εντολή AddGeometryColumn προσδιορίζονται τα εξής:

Το σχήμα στο οποίο βρίσκεται ο πίνακας (health_services) Το όνομα του πίνακα για τον οποίον θα δημιουργηθεί το γνώρισμα γεωμετρίας (road_net) Το όνομα του γνωρίσματος γεωμετρίας (the_geom) Τον κωδικό του γεωδαιτικού συστήματος αναφοράς στο οποίο βρίσκονται τα δεδομένα που θα εισαχθούν στον πίνακα (4121, ο κωδικός αυτός υποδεικνύει το σύστημα ΕΓΣΑ 87) Το είδος της γεωμετρίας των στοιχείων που θα εισαχθούν (δηλαδή, σημεία, γραμμές ή πολύγωνα, πολυσημεία, πολυγραμμές, πολύ-πολύγωνα (multi-polygons) και συλλογές γεωμετρίας (geometry collections)). Εδώ προσδιορίζουμε ότι πρόκειται για γραμμή (LINESTRING). Το πλήθος των διαστάσεων που επιθυμούμε να υποστηρίζει η γεωμετρία του πίνακα (2). Στην συνέχεια ενεργοποιούμε τον έλεγχο εγκυρότητας της γεωμετρίας με την ακόλουθη εντολή:

ALTER TABLE health_services.road_net ADD CONSTRAINT geom_valid_check CHECK (isvalid(the_geom));

Στην εντολή αυτή προσδιορίζεται αρχικά το σχήμα και ο πίνακας στον οποίο επιθυμούμε να εισαχθεί η εντολή (health_services.road_net) Ο έλεγχος δημιουργείται σαν ένα νέο στοιχείο της βάσης δεδομένων. Ετσι πρέπει να προσδιορίσουμε το όνομά του (geom_valid check). Στο τέλος προσδιορίζεται το όνομα της στήλης γεωμετρίας στην οποία θα εφαρμόζεται ο έλεγχος (the_geom).

Στην συνέχεια δημιουργούμε έναν χωρικό δείκτη γενικευμένου δένδρου αναζήτησης για τον πίνακα με την εντολή: CREATE INDEX road_net_idx ON health_services.road_net USING GIST (the_geom);

Τον δείκτη ονομάζουμε road_net_idx. Προσδιορίζουμε το σχήμα και το όνομα του πίνακα (health_services.road_net). Ακόμα προσδιορίζουμε το είδος του δείκτη (GIST) και το όνομα του πεδίου γεωμετρίας (the_geom).

Στην συνέχεια εισάγουμε δεδομένα με διαδοχικές εντολές INSERT. Οι εντολές έχουν την ακόλουθη μορφή:

INSERT INTO όνομα σχήματος.όνομα πίνακα VALUES (τιμή γωρίσματος1,τιμή γωρίσματος 2, ....,τιμή γωρίσματος ν, GeomFromText(’LINESTRING( κόμβος γραμμμής 1, κόμβος γραμμμής 2, ..... κόμβος γραμμμής ν,)’,κωδικός γεωδαιτικού συστήματος));

Ακολουθώντας αυτό το πρότυπο οι εντολές με τις οποίες θα εισάγουμε δεδομένα οδικού δικτύου για την πόλη της Θεσσαλονίκης είναι οι ακόλουθες:

INSERT INTO health_services.road_net VALUES (101,’ΘΕΣΣΑΛΟΝΙΚΗΣ-ΜΑΛΓΑΡΩΝ’,’THESSALONIKIS-MALGARWN’,10.25, GeomFromText(’LINESTRING( 19232578.31 4929703.03, 19237529.19 4933056.09, 19240777.92 4933359.13, 19245128.96 4933842.78)’,4121));

INSERT INTO health_services.road_net VALUES (102,’ΝΕΑ ΔΥΤΙΚΗ ΕΙΣΟΔΟΣ’,’NEA DYTIKI EISODOS’,14.25, GeomFromText (’LINESTRING( 19245128.96 4933842.78, 19246145.94 4933791.02, 19247162.92 4933490.83, 19248471.59 4932704.17, 19249220.53 4932352.26, 19249527.99 4932031.42, 19250576.51 4931513.95)’,4121));

INSERT INTO health_services.road_net VALUES (203,’28ΗΣ ΟΚΤΩΒΡΙΟΥ’,’28is OCTOVRIOU’ ,10, GeomFromText(’LINESTRING( 19247162.92 4933490.83, 19248038 4932538.56, 19248321.81 4932021.07, 19249693.55 4931565.7, 19250576.51 4931513.95 )’,4121));

INSERT INTO health_services.road_net VALUES (204,’ΛΑΓΚΑΔΑ’,’LAGKADA’,06, GeomFromText(’LINESTRING( 19250576.51 4931513.95, 19251065.75 4931618.74, 19251099.74 4933180.61, 19250941.12 4933894.7, 19251462.31 4936067.03, 19251473.64 4937004.56, 19251507.63 4937287.32, 19252448.04 4939609.27, 19253886.98 4942378.48 )’,4121));

INSERT INTO health_services.road_net VALUES (205,’ΜΟΝΑΣΤΗΡΙΟΥ’,’MONASTIRIOU’,08, GeomFromText(’LINESTRING( 19236699.04 4941127.77, 19239055.72 4940353.61, 19240551.31 4940145.19, 19241140.48 4939430.64, 19241389.75 4938775.69, 19245559.27 4936037.27, 19246714.95 4935114.71, 19247598.71 4933835.19, 19251065.75 4931618.74 )’,4121));

INSERT INTO health_services.road_net VALUES (206,’ΕΓΝΑΤΙΑ’,’EGNATIA’,07, GeomFromText(’LINESTRING( 19240777.92 4933359.13, 19239690.22 4936453.93, 19239690.22 4938507.76, 19241140.48 4939430.64, 19241888.28 4939847.45, 19252448.04 4939609.27, 19254306.2 4939400.87, 19254351.52 4938924.54, 19253626.38 4938388.69, 19253513.08 4937852.87, 19253603.72 4937153.38 )’,4121));

INSERT INTO health_services.road_net VALUES (207,’ΠΕΡΙΦΕΡΕΙΑΚΗ ΛΕΟΦΩΡΟΣ’,’PERIFEREIAKI LEOFOROS’,09, GeomFromText

(’LINESTRING( 19245128.96 4933842.78, 19245106.06 4935367.66, 19245559.27 4936037.27, 19246556.33 4936945.03, 19247779.99 4937093.85, 19251473.64 4937004.56, 19252244.1 4937421.26, 19253603.72 4937153.38, 19253988.95 4935992.63, 19254351.52 4935129.59, 19254759.4 4934742.74, 19254510.14 4933522.77, 19254918.03 4931588.99, 19255529.86 4929982.76, 19256209.67 4929120.26, 19256504.26 4928049.68, 19257048.11 4927722.58, 19258022.51 4927633.38, 19258226.45 4927365.76, 19258135.81 4925938.61, 19257523.98 4924690.02, 19255756.46 4922995.77, 19254918.03 4922252.77 )’,4121));

INSERT INTO health_services.road_net VALUES (208,’ΕΘΝΙΚΗΣ ΑΝΤΙΣΤΑΣΕΩΣ’,’ETHNIKIS ANTISTASEOS’,05, GeomFromText

(’LINESTRING( 19254918.03 4922252.77, 19254487.48 4922995.77, 19253966.29 4923946.89 )’,4121));

INSERT INTO health_services.road_net VALUES (209,’ΒΑΣΙΛΙΣΣΗΣ ΟΛΓΑΣ’,’VASSILISIS OLGAS’,07, GeomFromText(’LINESTRING( 19253966.29 4923946.89, 19253467.76 4924749.47, 19252969.23 4926414.3, 19253195.83 4928406.53, 19252969.23 4929625.85 )’,4121));

INSERT INTO health_services.road_net VALUES (210,’ΤΣΙΜΙΣΚΗ’,’TSIMISKI’,06, GeomFromText(’LINESTRING( 19252969.23 4929625.85, 19250576.51 4931513.95 )’,4121));

INSERT INTO health_services.road_net VALUES (211,’ΕΓΝΑΤΙΑ’,’EGNATIA’,08, GeomFromText(’LINESTRING( 19251065.75 4931618.74, 19253445.1 4929953.01, 19254056.93 4929179.74, 19254419.5 4924600.84, 19255756.46 4922995.77 )’,4121));

INSERT INTO health_services.road_net VALUES (212,’ΕΛΕΥΘΕΡΙΟΥ ΒΕΝΙΖΕΛΟΥ’,’ELEFTHERIOU VENIZELOU’,05, GeomFromText

(’LINESTRING( 19254487.48 4922995.77, 19253671.7 4923382.15, 19253150.51 4923887.44 )’,4121));

INSERT INTO health_services.road_net VALUES (213,’ΜΕΓΑΛΟΥ ΑΛΕΞΑΝΔΡΟΥ’,’MEGALOU ALEKSANDROU’,07, GeomFromText

(’LINESTRING( 19253150.51 4923887.44, 19253037.21 4925135.93, 19252674.64 4926146.72, 19252991.89 4928406.53, 19252923.91 4929150 )’,4121));

INSERT INTO health_services.road_net VALUES (214,’ΛΕΩΦΟΡΟΣ ΝΙΚΗΣ’,’LEOFOROS NIKIS’,06, GeomFromText(’LINESTRING( 19252923.91 4929150, 19251994.83 4930101.73, 19250997.77 4930875.08, 19250576.51 4931513.95 )’,4121));

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

CREATE TABLE health_services.hospitals( ID INTEGER PRIMARY KEY, NAME VARCHAR(70) );

SELECT AddGeometryColumn(’health_services’,’hospitals’,’the_geom’,4121,’POINT’,2);

ALTER TABLE health_services.hospitals ADD CONSTRAINT hospitals_valid_check CHECK (isvalid(the_geom));

CREATE INDEX hospitals_idx ON health_services.hospitals USING GIST (the_geom);

Παραδείγματα εντολών SQL για την εισαγωγή σημειακών δεδομένων:

INSERT INTO health_services.hospitals VALUES (200,’ΠΑΘΟΛΟΓΙΚΟ ΝΟΣΟΚΟΜΕΙΟ ΝΕΑΠΟΛΗΣ’,GeomFromText(’POINT (19252515.21 4933565.18)’,4121)); INSERT INTO health_services.hospitals VALUES (201,’ΝΟΣΟΚΟΜΕΙΟ ΑΓΙΟΣ ΔΗΜΗΤΡΙΟΣ’,GeomFromText(’POINT (19253596.71 4930995.65)’,4121)); INSERT INTO health_services.hospitals VALUES (202,’ΝΟΣΟΚΟΜΕΙΟ ΔΕΡΜΑΤΙΚΩΝ ΝΟΣΗΜΑΤΩΝ’,GeomFromText(’POINT (19253527.68 4926493.21)’,4121)); INSERT INTO health_services.hospitals VALUES (203,’ΝΟΣΟΚΟΜΕΙΟ ΑΧΕΠΑ’,GeomFromText(’POINT(19253865.17 4929898.8)’,4121));

Ένα άλλο παράδειγμα αφορά στην δημιουργία ενός πίνακα πολυγωνικών στοιχείων και την εισαγωγή δεδομένων σε αυτόν. Έστω ότι θέλουμε να δημιουργήσουμε έναν πίνακα με τα πολύγωνα των δήμων της Θεσσαλονίκης:

CREATE TABLE health_services.municipal( id INTEGER PRIMARY KEY, name VARCHAR(30) );

SELECT AddGeometryColumn(’health_services’, ‘municipal’,’the_geom’,4121,’POLYGON’,2);

ALTER TABLE health_services.municipal ADD CONSTRAINT geom_valid_check CHECK (isvalid(the_geom));

CREATE INDEX municipal_idx ON health_services.municipal USING GIST (the_geom)

Αν τώρα θελήσουμε να εισάγουμε πολυγωνικά δεδομένα πρέπει να χρησιμοποιήσουμε μία εντολή που να μοιάζει με την ακόλουθη:

INSERT INTO health_services.municipal VALUES (400,’ΘΕΣΣΑΛΟΝΙΚΗ’, GeomFromText(’POLYGON1)‘,4121));

Σημείωση: Η τιμή του πεδίου γεωμετρίας αποτελείται από την ακολουθία συντεταγμένων των σημείων που ορίζουν το πολύγωνο. Η πρώτη τιμή από αυτά τα σημεία (εδώ 19252337.28 4924473.456) επαναλαμβάνεται και στο τέλος της ακολουθίας. Με αυτό τον τρόπο δηλώνεται ότι κλείνει το πολύγωνο.

Αν θέλουμε να διαγράψουμε έναν πίνακα από αυτούς που δημιουργήσαμε μπορούμε να το κάνουμε σε γραφικό περιβάλλον pgAdminIII κάνοντας δεξί κλικ πάνω στον πίνακα και επιλέγοντας “Delete/Drop”. Ας διαγράψουμε λοιπόν τον πίνακα hospitals προκειμένου στην συνέχεια να τον εισάγουμε με διαφορετική μεθοδολογία.

Η ίδια λειτουργία μπορεί να γίνει και με εντολή SQL. Ας διαγράψουμε τον πίνακα “municipal”:

DROP TABLE health_services.municipal

Θα επανεισάγουμε αυτό τον πίνακα με άλλη μεθοδολογία σε παράδειγμα που θα ακολουθήσει.

Αν θέλουμε να διαγράψουμε όλα τα δεδομένα ενός πίνακα, αλλά όχι τον ίδιο τον πίνακα τότε μπορούμε να χρησιμοποιήσουμε την ακόλουθη εντολή:

DELETE FROM health_services.municipal

Εισαγωγή δεδομένων από αρχείο *.shp

Μαζί με το πρόγραμμα PostGIS παρέχεται και ένα πρόγραμμα γραμμής εντολών (command line tool) που επιτρέπει την μετατροπή δεδομένων *.shp σε πίνακες της χωρικής βάσης δεδομένων PostgreSQL/PostGIS. Το πρόγραμμα αυτό ονομάζεται shp2pgsql.

Έστω λοιπόν ότι θέλουμε να εισάγουμε στην χωρική βάση δεδομένων σημειακά δεδομένα που περιέχονται στο αρχείο hospitals.shp και αφορούν στα νοσοκομεία που βρίσκονται στην πόλη της Θεσσαλονίκης.

Αρχικά δημιουργούμε μία μεταβλητή συστήματος με το όνομα PATH και η και η οποία “δείχνει” στο φάκελο bin της PostgreSQL.

Επιλέγουμε “Start”, “My computer”, “Properties”, “Advanced”, “Environment Variables”, και στο επάνω τμήμα του παραθύρου όπου περιέχονται οι μεταβλητές χρήστη επιλέγουμε “New”,

Variable name: PATH Variable value: c:\Program Files\PostgreSQL\8.3\bin\

και OK.

Στην συνέχεια ανοίγουμε ένα παράθυρο γραμμής εντολών και πηγαίνουμε στον φάκελο όπου βρίσκεται το αρχείο hospitals.shp. Έστω ότι ο φάκελος αυτός είναι ο c:\Temp\.

Σημείωση: Τα αρχεία *.shp (shapefiles) είναι αρχεία που αποτελούνται από επιμέρους αρχεία και έτσι όταν “βλέπουμε” μία τοποθεσία με κάποιο μη εξειδικευμένος πρόγραμμα τότε βλέπουμε τα επιμέρους αρχεία. Για παράδειγμα, ανοίξουμε την τοποθεσία C:\temp με ένα πρόγραμμα που αναγνωρίζει τέτοιου τύπου αρχεία βλέπουμε ένα αρχείο, πχ το hospitals.shp. Αν ανοίξουμε την ίδια τοποθεσία με ένα πρόγραμμα που δεν αναγνωρίζει τέτοιου τύπου αρχεία τότε βλέπουμε κάποια επιμέρους αρχεία με επεκτάσεις *.shp, *.prj *.dbf, *.cpg, *.sbn και *.shx. Όλα αυτά τα αρχεία έχουν το ίδιο όνομα, δηλαδή hospitals.

Αφού ανοίξαμε το παράθυρο εντολών και προσδιορίσαμε την τοποθεσία όπου βρίσκονται τα δεδομένα μας, πληκτρολογούμε την εντολή:

shp2pgsql.exe -cDI -s4121 -W UTF-8 hospitals hospitals | psql -d thessaloniki -U postgres

και εκτελούμε την εντολή πατώντας enter

Η εισαγωγή των δεδομένων που βρίσκονται σε μορφή *.shp έχει ολοκληρωθεί και ένας πίνακας με το όνομα hospitals βρίσκεται πλέον στην βάση δεδομένων.

Ας εξηγήσουμε πως συντάσσεται η εντολή “shp2pgsql.exe -cDI -s 4121 hospitals hospitals | psql -d thessaloniki -U postgres”:

Το πρώτο κομμάτι της εντολής (shp2pgsql.exe -cDI -s 4121 hospitals hospitals) δημιουργεί εντολή SQL για την εισαγωγή των δεδομένων στην βάση δεδομένων.

Το “–c” δημιουργεί έναν νέο πίνακα. Αν ο χρήστης βάζει τα δεδομένα σε έναν πίνακα που ήδη υπάρχει τότε μπορεί να πλητρολογήσει “–a” αντί αυτού.

Το “-D” υποδεικνύει ότι το ενδιάμεσο αρχείο PostgreSQL θα έχει μορφή “dump” που επιτρέπει την γρηγορότερη εισαγωγή των στοιχείων στην βάση δεδομένων.

Το “-I” δημιουργεί δείκτη GiST στην στήλη της γεωμετρίας. Αν ο χρήστης εισάγει πολλαπλά αρχεία σε έναν πίνακα τότε μπορεί ο ίδιος να δημιουργήσει τον χωρικό δείκτη αφού ολοκληρώσει την εισαγωγή. Κάτι τέτοιο θα επιταχύνει την διαδικασία.

Το “-s” υποδεικνύει τον κωδικό γεωδαιτικού συστήματος (SRID) που ακολουθεί, εδώ 4121.

“hospitals” είναι το όνομα του αρχείου που εισάγεται.

Το δεύτερο “hospitals” είναι το όνομα που επιθυμούμε να έχει ο νέος πίνακας που θα δημιουργηθεί στην βάση δεδομένων.

Το δεύτερο τμήμα της εντολής ( psql -d thessaloniki -U postgres) καλεί την διεπαφή psql της βάσης δεδομένων PostgreSQL και μέσω αυτής στέλνει την εντολή SQL στην βάση δεδομένων. Το “ –d” προσδιορίζει ότι το όνομα που ακολουθεί είναι το όνομα της βάσης δεδομένων. Αντίστοιχα το “–U” προσδιορίζει ότι το όνομα που ακολουθεί είναι το όνομα του χρήστη.

Το μειονέκτημα που αντιμετωπίζουμε χρησιμοποιώντας αυτή τη μέθοδο είναι ότι ο νέος πίνακας δημιουργείται στο βασικό σχήμα της βάσης δεδομένων (public) και όχι στο σχήμα που δημιουργήσαμε. Αυτό μπορεί να αντιμετωπιστεί με την μετέπειτα αντιγραφή του πίνακα hospitals από το σχήμα public στο σχήμα health_services. Αυτό γίνεται με την χρήση της ακόλουθης εντολής SQL στο παράθυρο ερωτημάτων:

CREATE TABLE health_services.hospitals AS (SELECT * FROM public.hospitals); ALTER TABLE health_services.hospitals ADD CONSTRAINT hospitals_pkey PRIMARY KEY (gid); CREATE INDEX health_services_idx ON health_services.hospitals USING GIST (the_geom); DROP TABLE public.hospitals;

Σημείωση: Το πρόγραμμα shp2pgsql.exe έχει περισσότερες δυνατότητες από αυτή που παρουσιάζεται εδώ. Ανάμεσα σε αυτές θα πρέπει να αναφέρουμε την δυνατότητα δημιουργίας αρχείου *.sql με εντολές insert η αρχείου “dump” σε τοποθεσία του δίσκου που επιλέγει ο χρήστης. Τα αρχεία οποία μπορεί να φορτώσει “χειροκίνητα” ο χρήστης μέσω της διεπαφής psql ή του παραθύρου ερωτημάτων.

Εισαγωγή δεδομένων μέσω του προγράμματος QuantumGIS:

Το πρόγραμμα QuantumGIS παρέχει μία πολύ χρήσιμη διεπαφή για την εισαγωγή δεδομένων *.shp στην χωρική βάση δεδομένων PostgreSQL/PostGIS.

Ξεκινούμε το πρόγραμμα QuantumGIS επιλέγοντας “Start”, “All programs”, “QuantumGIS”, “QuantumGIS”.

Αρχικά βεβαιωνόμαστε ότι η επέκταση που εισαγάγει δεδομένα στην χωρική βάση δεδομένων PostgreSQL/PostGIS είναι ενεργοποιημένη. Από το μενού του προγράμματος (πάνω αριστερά) επιλέγουμε “Plugins”, “Manage plugins” και βεβαιωνόμαστε ότι η επέκταση με το όνομα “SPIT” είναι επιλεγμένη:

Αν δεν είναι επιλεγμένη την επιλέγουμε και πατάμε ΟΚ.

Στην συνέχεια επιλέγουμε από το μενού του προγράμματος “Plugins”, “SPIT”, “Import Shapefiles to PostgreSQL”.

Στην συνέχεια εμφανίζεται το παράθυρο της εφαρμογής.

Αρχικά γίνεται με την βάση δεδομένων όπου επιθυμούμε να εισαχθεί το αρχείο *.shp. Ο χρήστης πρέπει να επιλέξει “New” και στην φόρμα που ακολουθεί εισάγει τις παρακάτω τιμές.

Πατώντας “Test Connect” ελέγχουμε την σύνδεση με την βάση δεδομένων. Αν έχουμε εισάγει τις σωστές τιμές η σύνδεση θα πρέπει να λειτουργήσει.

Πατάμε ΟΚ καθώς και στο παράθυρο “Create a new PostGIS connection”

Από το παράθυρο της εφαρμογής SPIT επιλέγουμε την βάση δεδομένων “Thessaloniki” και επιλέγουμε “Connect”.

Στην συνέχεια από-επιλέγουμε το κουτί “Use Default SRID or specify here” και αντικαθιστούμε την τιμή “-1” με την τιμή 4121 που αντιστοιχεί στον κωδικό του γεωδαιτικού συστήματος στο οποίο βρίσκονται τα δεδομένα μας.

Στην συνέχεια επιλέγουμε “Add” και προσδιορίζουμε την τοποθεσία όπου έχουμε αποθηκεύσει τα δεδομένα που θα χρησιμοποιήσουμε. Ακόμα προσδιορίζουμε την συμβολοσειρά που πρέπει να χρησιμοποιηθεί (UTF-8).

Επιστρέφουμε στο παράθυρο της εφαρμογής SPIT και επιλέγουμε ΟΚ.

Το θεματικό επίπεδο των δήμων της Θεσσαλονίκης έχει πλέον εισαχθεί στην βάση δεδομένων.

Απεικόνιση δεδομένων στο QuantumGIS

Για να απεικονίσουμε τα δεδομένα που έχουμε εισάγει στην βάση δεδομένων στο λογισμικό QuantumGIS κάνουμε τα εξής:

Ξεκινάμε το QuantumGIS όπως κάναμε στο προηγούμενο βήμα.

Στην συνέχεια από το μενού του προγράμματος επιλέγουμε “Layer”, “Add PostGIS Layer” και στο παράθυρο που εμφανίζεται επιλέγουμε “New”. Εκεί συμπληρώνουμε τα στοιχεία που χρειάζονται για να συνδεθεί το QuantumGIS με την PostgreSQL/PostGIS, όπως ακριβώς κάναμε και στο προηγούμενο βήμα.

Στην συνέχεια επιλέγουμε “ΟΚ”.

Στο παράθυρο εισαγωγής δεδομένων προσδιορίζουμε το όνομα της βάσης δεδομένων όπου εργαζόμαστε και στην συνέχεια επιλέγουμε “Connect”. Τώρα πρέπει να εμφανιστούν οι πίνακες που περιέχονται στην χωρική βάση δεδομένων. Επιλέγουμε τον/τους πίνακες που θέλουμε να απεικονίσουμε και πατάμε “Add”.

Τώρα οι πίνακες της χωρικής βάσης δεδομένων που επιλέξαμε πρέπει να εμφανιστούν σαν θεματικά επίπεδα στο QuantumGIS.

Εξαγωγή δεδομένων της βάσης δεδομένων σε μορφή *.shp

Η PostgreSQL μας παρέχει την δυνατότητα να εξάγουμε δεδομένα πινάκων περιέχονται σε αυτή σε μορφή αρχείου *.shp. Αυτό γίνεται με την χρήση του εργαλείου γραμμής εντολών pgsql2shp. Ας δούμε ένα παράδειγμα: Έστω ότι θέλουμε να εξάγουμε τα δεδομένα οδικού δικτύου της Θεσσαλονίκης σε αρχείο *.shp και η τοποθεσία που θέλουμε να το αποθηκεύσουμε είναι ο φάκελος c:\export . Ανοίγουμε ένα παράθυρο γραμμής εντολών και το κατευθύνουμε σε αυτό τον φάκελο πληκτρολογώντας c:\export .

Στην συνέχεια πληκτρολογούμε την εντολή: pgsql2shp -P5678 -u postgres thessaloniki health_services.hospitals

επιλέγουμε “enter” και η εξαγωγή ολοκληρώνεται στην επιλεγμένη τοποθεσία

Η εντολή συντάσσεται ως εξής:

pgsql2shp -P5678 -u postgres thessaloniki health_services.hospitals

pgsql2shp: καλείται το αρχείο pgsql2shp.exe -P5678: μετά το -Ρ προσδιορίζεται ο κωδικός χρήστη -u postgres: μετά το -u προσδιορίζεται το όνομα χρήστη thessaloniki: προσδιορίζεται το όνομα της βάσης δεδομένων health_services.hospitals: προσδιορίζεται το σχήμα και το όνομα του πίνακα από τον οποίο θα αντληθούν τα στοιχεία.

5.2 Λειτουργίες ανάκτησης δεδομένων

Η χωρική βάση δεδομένων PostgreSQL/PostGIS επιτρέπει την ανάκτηση του συνόλου ή μέρους των δεδομένων που βρίσκονται σε αυτή με την υποβολή ερωτημάτων. Η πιο απλή μορφή ερωτήματος είναι αυτή που μας επιστρέφει όλα τα δεδομένα που βρίσκονται σε έναν πίνακα. Έστω για παράδειγμα ότι θέλουμε να μας επιστραφούν όλα τα δεδομένα που βρίσκονται σε κάποιον πίνακα, πχ στον πίνακα που περιέχει τα νοσοκομεία. Το ερώτημα που επιστρέφει το σύνολο του πίνακα είναι το εξής:

SELECT * FROM health_services.hospitals;

εκτελώντας αυτό το ερώτημα μας επιστρέφεται (στο κάτω μέρος του παραθύρου ερωτημάτων) ολόκληρος ο πίνακας που περιέχει τα νοσοκομεία.

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

5.2.1 Μη χωρικά ερωτήματα SQL στο περιβάλλον της βάσης δεδομένων

Τα μη χωρικά ερωτήματα αφορούν σε μη χωρικά χαρακτηριστικά των δεδομένων, δηλαδή σε χαρακτηριστικά που βρίσκονται αποθηκευμένα σε όλες τις στήλες εκτός από αυτήν της γεωμετρίας. Για παράδειγμα: Ποιες εγγραφές από τον πίνακα δήμων έχουν όνομα “ΘΕΣΣΑΛΟΝΙΚΗ;”

SELECT * FROM health_services.municipal WHERE “NAME” = ‘ΘΕΣΣΑΛΟΝΙΚΗ’;

Πράγματι, στο κάτω μέρος του παραθύρου ερωτημάτων μας επιστρέφεται η εγγραφή που αφορά στον δήμο Θεσσαλονίκης Αντίστοιχα μπορούμε να ρωτήσουμε την βάση δεδομένων ποιοι είναι αυτοί οι δήμοι οι οποίοι έχουν πληθυσμό μικρότερο από 40.000 κατοίκους

SELECT * FROM health_services.municipal WHERE “POP” < 40000;

ή ποιοι είναι αυτοί οι δήμοι που έχουν πληθυσμό μικρότερο από 40,000 και μεγαλύτερο από 10,000 κατοίκους

SELECT * FROM health_services.municipal WHERE “POP” < 40000 AND “POP” > 10000;

και ακόμα να ζητήσουμε από την βάση δεδομένων να μας επιστρέψει τα αποτελέσματα κατά αύξουσα αλφαβητική σειρά

SELECT * FROM health_services.municipal WHERE “POP” < 40000 AND “POP” > 10000 ORDER BY “NAME” ASC;

ή κατά φθίνουσα πληθυσμιακή σειρά

SELECT * FROM health_services.municipal WHERE “POP” < 40000 AND “POP” > 10000 ORDER BY “POP” DESC;

Σημείωση: Τα ερωτήματα που προηγήθηκαν ζητούν την επιστροφή όλων των διαθέσιμων γνωρισμάτων για τις εγγραφές που επιλέγονται. Αυτό γίνεται με την έκφραση “SELECT *”. Αν αντί αυτού επιθυμούσαμε την επιστροφή κάποιων συγκεκριμένων πεδίων τότε την εντολή SELECT θα ακολουθούσαν τα ονόματα των πεδίων που θέλουμε να επιστραφούν.

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



5.2.2 Μη χωρικά ερωτήματα στο περιβάλλον του QuantumGIS

Το λογισμικό QuantumGIS μας προσφέρει την δυνατότητα να υποβάλουμε ερωτήματα SQL στα δεδομένα κατά την εισαγωγή τους. Επιλέγοντας “Layer”, “Add PostGIS Layer” ενεργοποιείται το παράθυρο εισαγωγής δεδομένων. Επιλέγουμε την βάση δεδομένων όπου εργαζόμαστε και στην συνέχεια “Connect”. Έτσι εμφανίζονται τα διαθέσιμα θεματικά επίπεδα. Κάνουμε διπλό κλικ στο θεματικό επίπεδο όπου επιθυμούμε να εφαρμοστεί το ερώτημα. Με αυτό τον τρόπο ενεργοποιείται το παράθυρο δημιουργίας ερωτημάτων SQL. Εκεί δημιουργούμε το σχετικό ερώτημα SQL και κατά την διάρκεια εισαγωγής των δεδομένων εισάγονται μόνο οι εγγραφές που το ικανοποιούν.

Έστω, για παράδειγμα, ότι θέλουμε να απεικονίσουμε τους δήμους Θεσσαλονίκης που έχουν πληθυσμό μικρότερο από 40,000 κατοίκους και μεγαλύτερο από 10,000 κατοίκους. Στο παράθυρο εισαγωγής δεδομένων επιλέγουμε την βάση δεδομένων thessaloniki και επιλέγουμε “Connect”. Εμφανίζονται τα διαθέσιμα θεματικά επίπεδα. Εκεί κάνουμε διπλό κλικ στο θεματικό “municipal” και έτσι οδηγούμαστε στο παράθυρο δημιουργίας ερωτημάτων SQL. Συντάσσουμε το ακόλουθο ερώτημα: “POP” < 40000 AND “POP” > 10000

Επιλέγουμε ΟΚ και εισάγουμε το θεματικό επίπεδο “municipal”. Πράγματι έχουν εισαχθεί οι δήμοι που ο πληθυσμός τους κυμαίνεται από 10000 έως 40000 άτομα.

5.2.3 Χωρικά ερωτήματα

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

Οι τελεστές WITHIN και CONTAINS

Οι τελεστές WITHIN και CONTAINS μας επιστρέφουν πληροφορίες για στοιχεία που περικλείονται σε ένα γνωστό πολύγωνο ή πολύγωνα που περικλείουν γνωστά στοιχεία.

Ο τελεστής WITHIN χρησιμοποιείται ως εξής:

SELECT X FROM A,B WHERE WITHIN (Geom.A, GeomB)

Ο τελεστής CONTAINS χρησιμοποιείται ως εξής:

SELECT X FROM A,B WHERE CONTAINS (Geom.Β, GeomΑ)

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

Για παράδειγμα ο τελεστής WITHIN μπορεί να μας επιστρέψει πληροφορίες για το που (μέσα σε ποιο πολυγωνικό στοιχείο) βρίσκεται ένα σημείο με γνωστές συντεταγμένες: Σε ποιόν δήμο (όνομα) βρίσκεται το σημείο με συντεταγμένες ΧΥ (19254196 4927496);

SELECT “NAME” FROM health_services.municipal WHERE WITHIN( GeomFromText(’POINT(19254196 4927496)’,4121), municipal.the_geom);

Ποια νοσοκομεία βρίσκονται μέσα στο πολύγωνο του δήμου Θεσσαλονίκης;

SELECT * FROM health_services.hospitals WHERE WITHIN(the_geom, (SELECT the_geom FROM health_services.municipal WHERE “NAME” =’ΘΕΣΣΑΛΟΝΙΚΗ’));

Ποιοι δρόμοι βρίσκονται εξολοκλήρου μέσα στον δήμο Θεσσαλονίκης; SELECT * FROM health_services.road_net WHERE WITHIN(the_geom, (SELECT the_geom FROM health_services.municipal WHERE “NAME” = ‘ΘΕΣΣΑΛΟΝΙΚΗ’));

Σε ποιο δήμο βρίσκεται κάθε ένα από τα νοσοκομεία; SELECT hospitals.name, municipal.”NAME” FROM health_services.hospitals, health_services.municipal WHERE WITHIN (hospitals.the_geom, municipal.the_geom);

Σημείωση: Αν θελήσουμε να οπτικοποιήσουμε τα αποτελέσματα ενός χωρικού ερωτήματος, αρκεί να δημιουργήσουμε μία όψη που να περιέχει το ερώτημα και στην συνέχεια να εισάγουμε αυτή την όψη στο QuantumGIS ακριβώς σαν να επρόκειτο για κάποιο πίνακα.

Έστω ότι θέλουμε να οπτικοποιήσουμε το ερώτημα που μας επιστρέφει όλα τα νοσοκομεία που βρίσκονται μέσα στον δήμο Θεσσαλονίκης. Μπορούμε να δημιουργήσουμε μία όψη που να περιέχει το ερώτημα με την ακόλουθη εντολή:

CREATE VIEW health_services.hospitals_thessaloniki AS (SELECT * FROM health_services.hospitals WHERE WITHIN(the_geom, (SELECT the_geom FROM health_services.municipal WHERE “NAME” =’ΘΕΣΣΑΛΟΝΙΚΗ’)));

Αν στην συνέχεια συνδεθούμε με την βάση δεδομένων τότε μπορούμε να δούμε την όψη που δημιουργήσαμε παραπάνω. Αν την οπτικοποιήσουμε τότε γίνεται σαφές ότι πράγματι έχουν επιλεγεί τα νοσοκομεία που βρίσκονται στον δήμο Θεσσαλονίκης.

Παραδείγματα με τον τελεστή CONTAINS: Ποιος δήμος περιλαμβάνει το Νοσοκομείο ΑΧΕΠΑ; SELECT “NAME” FROM health_services.municipal WHERE CONTAINS(the_geom, (SELECT the_geom FROM health_services.hospitals WHERE hospitals.name=’ΓΕΝΙΚΟ ΝΟΣΟΚΟΜΕΙΟ ΑΧΕΠΑ’));

Σε ποιο δήμο βρίσκεται κάθε νοσοκομείο ; SELECT hospitals.name, municipal.”NAME” FROM health_services.hospitals, health_services.municipal WHERE CONTAINS(municipal.the_geom, hospitals.the_geom);

Ο τελεστής DISTANCE

Ο τελεστής DISTANCE προσδιορίζει την απόσταση (σε κάποιες περιπτώσεις την ελάχιστη απόσταση) ανάμεσα στην γεωμετρία στοιχείων:

Ποια νοσοκομεία απέχουν λιγότερο από 2000 μέτρα από το σημείο με συντεταγμένες ΧΥ (19254196 4927496) και ποια είναι η απόσταση αυτών των νοσοκομείων από το σημείο; SELECT name, DISTANCE(the_geom, GeomFromText(’POINT(19254196 4927496)’,4121)) AS dist FROM health_services.hospitals WHERE DISTANCE(the_geom, GeomFromText(’POINT(19254196 4927496)’,4121))⇐2000;

Ποιος δρόμος απέχει λιγότερο από 50 μέτρα από το σημείο με συντεταγμένες ΧΥ (19254196 4927496) και ποια είναι η απόσταση του από το σημείο; SELECT name, DISTANCE(the_geom, GeomFromText(’POINT(19254196 4927496)’,4121)) AS dist FROM health_services.road_net WHERE DISTANCE(the_geom, GeomFromText(’POINT(19254196 4927496)’,4121))⇐50;

Ποιοι δήμοι βρίσκονται σε απόσταση 3000 από το σημείο με συντεταγμένες ΧΥ (19254196 4927496) και ποια είναι η ελάχιστη απόστασή τους από το σημείο; SELECT “NAME”, DISTANCE(the_geom, GeomFromText(’POINT(19254196 4927496)’,4121)) AS dist FROM health_services.municipal WHERE DISTANCE(the_geom, GeomFromText(’POINT(19254196 4927496)’,4121))⇐3000;

Υπάρχουν νοσοκομεία που να απέχουν μεταξύ τους λιγότερο από ένα χιλιόμετρο; Αν ναι ποια είναι αυτά και ποια η απόσταση μεταξύ τους; SELECT H1.name AS Hospital1, H2.name AS Hospital2, DISTANCE(H1.the_geom, H2.the_geom) AS distance FROM health_services.hospitals H1, health_services.hospitals H2 WHERE DISTANCE(H1.the_geom, H2.the_geom)⇐1000 AND H1.id < H2.id;

Ο τελεστής INTERSECTS

Ο τελεστής INTERSECTS μας επιστρέφει πληροφορία σχετικά με το πότε δύο γεωμετρίες πληρούν τα κριτήρια τομής σύμφωνα με την προδιαγραφή του Open Geospatial Consortium. Για παράδειγμα: Ποιοι δρόμοι τέμνονται με το πολύγωνο με συντεταγμένες (19260523.58872549 4931624.24705882, 19252724.53872549 4925125.03872549, 19253794.99656863 4913350.00245098, 19268934.32892157 4931471.32450980 19260523.58872549 4931624.24705882);

SELECT road_net.name FROM health_services.road_net WHERE INTERSECTS (the_geom, GeomFromText(’POLYGON 2) ‘,4121) );

Ποιοι δήμοι τέμνονται με το πολύγωνο με συντεταγμένες (19260523.58872549 4931624.24705882, 19252724.53872549 4925125.03872549, 19253794.99656863 4913350.00245098, 19268934.32892157 4931471.32450980 19260523.58872549 4931624.24705882);

SELECT municipal.”NAME” FROM health_services.municipal WHERE INTERSECTS (the_geom, GeomFromText(’POLYGON 3) ‘,4121) );

Ποιους δήμους τέμνει κάθε τμήμα οδικού δικτύου; SELECT road_net.name, municipal.”NAME” FROM health_services.road_net, health_services.municipal WHERE INTERSECTS (municipal.the_geom, road_net.the_geom)

Πόσους δήμους τέμνει κάθε τμήμα του οδικού δικτύου; SELECT road_net.name, count (*) FROM health_services.road_net, health_services.municipal WHERE INTERSECTS (municipal.the_geom, road_net.the_geom) GROUP BY road_net.name

Ο τελεστής TOUCHES

Ο τελεστής TOUCHES ανιχνεύει αν εφάπτονται δύο γεωγραφικά στοιχεία. Παράδειγμα:

Ποια είναι τα ζεύγη γειτονικών δήμων στην Θεσσαλονίκη; SELECT M1.”NAME”, M2.”NAME” FROM health_services.municipal M1, health_services.municipal M2 WHERE TOUCHES(M1.the_geom, M2.the_geom) AND M1.”ID” < M2.”ID”;

Εξειδικεύοντας, με ποιους δήμους γειτονεύει ο δήμος Θεσσαλονίκης; SELECT M1.”NAME”, M2.”NAME” FROM health_services.municipal M1, health_services.municipal M2 WHERE TOUCHES(M1.the_geom, M2.the_geom) AND M1.”ID” < M2.”ID” AND M1.”NAME” = ‘ΘΕΣΣΑΛΟΝΙΚΗ’;

Ποιοι δρόμοι τέμνονται με άλλα τμήματα του οδικού δικτύου και με ποια; SELECT R1.name, R2.name FROM health_services.road_net R1, health_services.road_net R2 WHERE TOUCHES(R1.the_geom, R2.the_geom) AND R1.id < R2.id;

Ο τελεστής AREA

Αυτός ο τελεστής προσδιορίζει το εμβαδό πολυγωνικών στοιχείων

λ.χ. Ποια είναι η έκταση των δήμων του πολεοδομικού συγκροτήματος Θεσσαλονίκης SELECT “NAME”, area(the_geom) AS municipal_area FROM health_services.municipal ORDER BY municipal_area DESC;

ή ποιος είναι ο μεγαλύτερος από τους δήμους του πολεοδομικού συγκροτήματος Θεσσαλονίκης. SELECT * FROM (SELECT “NAME”, area(the_geom) AS municipal_area FROM health_services.municipal ORDER BY municipal_area desc)AS FOO LIMIT 1;

Ο τελεστής ENVELOPE

Αυτός ο τελεστής επιστρέφει το ελάχιστο περικλείον πολύγωνο για τα σχετικά γεωγραφικά στοιχεία.

SELECT “NAME”, AsText(envelope(the_geom)) AS bounding_box FROM health_services.municipal;

Σημείωση: Στην παρακάτω εικόνα έχουν οπτικοποιήθει με κόκκινο χρώμα τα ελάχιστα περικλείοντα πολύγωνα για τους δήμους Θεσσαλονίκης, Αγίου Παύλου, Αμπελοκήπων, Ελευθερίου Κορδελιού και Εύοσμου.

Ο τελεστής LENGTH

Ο τελεστής LENGTH επιστρέφει το μήκος των γραμμικών τμημάτων. Για παράδειγμα, ποιο είναι το μήκος των οδικών αξόνων που περιλαμβάνονται στον πίνακα road_net?

SELECT name, length(the_geom) AS segment_length FROM health_services.road_net ORDER BY segment_length DESC;

Στην περίπτωση που κάθε οδός αποτελείται από πολλαπλά τμήματα και θέλουμε να υπολογίσουμε το συνολικό μήκος της οδού μπορούμε να χρησιμοποιήσουμε κάτι σαν το παρακάτω:

SELECT name, sum(length(the_geom)) AS segment_length FROM health_services.road_net GROUP by name ORDER BY segment_length DESC;

Ο τελεστής NPOINTS

Με την βοήθεια αυτού του τελεστή υπολογίζουμε τον αριθμό κορυφών που περιέχονται σε ένα στοιχείο.

Για παράδειγμα, πόσοι κόμβοι αποτελούν την γραμμή κάθε οδικού τμήματος από τον πίνακα road_net; SELECT name, npoints(the_geom) AS vertexes FROM health_services.road_net ORDER BY vertexes DESC;

5.3 Λειτουργίες επέμβασης στα δεδομένα σε γραφικό περιβάλλον / περιβάλλον QuantumGIS

Προκειμένου να αρχίσουμε να επεμβαίνουμε σε ένα θεματικό επίπεδο πρέπει να κάνουμε δύο πράγματα: Να επιλέξουμε το θεματικό επίπεδο στο πάνελ των θεματικών επιπέδων/υπόμνημα (legend) στα αριστερά της οθόνης. Να επιλέξουμε από το μενού του προγράμματος “Layer”, “Toggle Editing”.

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

Έστω ότι θέλουμε να τροποποιήσουμε το θεματικό επίπεδο του οδικού δικτύου.



Εισαγωγή στοιχείων


Προκειμένου να εισάγουμε κάποιο στοιχείο επιλέγουμε από το μενού του προγράμματος “Edit”, “Capture Line” (Point/Polygon αν πρόκειται για σημειακό ή πολυγωνικό επίπεδο). 

Πιέζουμε αριστερό κλικ προκειμένου να ξεκινήσουμε να ψηφιοποιούμε και δεξί κλικ όταν θέλουμε να προστεθεί ο τελευταίος κόμβος.

Στην συνέχεια καλείται η φόρμα εισαγωγής δεδομένων στον πίνακα

Συμπληρώνουμε ότι χρειάζεται και επιλέγουμε “ΟΚ”. Η εισαγωγή του νέου στοιχείου έχει ολοκληρωθεί.

Διαγραφή στοιχείων

Προκειμένου να διαγράψουμε ένα στοιχείο το επιλέγουμε με το εργαλείο επιλογής

και στην συνέχεια επιλέγουμε από το μενού του προγράμματος “Edit” και “Delete Selected”.

Μετακίνηση στοιχείου

Επιλέγουμε το αντικείμενο που θέλουμε να μετακινήσουμε με το εργαλείο επιλογής. Από το μενού του προγράμματος επιλέγουμε “Edit” και “Move Feature”. “Πιάνουμε” το στοιχείο με τον κέρσορα και το “σέρνουμε” στην επιθυμητή θέση.

Διαίρεση στοιχείου

Επιλέγουμε το αντικείμενο που θέλουμε να διαιρέσουμε με το εργαλείο επιλογής. Από το μενού του προγράμματος επιλέγουμε “Edit” και “Split Features”. Με τον κέρσορα ξεκινάμε μια γραμμή με αριστερό κλικ και την τελειώνουμε με δεξί κλικ Εκεί που η γραμμή θα τέμνει το στοιχείο θα είναι και το σημείο διαίρεσης.

Προσθήκη κόμβου

Επιλέγουμε το αντικείμενο που θέλουμε να προσθέσουμε τον κόμβο με το εργαλείο επιλογής. Από το μενού του προγράμματος επιλέγουμε “Edit” και “Add Vertex”. Με τον κέρσορα κάνουμε κλικ στο σημείο που θέλουμε να προστεθεί ο κόμβος.

Διαγραφή κόμβου

Επιλέγουμε το αντικείμενο στο οποίο ανήκει ο κόμβος που επιθυμούμε να διαγραφεί. Από το μενού του προγράμματος επιλέγουμε “Edit” και “Delete Vertex”. Με τον κέρσορα επιλέγουμε τον κόμβο που επιθυμούμε να διαγραφεί.

Επέμβαση στον πίνακα δεδομένων. Κάνουμε δεξί κλικ στο θεματικό πεδίο, στο πάνελ/υπόμνημα. Επιλέγουμε “Open attribute table”. Στον πίνακα δεδομένων πατάμε πάνω στην εγγραφή που θέλουμε να τροποποιήσουμε και στην συνέχεια κάνουμε διπλό κλικ στο κελί που θέλουμε να επέμβουμε. Τροποποιούμε το περιεχόμενο του κελιού και πατάμε enter.

Όταν ολοκληρώσουμε τις επεμβάσεις στο θεματικό πεδίο επιλέγουμε ξανά από το μενού του προγράμματος “Layer” και “Toggle Editing”. Έτσι ολοκληρώνουμε την διαδικασία επεμβάσεων στο θεματικό πεδίο. Το πρόγραμμα μας ρωτάει αν επιθυμούμε να σώσουμε τις αλλαγές που έγιναν.

Αν επιλέξουμε “Save” τότε οι αλλαγές αποθηκεύονται στην βάση δεδομένων. Αν επιλέξουμε “Discard” τότε τα γεωμετρικά και μη χαρακτηριστικά του θεματικού πεδίου επανέρχονται στην κατάσταση που βρίσκονταν πριν αρχίσουμε την διαδικασία επεμβάσεων.

1) 19252337.28 4924473.456, 19252400.28 4929709.089, 19248621.84 4931397.553, 19247754.52 4930485.015, 19247176.54 4931934.153, 19247087.17 4933316.181, 19249196.15 4933179.604, 19250922.02 4932784.313, 19251061.93 4933355.616, 19251240.67 4932719.875, 19251378.39 4932853.56, 19253251.49 4932012.049, 19254181.08 4932068.789, 19253488.1 4930723.478, 19254917.28 4930153.292, 19254945.12 4928520.803, 19255963.35 4928880.35, 19257276.79 4927892.109, 19254963.434 4923695.129, 19252337.28 4924473.456
2) , 3) 19260523.58872549 4931624.24705882, 19252724.53872549 4925125.03872549, 19253794.99656863 4913350.00245098, 19268934.32892157 4931471.32450980,19260523.58872549 4931624.24705882
 
ellak/5._ασικές_λειτουργίες.txt (135 views) · Τελευταία τροποποίηση: 2014/04/03 17:26
 
Recent changes RSS feed Creative Commons License Donate Valid XHTML 1.0 Valid CSS Driven by DokuWiki