Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

9. Γεωεπεξεργασία διανυσματικών δεδομένων

ΤΜΧΠΠΑ-ΠΘ

Ειδική ενότητα για εκτέλεση στο Google Colab

# έλεγχος αν το notebook τρέχει στο google colab
try:
  import google.colab
  IN_COLAB = True
except:
  IN_COLAB = False
# αν το notebook τρέχει στο colab, mount το Google Drive και αλλαγή στο directory που έχει γίνει clone το github repository.
# εγκατάσταση απαραίτητων βιβλιοθηκών
if IN_COLAB:
    from google.colab import drive
    drive.mount('/content/drive')
    %cd /content/drive/MyDrive/Colab\ Notebooks/programming/notebooks
    !pip install rasterio geopandas folium matplotlib mapclassify

Ο χώρος και οι γεωμετρικές δομές του μπορούν να αναπαρασταθούν μέσω διανυσματικών δεδομένων (Vector). Οι τρείς βασικές δομές δεδομένων είναι:

  • Τα σημεία

  • Οι γραμμές

  • Τα πολύγωνα

alt text

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

alt text

Στα Σ.Γ.Π. ο πιο συνηθισμένος τύπος αρχείων αποθήκευσης αυτών των δεδομένων είναι το shapefile. Πλέον έχουν αναπτυχθεί και άλλοι τύποι όπως geojson, geopackage και χωρικές βάσεις δεδομένων (geodatabases) όπως η Postgresql/Postgis.

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

alt text

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

alt text

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

Python βιβλιοθήκες για διανυσματικά δεδομένα

Για την ανάγνωση, εγγραφή, επεξεργασία διανυσματικών δεδομένων στην Python έχουν καθιερωθεί μια σειρά βιβλιοθηκών. Η αρχαιότερη και βασική βιβλιοθήκη είναι η GDAL/OGR. Επειδή η βιβλιοθήκη δεν είναι ιδιαίτερα συμβατή σε σχέση με τον τρόπο συγγραφής της Python και είναι επιρρεπής σε σφάλματα έχουν αναπτυχθεί πιο σύγχρονες βιβλιοθήκες όπως η βιβλιοθήκη Fiona που είναι ιδιαίτερα χρήσιμη για την ανάγνωση/εγγραφή διανυσματικών δεδομένων και η βιβλιοθήκη Shapely η οποία χρησιμοποιείται για επεξεργασία και ανάλυση δεδομένων.

Η βιβλιοθήκη Shapely

shapely from WKT

Μπορούμε να δημιουργήσουμε αντικείμενα shapely που αναπαριστούν σημεία ή γραμμές ή πολύγωνα μέσω WKT. Η γλώσσα WKT είναι μια ειδική διάλεκτος για την περιγραφή διανυσματικών αντικειμένων. Εισάγουμε τις απαραίτητες υπο-βιβλιοθήκες (geometry και wkt) από την βιβλιοθήκη shapely.

import shapely.geometry
import shapely.wkt

Πολύγωνα

Καλούμε την μέθοδο shapely.wkt.loads() για να δημιουργήσουμε shapely objects από wkt

pol1 = shapely.wkt.loads("POLYGON ((0 0, 0 -1, 7.5 -1, 7.5 0,0 0))")
pol1
Loading...

Η εκτύπωση του shapely αντικειμένου επιστρέφει μία περιγραφή σε μορφή WKT.

print(pol1)
POLYGON ((0 0, 0 -1, 7.5 -1, 7.5 0, 0 0))

Εκτύπωση του τύπου του αντικειμένου pol1

type(pol1)
shapely.geometry.polygon.Polygon
pol2 = shapely.wkt.loads("POLYGON ((0 1, 1 0, 2 0.5, 3 0, 4 0, 5 0.5, 6 -0.5, 7 -0.5, 7 1, 0 1))")
print(pol2)
POLYGON ((0 1, 1 0, 2 0.5, 3 0, 4 0, 5 0.5, 6 -0.5, 7 -0.5, 7 1, 0 1))
pol2
Loading...

Δημιουργία MultiPolygon shapely object από αντίστοιχη συλλογή πολυγώνων MULTIPOLYGON

pol3 = shapely.wkt.loads("""
MULTIPOLYGON
(((40 40, 20 45, 45 30, 40 40)),
((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))
""")
type(pol3)
shapely.geometry.multipolygon.MultiPolygon
pol3
Loading...
type(pol3)
shapely.geometry.multipolygon.MultiPolygon

Σημεία

pnt1 = shapely.wkt.loads("""
POINT (30 10)
""")
pnt1
Loading...

Συλλογή σημείων

pnt2 = shapely.wkt.loads("""
MULTIPOINT(0 0,1 1)
""")
pnt2
Loading...

Γραμμές

line1 =shapely.wkt.loads("""
LINESTRING(1.5 2.45,3.21 4)
""")

line1
Loading...

Συλλογή γραμμών

line2 =shapely.wkt.loads("""
MULTILINESTRING((0 0,-1 -2,-3 -4, -3 -8),(2 3,3 4,6 7))
""")

line2

Loading...

Shapely μέσω συναρτήσεων

from shapely.geometry import Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon

Κάθε συνάρτηση λαμβάνει διαφορετικά ορίσματα ανάλογα με την συνάρτηση.

Στην συνέχεια ακολουθεί η δημιουργία ενός αντικειμένου shapely γεωμετρίας σημείου.

pnt1 = shapely.geometry.Point((2, 0.5))
pnt1
Loading...

Για την δημιουργία συλλογής σημείων multipoint δίνουμε σαν όρισμα στην συνάρτηση shapely.geometry.MultiPoint μία λίστα από πλειάδες (tuples). Η κάθε πλειάδα (x,y)αντιστοιχεί στις συντεταγμένες ενός σημείου.

coords = [(2, 0.5), (1, 1), (-1, 0), (1, 0)]
pnt2 = shapely.geometry.MultiPoint(coords)
pnt2
Loading...

Για την δημιουργία γραμμών χρησιμοποιείται πάλι μία λίστα από tuples που περιγράφουν τις κορυφές της γραμμής. Στο παρακάτω παράδειγμα χρησιμοποιούμαι την προηγούμενη πλειάδα αλλά πλέον χρησιμοποιούμε την μέθοδο shapely.geometry.LineString για την δημιουργία γραμμής και όχι την μέθοδο shapely.geometry.MultiPoint που δημιουργεί συλλογές σημείων.

line1 = shapely.geometry.LineString(coords)
line1
Loading...

Κατασκεύη γραμμής από Point Objects:

p1 = shapely.wkt.loads("POINT (0 0)")
p2 = shapely.wkt.loads("POINT (1 1)")
p3 = shapely.wkt.loads("POINT (2 -1)")
p4 = shapely.wkt.loads("POINT (2.5 2)")
p5 = shapely.wkt.loads("POINT (1 -1)")

shapely.geometry.LineString([p1, p2, p3, p4, p5])
Loading...

Αντίστοιχα μπορούμε να δημιουργήσουμε συλλογές γραμμών.

Δημιουργούμε ξεχωριστά αντικείμενα γραμμών shapely και στην συνέχεια καλούμε την συνάρτηση shapely.geometry.MultiLineString όπου ορίζουμε σαν όρισμα μια λίστα με τις μεμονωμένες γραμμές.

l1 = shapely.geometry.LineString([(2, 0.5), (1, 1), (-1, 0), (1, -1)])
l2 = shapely.geometry.LineString([(-2, 1), (2, -0.5), (3, 1)])
line2 = shapely.geometry.MultiLineString([l1, l2])
line2
Loading...

Αντίστοιχα δημιουργούμε πολυγωνικά αντικείμενα μέσω μια λίστας με πλειάδες σημείων που χρησιμοποιείται σαν όρισμα στην συνάρτηση shapely.geometry.Polygon

coords = [(0, 0), (0, -1), (7.5, -1), [7.5, 0], (0, 0)]
shapely.geometry.Polygon(coords)
Loading...

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

coords_exterior = [(0, 0), (0, -1), (7.5, -1), (7.5, 0), (0, 0)]
coords_interiors = [[(0.4, -0.3), (5, -0.3), (5, -0.7), (0.4, -0.7), (0.4, -0.7)]]
shapely.geometry.Polygon(coords_exterior, coords_interiors)
Loading...

Με την συνάρτηση shapely.geometry.MultiPolygon δημιουργούμε αντίστοιχα συλλογές πολυγώνων από μεμονωμένα αντικείμενα shapely.geometry.polygon.Polygon

pol2
Loading...
multipolygon1 = shapely.geometry.MultiPolygon([pol1, pol2])
multipolygon1
Loading...
print(multipolygon1)
MULTIPOLYGON (((0 0, 0 -1, 7.5 -1, 7.5 0, 0 0)), ((0 1, 1 0, 2 0.5, 3 0, 4 0, 5 0.5, 6 -0.5, 7 -0.5, 7 1, 0 1)))

Σύμφωνα με τις προδιαγραφές simple features το παραπάνω object δεν είναι έγκυρο γιατί ένα πολύγωνο τέμνει ένα άλλο σε άπειρο αριθμό σημείων. Μπορούμε να ελέγξουμε την εγκυρότητα ενός αντικειμένου με την κλήση τις ιδιότητας is_valid. Επίσης κατά την οπτικοποίηση στο προηγούμενο βήμα του αντικειμένου multipolygon1 αυτό εμφανίζεται με κόκκινο (αντί για πράσινο). Ένδειξη ότι δεν ειναι valid.

multipolygon1.is_valid
False

Ταυτόχρονα μπορούμε να φτιάξουμε σύνθετες συλλογές από επιμέρους αντικείμενα shapely.

geo_collection = shapely.geometry.GeometryCollection([multipolygon1,line2,pnt1])
geo_collection
Loading...

Shapely μέσω shape

Μπορούμε να δημιουργήσουμε αντικείμενα shapely μέσω της συνάρτησης shapely.geometry.shape η οποία δέχεται σαν όρισμα ένα λεξικό μορφής GEOJSON το οποίο πρέπει να έχει τις εξής δύο ιδιότητες.

  • Την ιδιότητα "type" που περιγράφει τον τύπο γεωμετρίας

  • Την ιδιότητα "coordinates" που περιγράφει τις γεωμετρίες και τις συντεταγμένες τους σαν λίστες ή πλειάδες.

d = {"type": "Point", "coordinates": (0, 1)}
shapely.geometry.shape(d)
Loading...

Δημιουργία αντικειμένου MultiPolygon μέσω GEOJSON λεξικού:

d = {
  "type": "MultiPolygon",
  "coordinates": [
    [
      [[40, 40], [20, 45], [45, 30], [40, 40]]
    ],
    [
      [[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], 
      [20, 35]], 
      [[30, 20], [20, 15], [20, 25], [30, 20]]
    ]
  ]
}
pol3 = shapely.geometry.shape(d)
pol3
Loading...

Γεωμετρικός τύπος δεδομένων

H ιδιότητα .geom_type ενός αντικειμένου shapely περιγράφει τον γεωμετρικό τύπο της:

pol1.geom_type
'Polygon'
line1.geom_type
'LineString'
geo_collection.geom_type
'GeometryCollection'

Συντεταγμένες

Για να ανακτήσουμε τις συντεταγμένες ενός shapely αντικειμένου καλούμε με διαφορετικό τρόπο τις ανάλογες συναρτήσεις ανάλογα την πολυπλοκότητα του κάθε τύπου.

Για ένα Point object καλούμε άμεσα την ιδιότητα coords η οποία επιστρέφει ένα shapely.coords.CoordinateSequence object.

pnt1.coords
<shapely.coords.CoordinateSequence at 0x7f3c9437b090>

Μπορούμε να λάβουμε ως λίστα τις πλειάδες συντεταγμένων που το απαρτίζουν

list(pnt1.coords)
[(2.0, 0.5)]

Αντίστοιχα για γραμμή

list(line1.coords)
[(2.0, 0.5), (1.0, 1.0), (-1.0, 0.0), (1.0, 0.0)]

Για να ελέγξουμε σε ένα αντικείμενο συλλογών γεωμετρίας (MultiPoint, MultiPolygon κτλ) πόσες επιμέρους γεωμετρίες περιλαμβάνει:

len(line2.geoms)
2
line2
Loading...

Για να λάβουμε το πρώτο αντικείμενο γεωμετρίας:

line2.geoms[0]
Loading...
type(line2.geoms[0])
shapely.geometry.linestring.LineString
line2.geoms[0].geom_type
'LineString'

Και λαμβάνουμε τις συντεταγμένες της πρώτης γεωμετρίας:

list(line2.geoms[0].coords)
[(2.0, 0.5), (1.0, 1.0), (-1.0, 0.0), (1.0, -1.0)]

ή της δεύτερης

list(line2.geoms[1].coords)
[(-2.0, 1.0), (2.0, -0.5), (3.0, 1.0)]

Για τα πολύγωνα ακολουθούμε διαφορετική προσέγγιση. Ένα πολύγωνο αποτελεί από το εξωτερικό περίγραμμα (exterior) ή και ένα ή περισσότερα περιγράμματα εσωτερικών οπών (interiors). Κατά συνέπεια έχουμε συντεταγμένες που περιγράφουν το κάθε περίγραμμα.

Το εξωτερικό περίγραμμα του pol1 αντικειμένου:

pol1.exterior
Loading...

Και οι συντεταγμένες του:

list(pol1.exterior.coords)
[(0.0, 0.0), (0.0, -1.0), (7.5, -1.0), (7.5, 0.0), (0.0, 0.0)]
pol1
Loading...

Το pol1 όμως δεν έχει εσωτερικές τρύπες γι αυτό και το παρακάτω επιστρέφει μηδέν.


len(pol1.interiors)
0

Έστω το παρακάτω MultiPolygon object που δημιουργήσαμε σε προηγούμενο στάδιο.

pol3
Loading...

Περιλαμβάνει δύο ξεχωριστά γεωμετρικά αντικείμενα:

len(pol3.geoms)
2

Ας πάρουμε το πρώτο:

pol3.geoms[0]
Loading...

Δεν περιλαμβάνει καμία τρύπα στο εσωτερικό του. Ας πάρουμε τις συντεταγμένες από το περίγραμμά του (exterior)

pol3.geoms[0].exterior.coords
<shapely.coords.CoordinateSequence at 0x7f3c94389fd0>

Και ας τις επιστρέψουμε σαν λίστα πλειάδων από ζεύγη της μορφής (x,y)

list(pol3.geoms[0].exterior.coords)
[(40.0, 40.0), (20.0, 45.0), (45.0, 30.0), (40.0, 40.0)]

Ας δοκιμάσουμε το δεύτερο αντικείμενο γεωμετρίας. Ας το δούμε:

pol3.geoms[1]
Loading...

Λαμβάνουμε τις συντεταγμένες του εξωτερικού περιγράμματος:

list(pol3.geoms[1].exterior.coords)
[(20.0, 35.0), (10.0, 30.0), (10.0, 10.0), (30.0, 5.0), (45.0, 20.0), (20.0, 35.0)]

Ας δούμε πόσες τρύπες έχει στο εσωτερικό του:

len(pol3.geoms[1].interiors)
1

Παίρνουμε το περίγραμμα της τρύπας

pol3.geoms[1].interiors[0]
Loading...

Και τις συντεταγμένες της

list(pol3.geoms[1].interiors[0].coords)
[(30.0, 20.0), (20.0, 15.0), (20.0, 25.0), (30.0, 20.0)]

Ιδιότητες αντικειμένων

Υπολογισμός ορίων (bounds)

geo_collection
Loading...
geo_collection.bounds
(-2.0, -1.0, 7.5, 1.0)
shapely.geometry.box(*geo_collection.bounds)
Loading...
line1
Loading...
line1.bounds
(-1.0, 0.0, 2.0, 1.0)
pnt1
Loading...
pnt1.bounds
(2.0, 0.5, 2.0, 0.5)
list(pnt1.coords)
[(2.0, 0.5)]

Υπολογισμός μήκους γραμμής

line1
Loading...
line1.length
5.354101966249685
line2.geoms[0]
Loading...
line2.geoms[0].length
5.5901699437494745

Υπολογισμός εμβαδού

pol1.area
7.5
pol2.area
6.25

Νέες γεωμετρίες

Κεντροειδές πολυγώνου (centroid)

pol2
Loading...
pol2.centroid
Loading...
shapely.geometry.GeometryCollection([pol2, pol2.centroid])
Loading...

Περιμετρική ζώνη (buffer)

pnt1.buffer(5)
Loading...
shapely.geometry.GeometryCollection([pnt1,pnt1.buffer(5)])
Loading...
pol1.buffer(5)
Loading...
shapely.geometry.GeometryCollection([pol1,pol1.buffer(5)])
Loading...

Convex hull

pol3
Loading...
pol3.convex_hull
Loading...

Σχέσεις μεταξύ αντικειμένων

shapely.geometry.GeometryCollection([pol1,pol3])
Loading...
pol3
Loading...
pol1.intersects(pol3)
False
shapely.geometry.GeometryCollection([pol1,pol2])
Loading...
pol1.intersects(pol2)
True

Γεωμετρικές πράξεις

x = shapely.geometry.Point((0, 0)).buffer(1)
y = shapely.geometry.Point((1, 0)).buffer(1)
shapely.geometry.GeometryCollection([x, y])
Loading...
x.intersection(y)
Loading...
x.difference(y)
Loading...
x.union(y)
Loading...
x.union(y)
Loading...

Υπολογισμός απόστασης ανάμεσα σε δύο αντικείμενα

shapely.geometry.GeometryCollection([pol1, pol3])
Loading...
pol1.distance(pol3)
10.307764064044152
pol3.distance(pol1) 
10.307764064044152

Μετασχηματισμός προβολικού συστήματος:

import pyproj

from shapely.geometry import Point
from shapely.ops import transform

wgs84_pt = Point(39.35858398397631, 22.932070043920394)

wgs84 = pyproj.CRS('EPSG:4326')
greek_grid = pyproj.CRS('EPSG:2100')

project = pyproj.Transformer.from_crs(wgs84, greek_grid, always_xy=True).transform
projected_point = transform(project, wgs84_pt)
print(projected_point)
POINT (2087909.8290560723 2620022.621513317)
list(wgs84_pt.coords)[0]
(39.35858398397631, 22.932070043920394)

Προβολή δεδομένων σε διαδραστικό χάρτη leaflet μέσω της βιβλιοθήκης folium

import folium

coords = list(wgs84_pt.coords)[0]

#Create the map
my_map = folium.Map(location = coords, zoom_start = 13)

# Add marker
folium.Marker(coords, popup = 'Volos').add_to(my_map)

#Display the map
my_map

Loading...

Η βιβλιοθήκη Geopandas

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

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

Η βιβλιοθήκη geopandas είναι μια βιβλιοθήκη της Python η οποία υποστηρίζει την ανάγνωση, επεξεργασία, ανάλυση και εγγραφή γεωγραφικών και παράλληλα περιγραφικών δεδομένων. Αποτελεί επέκταση της βιβλιοθήκης pandas και “κληρονομεί” τα χαρακτηριστικά και τις δυνατότητές της.

Στην υφιστάμενη δομή της pandas, η geopandas υποστηρίζει την γεωμετρία με την προσθήκη μιας νέας στήλης και το γεωγραφικό σύστημα αναφοράς.

alt text
alt text

Εισάγουμε την βιβλιοθήκη με τον παρακάτω τρόπο

import geopandas as gpd
import mapclassify

Για να διαβάσουμε ένα αρχείο shapefile χρησιμοποιούμε την συνάρτηση gpd.read_file. Το αντικείμενο που προκύπτει είναι τύπου geopandas.geodataframe.GeoDataFrame

# Import shapefile using geopandas
dhmoi = gpd.read_file("../docs/dhmoi.gpkg")

type(dhmoi)
geopandas.geodataframe.GeoDataFrame

Η στήλη της γεωμετρίας ονομάζεται προκαθορισμένα geometry και είναι αντικείμενο geopandas.geoseries.GeoSeries που περιλαμβάνει αντικείμενα shapely.

type(dhmoi["geometry"])
geopandas.geoseries.GeoSeries

Με την μέθοδο geom_type μπορούμε να δούμε τον γεωμετρικό τύπο κάθε εγγραφής.

dhmoi.geom_type
0 MultiPolygon 1 MultiPolygon 2 MultiPolygon 3 MultiPolygon 4 MultiPolygon ... 320 MultiPolygon 321 MultiPolygon 322 MultiPolygon 323 MultiPolygon 324 MultiPolygon Length: 325, dtype: object

Ας δούμε τις αρχικές εγγραφές του αρχείου

dhmoi.head()
Loading...
dhmoi.plot()
<Axes: >
<Figure size 640x480 with 1 Axes>

Χαρτογραφική απόδοση σε διαδραστικό χάρτη

dhmoi.explore(legend=False)
Loading...

Εκτύπωση λεπτομερειών για το γεωγραφικό σύστημα αναφοράς το οποίο όπως φαίνεται παρακάτω είναι το ΕΓΣΑ '87 (EPSG:2100)

dhmoi.crs
<Projected CRS: PROJCS["unknown",GEOGCS["unknown",DATUM["Greek_Geo ...> Name: unknown Axis Info [cartesian]: - [east]: Easting (metre) - [north]: Northing (metre) Area of Use: - undefined Coordinate Operation: - name: unnamed - method: Transverse Mercator Datum: Greek Geodetic Reference System 1987 - Ellipsoid: GRS 1980 - Prime Meridian: Greenwich

Μπορούμε να μετασχηματίσουμε τα δεδομένα σε ένα διαφορετικό προβολικό σύστημα με κλήση της μεθόδου to_crs

dhmoi_wgs84 = dhmoi.to_crs(4326)
dhmoi_wgs84.crs
<Geographic 2D CRS: EPSG:4326> Name: WGS 84 Axis Info [ellipsoidal]: - Lat[north]: Geodetic latitude (degree) - Lon[east]: Geodetic longitude (degree) Area of Use: - name: World. - bounds: (-180.0, -90.0, 180.0, 90.0) Datum: World Geodetic System 1984 ensemble - Ellipsoid: WGS 84 - Prime Meridian: Greenwich
dhmoi.geom_type
0 MultiPolygon 1 MultiPolygon 2 MultiPolygon 3 MultiPolygon 4 MultiPolygon ... 320 MultiPolygon 321 MultiPolygon 322 MultiPolygon 323 MultiPolygon 324 MultiPolygon Length: 325, dtype: object

Εκτύπωση των γεωγραφικών ορίων του αρχείου oikismoi που είναι στο σύστημα αναφορά ΕΓΣΑ '87.

dhmoi.total_bounds
array([ 104040.7266, 3850938. , 1007943. , 4624010.2508])

Εκτύπωση των γεωγραφικών ορίων του αρχείου oikismoi που είναι στο σύστημα αναφορά WGS’84.

dhmoi_wgs84.total_bounds
array([19.37377196, 34.80060523, 29.64123782, 41.74911332])

Η μέθοδος shape μας επιστρέφει τον πλήθος των γραμμών (325) και των στηλών (15).

dhmoi.shape
(325, 16)

Μπορούμε να εγγράψουμε ένα Geopandas Dataframe

dhmoi.to_file("dhmoi.geojson", driver="GeoJSON", index = False)
dhmoi.sort_values(by='PopTot01', ascending=False)
Loading...

Ορισμός του index στην στήλη “CodeELSTAT”

dhmoi = dhmoi.set_index("CodeELSTAT")
dhmoi
Loading...

Υπολογισμός έκτασης (σε km2km^2) σε μία νέα στήλη με το όνομα area

dhmoi["area"] = dhmoi.area*10e-6
dhmoi
Loading...

Υπολογισμός του centroid κάθε δήμου σε μια νέα στήλη (centroid)

dhmoi['centroid'] = dhmoi.centroid
dhmoi
Loading...

Χαρτογραφική απόδοση του δείκτη ανεργίας (στήλη UnemrT01) ανά δήμο

dhmoi.plot("UnemrT01", legend=True)
<Axes: >
<Figure size 640x480 with 2 Axes>
 dhmoi.plot("Income01", scheme='quantiles', cmap='YlOrRd',  legend=True, figsize=(12, 10))
<Axes: >
<Figure size 1200x1000 with 1 Axes>

Μπορούμε να οπτικοποιήσουμε διαφορετική στήλη τύπου geopandas.geoseries.GeoSeries αφού πρώτα την ορίσουμε με την μέθοδο set_geometry.

dhmoi = dhmoi.set_geometry("centroid")
dhmoi.plot("UnemrT01", legend=True)
<Axes: >
<Figure size 640x480 with 2 Axes>

Ορισμός περιμετρικής ζώνης διαμέτρου 20χλμ γύρω από κάθε centroid.

dhmoi = dhmoi.set_geometry("centroid") # ορισμός default γεωμετρίας η στήλη centroid
dhmoi["buffered"] = dhmoi.buffer(20000) #εκτέλεση περιμετρικών ζωνών

dhmoi = dhmoi.set_geometry("buffered") # ορισμός default γεωμετρίας η στήλη buffered
dhmoi.plot(legend=True) # οπτικοποίηση
<Axes: >
<Figure size 640x480 with 1 Axes>

Ξανα ορίζουμε σαν προκαθορισμένη στήλη γεωμετρία την στήλη geometry.

dhmoi = dhmoi.set_geometry("geometry")

Μπορούμε να φιλτράρουμε γραμμές και στήλες όπως και στην pandas χρησιμοποιώντας το index και το όνομα στήλης:

lesvos = dhmoi.loc["5301", "geometry"]
lesvos
Loading...
type(lesvos)
shapely.geometry.multipolygon.MultiPolygon

Η παραπάνω διαδικασία επιλογής επέστρεψε ένα shapely MultiPolygon object όπως φαίνεται.

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

dhmoi.head()
Loading...
nomoi = dhmoi.dissolve(by='Perif')
dhmoi.plot()
<Axes: >
<Figure size 640x480 with 1 Axes>
nomoi.plot()
<Axes: >
<Figure size 640x480 with 1 Axes>

Επιπλεόν κατά την συγχώνευση μπορούμε να εφαρμόσουμε μια συνάρτηση στις στήλες που μας ενδιαφέρουν π.χ. mean ή sum.

nomoi = dhmoi[['geometry', 'Perif', 'PopTot01','UnemrT01','Income01']].dissolve(by='Perif', aggfunc='mean')
nomoi.plot(column = 'Income01', scheme='quantiles', edgecolor='black',  linewidth=0.5, cmap='YlOrRd',legend=True, figsize=(8, 8))
<Axes: >
<Figure size 800x800 with 1 Axes>

Βιβλιογραφία:

References
  1. Wasser, L., Korinek, N., & Palomino, J. (2021). earthlab/earth-analytics-intermediate-earth-data-science-textbook: one more license fix. Zenodo. 10.5281/ZENODO.5571001