Her gün üretilen verilerin kayda değer bir bölümü doğası gereği mekânsaldır. Yer Gözlem verilerinden ve GPS verilerinden her tür haritaya dahil edilen verilere kadar, mekânsal veriler –bazı durumlarda coğrafi veriler veya coğrafi bilgi olarak da anılır– her kayda belirli bir konumun iliştirildiği verilerdir.
Her mekânsal veri noktası bir harita üzerinde konumlandırılabilir. Bu, belirli bir koordinat referans sistemi kullanılarak yapılabilir; örneğin, küre üzerindeki bir konumu belirtmek için kullandığımız enlem-boylam çiftlerine dayanan coğrafi koordinatlar. Bu sayede veriler arasındaki mekânsal ilişkileri inceleyebiliriz.
Yine de, mekânsal verilerin asıl gücü, verilerin kendilerini ve konumlarını bir araya getirerek gelişmiş analiz için çeşitli fırsatların önünü açmasında yatar. Sözde coğrafi veri bilimi, makine öğrenmesi ve derin öğrenme gibi mekânsal algoritmaların ve analitik tekniklerin gücünden yararlanarak mekânsal verilerden bilgi çıkarmaya odaklanan veri biliminin bir alt alanıdır. Başka bir deyişle, coğrafi veri bilimi bize olayların nerede gerçekleştiğini ve neden orada gerçekleştiğini anlamada yardımcı olur.
Mekânsal veri bilimi için uygun birçok araç vardır. Bu eğitim, Python’da mekânsal verilerle çalışmaya yönelik açık kaynaklı bir paket olan GeoPandas’a odaklanacaktır.
GeoPandas, pandas tarafından kullanılan veri tiplerini –Python’da veri çerçevelerini (dataframe) işlemek için standart araç– geometrik türler üzerinde mekânsal işlemlere izin verecek şekilde genişletir. GeoPandas, pandas’ın yanı sıra matplotlib gibi veri bilimi için diğer popüler Python paketleri üzerine inşa edildiğinden, Python kullanan veri profesyonellerinin GeoPandas söz dizimine alışması oldukça kolaydır.
Python GeoPandas'ın kurulumu
Python GeoPandas’ı kullanmak için, diğer tüm Python kütüphanelerinde olduğu gibi, önce kurmanız gerekir.
GeoPandas’ın tam mekânsal potansiyelini sunmak için shapely, fiona, pyproj ve rtree gibi bir dizi açık kaynaklı CBS kütüphanesine dayandığını unutmamak gerekir. Bu bağımlılıkların tümünü kurduğunuzdan emin olmalısınız; aksi halde GeoPandas beklediğiniz gibi çalışmayabilir.
Karmaşıklıklardan kaçınmak için GeoPandas, kütüphaneyi conda paket yöneticisi ile kurmayı önerir. Bu, öncelikle Anaconda’yı kurmanız gerekeceği anlamına gelir. Anaconda nasıl kurulur ve kullanılır konulu rehberimiz için eğitimimize göz atın.
Conda kullanmanın avantajı, GeoPandas’ın gerekli ve isteğe bağlı tüm bağımlılıkları için tüm işletim sistemlerinde (Windows, Mac, Linux) önceden derlenmiş ikili dosyalar sağlamasıdır. Komut satırında GeoPandas’ı kurmak için:
>>conda install geopandas
Alternatif olarak, Python’daki standart paket yükleyicisi olan pip ile de Anaconda’yı kurabilirsiniz. Daha önce de belirtildiği gibi, gerekli bağımlılıkları da kurmanız gerekecek. Pip’e aşina değilseniz, Paket Yönetimi için Pip Python Eğitimi yazımızı okumanızı şiddetle tavsiye ederiz. GeoPandas’ı pip ile kurmak için çalıştırmanız gereken komut:
>>pip install geopandas
Her durumda, GeoPandas kurulumunda sorun yaşıyorsanız, daha fazla bilgi için belgelere göz atmalısınız.
Paket kurulduktan sonra GeoPandas’ı kullanmaya hazırsınız. Sadece Python ortamınıza içe aktarın. GeoPandas’ın sıklıkla gpd kısaltmasıyla içe aktarıldığını unutmayın.
import geopandas as gpd
GeoPandas ile temel işlemler
Bu bölümde, GeoPandas ile yapabileceğiniz en temel işlemleri ele alacağız. Bunu yaparken, mekânsal analizin bazı kritik kavramlarını –mekânsal veri türleri, mekânsal veri biçimleri ve koordinat referans sistemleri (CRS)– tanıtacağız.
Mekânsal verileri okuma ve yazma
Nasıl ki pandas, girdi verilerini alıp bir pandas dataframe’ine dönüştürüyorsa, GeoPandas da girdi (mekânsal) verilerini okuyup sözde GeoDataFrame’e dönüştürür.
GeoPandas’ın okuyabildiği çok sayıdaki mekânsal dosya türüne geçmeden önce, farklı mekânsal veri türlerini ayırt etmek önemlidir. Ele aldığımız veri türü, veriyi analiz etmek ve ardından görselleştirmek için hangi araçları kullanmamız gerektiğini belirler.
Temelde iki ana mekânsal veri türü vardır:
- Vektör verisi. Yeryüzündeki coğrafi konumların özelliklerini ayrık geometriler kullanarak tanımlar. Bunlar şunlardır:
- Nokta (Point). Bir bina veya araba gibi X ve Y koordinatlarına sahip tekil konumlar.
- Çizgi (Line). Yollar veya dereler gibi unsurları tanımlayan bağlı noktalar dizisi.
- Poligon (Polygon). Bir alanı çevreleyen kapalı bir çizgiden oluşur; örneğin bir ülkenin sınırları. Ek olarak, bir unsur birden fazla geometriden oluşuyorsa buna MultiPolygon denir.
- Raster verisi. Dünyayı bir ızgara ile temsil edilen sürekli bir yüzey olarak kodlar; bir görüntünün pikselleri gibi. Izgaranın her bir parçası sürekli bir değer (ör. yükseklik) veya kategorik bir sınıflandırma (ör. arazi örtüsü sınıflandırmaları) olabilir. Klasik örnekler yükseklik verileri veya uydu görüntüleridir.

Kaynak: Humboldt State University
Hem vektör hem de raster veriler genellikle mekânsal olmayan verilerle, diğer adıyla özniteliklerle birlikte gelir. Mekânsal veriler, konum bilgisine eşlik eden herhangi sayıda ek özniteliğe sahip olabilir. Örneğin bir okulun konumu, okulun adı, öğrenci sayısı veya adresiyle ilişkilendirilebilir.
GeoPandas, vektör verileriyle çalışmak üzere tasarlanmıştır; ancak rasterio gibi diğer Python paketleriyle kolayca iş birliği yaparak raster verilerle de başa çıkabilir. Mekânsal veri okumak için GeoPandas, geopandas.read_file() işleviyle birlikte gelir. Bu güçlü işlev, yaygın olarak karşılaşılan vektör tabanlı mekânsal verilerin çoğunu otomatik olarak okuyabilir.
En yaygın vektör veri biçimlerinden bazıları şunlardır:
- Shapefile. Sektör standardı olarak, shapefile’lar en yaygın vektör veri biçimidir. Genellikle bir zip dosyası içinde sağlanan üç dosyadan oluşur:
- .shp dosyası şekil geometrisini içerir.
- .dbf dosyası her geometrinin özniteliklerini tutar,
- .shx dosyası veya şekil indeks dosyası özniteliklerin şekillerle ilişkilendirilmesine yardımcı olur.
- GeoJSON. 2016’da yayımlanan daha yeni bir CBS veri biçimidir. Shapefile’ların aksine GeoJSON tek bir dosyadır; bu da onunla çalışmayı kolaylaştırır.
Aşağıdaki örneklerde, Barcelona şehrinin farklı ilçelerine ilişkin mekânsal verileri içeren ve GitHub’da barındırılan bir GeoJSON dosyasını okumak için geopandas.read_file() işlevini kullanacağız.
url = 'https://raw.githubusercontent.com/jcanalesluna/bcn-geodata/master/districtes/districtes.geojson'
districts = gpd.read_file(url)
districts

Bu veri setine birazdan geri döneceğiz; ancak önce bir GeoDataFrame’i dosyaya nasıl yazacağınızı bilmeniz gerekir. Oldukça kolaydır. Mekânsal verileri içeren bir dosya oluşturmak için GeoDataFrame.to_file() yöntemini kullanmanız yeterlidir. Varsayılan olarak yeni belgenin biçimi shapefile olacaktır; fakat bunu “driver” parametresiyle değiştirebilirsiniz.
Örneğin, ilçe GeoDataFrame’ini bir geoJSON dosyasına kaydedebilirsiniz:
districts.to_file("districts.geojson", driver="GeoJSON")
GeoDataFrame'leri keşfetme
Önceki bölümdeki GeoDataFrame’in geleneksel bir pandas dataframe’ine benzediğini fark etmiş olabilirsiniz. Bu benzerlik mantıklıdır; çünkü GeoDataFrame, pandas.DataFrame’in bir alt sınıfıdır. Bu, pandas dataframe’inin birçok yöntem ve özniteliğini miras aldığı anlamına gelir. GeoDataFrame’de yeni olan ise geometri sütunlarını (GeoSeries olarak da bilinir) depolayabilmesi ve mekânsal işlemler yapabilmesidir.
Geometri sütunu, noktalar, çizgiler ve poligonlar gibi herhangi bir vektör veri türünü içerebilir. Ayrıca, bir GeoDataFrame birden fazla GeoSeries içerebilse de yalnızca bir sütunun etkin geometri olarak kabul edildiğini ve tüm mekânsal işlemlerin bu sütuna dayandığını not etmek önemlidir.

Kaynak: GeoPandas
GeoDataFrame’lerin bir diğer önemli özelliği, her GeoSeries’in ilişkili CRS bilgisiyle gelmesidir. Bu CRS bilgisi, GeoPandas’a koordinatların Dünya üzerinde nerede bulunduğunu söyler. Bu bilgi, mekânsal analiz için kilit önemdedir. Örneğin iki mekânsal veri setini birleştirmeniz gerekiyorsa, her ikisinin de aynı CRS ile ifade edildiğinden emin olmanız gerekir. Aksi takdirde beklediğiniz sonucu elde edemezsiniz.
İki ana CRS kategorisi vardır:
- Coğrafi koordinatlar. Ekvator ve başlangıç meridyenine göre enlem ve boylam derecelerinde küresel bir konum tanımlar. Bu sistemle yeryüzündeki herhangi bir konumu kolayca belirtebiliriz. Örneğin GPS’te yaygın olarak kullanılır. En popüler CRS, WGS84 olarak da adlandırılan EPSG:4326’dır.
- Projeksiyonlu koordinatlar. Dünya yuvarlaktır; ancak onu genellikle iki boyutlu bir haritada temsil ederiz. Projeksiyonlu koordinatlar, konumları X ve Y boyutlarında ifade eder; böylece derece yerine metre gibi bir uzunluk birimiyle çalışmamıza imkân tanır; bu da analizi daha elverişli ve etkili kılar. Ancak üç boyutlu Dünya’dan iki boyutlu bir haritaya geçildiğinde kaçınılmaz olarak bozulmalar oluşur. Bu nedenle projeksiyonlu koordinatları oluşturmaya yönelik farklı yaklaşımlar vardır. Örneğin pek çok ülke, kendi coğrafyaları için standart bir projeksiyonlu CRS benimsemiştir.
CRS hakkında söylenecek çok daha fazla şey var; fakat bu, bu eğitimin kapsamı dışında. Ek bilgi ve pratik örnekler için harika bir kaynak, Python ile Mekânsal Verilerle Çalışma kursumuzdur.
GeoPandas’ta CRS bilgisi crs özniteliğinde saklanır:
districts.crs

İlçe GeoDataFrame’i coğrafi koordinatlarla (EPSG: 4326) ilişkilidir; ancak metre cinsinden bazı hesaplamalar yapabilmek için bunu projeksiyonlu koordinatlara dönüştürmek istiyoruz. İspanya için standart projeksiyonlu CRS olan EPSG:2062’ye dönüştürelim. Bunu Geopandas.to_crs() yöntemiyle yapabiliriz.
districts.to_crs(epsg=2062, inplace=True)
districts.crs

Artık doğru projeksiyonlu CRS’i ayarladığımıza göre, GeoDataFrame’lerin özniteliklerini keşfetmeye hazırız.
Mekânsal bir veri setinin özniteliklerini keşfetme
GeoPandas, shapely paketinden bir dizi kullanışlı yöntem ve özniteliği miras alır. Bunlardan dördünü ele alacağız.
Alan
area özniteliği, bir geometrinin hesaplanmış alanını döndürür. Ortaya çıkan alanı (km2’ye dönüştürülmüş) yeni bir sütunda saklayabiliriz:
districts['area'] = districts.area / 1000000
districts
Ağırlık merkezi (Centroid)
centroid özniteliği, bir geometrinin merkez noktasını döndürür. Bunu veri setimize ekleyerek yeni bir geometri sütunu oluşturabiliriz.
districts['centroid']=districts.centroid
districts
Sınır (Boundary)
boundary özniteliği, bir poligonun sınırını döndürür.
districts['boundary']=districts.boundary
Mesafe
distance yöntemi, bir geometriden bir konuma olan asgari mesafeyi verir. Örneğin, ünlü Sagrada Familia kilisesinin (Eixample ilçesinde yer alır) Barcelona’daki her ilçenin ağırlık merkezine olan mesafesini hesaplamak ve bu mesafeleri (kilometre cinsinden) yeni bir sütuna eklemek isteyelim.

Sagrada Familia. Kaynak: Wikipedia
Önce, shapely Point() işlevini kullanarak istenen koordinatlarla bir nokta oluşturmalı (bunları Google Haritalar’da kolayca bulabilirsiniz), doğru CRS ile bir GeoSeries’e dönüştürmeli ve ardından GeoPandas.distance() yöntemini kullanmalıyız:
from shapely.geometry import Point
sagrada_fam = Point(2.1743680500855005, 41.403656946781304)
sagrada_fam = gpd.GeoSeries(sagrada_fam, crs=4326)
sagrada_fam= sagrada_fam.to_crs(epsg=2062)
districts['sagrada_fam_dist'] = [float(sagrada_fam.distance(centroid)) / 1000 for centroid in districts.centroid]
Önceki mekânsal işlemleri takiben ortaya çıkan veri seti şöyle görünür:

GeoPandas ile görselleştirme
Yaptığımız mekânsal işlemler çalışmamız için içgörülü bilgiler sunuyor. Ancak geometrilerinizi mekânda görselleştirmek, analizinizi geliştirmenin harika bir yoludur. Neyse ki bir GeoPandas grafiği oluşturmak çok kolay. Python’un matplotlib paketi üzerine kurulu GeoDataFrame.plot() işlevini çağırmanız yeterlidir.
Barcelona ilçelerinin temel bir görselleştirmesiyle başlayalım.
ax= districts.plot(figsize=(10,6))

GeoPandas grafiğimizi her ilçeyi renklendirerek daha bilgilendirici hale getirebiliriz. 'True' olarak ayarlanan açıklama (legend), renklerin yorumlanmasına yardımcı olacak bir açıklama kutusu oluşturur.
ax= districts.plot(column=district_name', figsize=(10,6), edgecolor='black', legend=True)

Son olarak, ilçelerin ağırlık merkezlerini ve Sagrada Familia’yı haritamıza, ayrıca bir başlık ekleyebiliriz. Benzer şekilde, grafiği daha etkileyici kılmak için, Barcelona şehrinin gerçek fayans haritasını eklemek üzere hoş contextily paketini kullanabiliriz.
import contextily
ax= districts.plot(column='district_name', figsize=(12,6), alpha=0.5, legend=True)
districts["centroid"].plot(ax=ax, color="green")
sagrada_fam.plot(ax=ax,color='black', marker='+')
contextily.add_basemap(ax, crs=districts.crs.to_string())
plt.title('A Beautiful Map of Barcelona')
plt.axis('off')
plt.show()

Güzel, değil mi? Çok daha güzel mekânsal görselleştirmeler yapmak için yapabilecekleriniz bununla sınırlı değil. Python ile Mekânsal Verileri Görselleştirme kursumuz, görselleştirme becerilerinizi bir üst seviyeye taşımanız için harika bir kaynaktır.
GeoPandas ile mekânsal ilişkiler
Mekânsal verilerin temel yönlerinden biri, mekânda birbirleriyle nasıl ilişkilendikleridir. GeoPandas, pandas ve shapely paketlerinin gücünden yararlanarak mekânsal veri setleri arasında her türlü mekânsal ilişkiyi gerçekleştirir. Bu bölümde en yaygın işlemlerden bazılarını ele alacağız.
Öznitelik birleştirmeleri
pandas’ta veri setlerini birleştirmenin iki yolu vardır: öznitelik birleştirmeleri ve mekânsal birleştirmeler.
Öznitelik birleştirmeleri, iki GeoDataFrame’i, tıpkı pandas’taki normal bir join işlemi gibi, geometri dışındaki değişkenlere dayalı olarak birleştirmemize olanak tanır. Nitekim, öznitelik birleştirmeleri standart pandas.merge() yöntemiyle yapılır. pandas birleştirmeleri hakkında daha fazla bilgi almakla ilgileniyorsanız, pandas’ta DataFrame Birleştirme eğitimimize göz atın.
Örneğin, GeoDataFrame’imizi Barcelona’nın 2022 nüfus verileriyle zenginleştirmek ilginç olabilir.
pop =pd.read_csv('poblacion_barna_2022.csv', usecols=['Nom_Districte','Nombre'])
pop = pd.DataFrame(pop.groupby('Nom_Districte')['Nombre'].sum()).reset_index()
pop.columns=['district_name','population_22']
districts = districts.merge(pop)
districtsv
Mekânsal birleştirmeler
Buna karşılık, mekânsal birleştirmeler iki GeoDataFrame’in mekânsal ilişkilerine dayalı olarak birleştirilmesine olanak tanır.
Örneğin, Barcelona’daki bisiklet şeritlerinin hangi ilçelerde bulunduğunu belirleyelim.
url = 'https://opendata-ajuntament.barcelona.cat/resources/bcn/CarrilsBici/CARRIL_BICI.geojson'
bike_lane = gpd.read_file(url)
bike_lane = bike_lane.loc[:,['ID','geometry']]
bike_lane.to_crs(epsg=2062, inplace=True)


GeoPandas’ta mekânsal birleştirme işlemi sjoin() işlevi olarak mevcuttur. Belirttiğimiz ilk argüman, bilgi eklemek istediğimiz GeoDataFrame; ikinci argüman ise eklemek istediğimiz bilgiyi içeren GeoDataFrame’dir. Ardından birleştirme türünü belirtmemiz gerekir. Son olarak “predicate” parametresi, her iki veri setini eşleştirmek için hangi mekânsal ilişkiyi kullanmak istediğimizi GeoPandas’a söyler. En yaygın ilişkilerden bazıları “intersects”, “contains” ve “within”dir.
Örneğimizde “intersects” önermesini kullanacağız. İki geometrik nesne, sınır veya iç noktalarından herhangi birini paylaşıyorsa kesişir.
lanes_districts = gpd.sjoin(districts, bike_lane, how='inner', predicate='intersects')
lanes_districts

Ortaya çıkan GeoDataFrame’in, bike_lane GeoDataFrame’inden daha fazla satıra sahip olduğuna dikkat edin. Bunun nedeni, bir bisiklet şeridinin birden fazla ilçede bulunabilmesidir.
Son olarak, veri setimizi gruplandırarak ilçelere göre bisiklet şeridi sayısını elde edebiliriz:
lanes_districts.groupby('district_name').size()
GeoPandas bindirme (overlay) işlemleri
Son olarak, mekânsal bindirmeler, poligon veya çoklu poligon (multipolygon) geometrileri içeren iki GeoDataFrame’i karşılaştırmanıza ve mekânsal birleşimi temsil eden yeni geometriler ve birleştirilmiş özelliklerle yeni bir GeoDataFrame oluşturmanıza olanak tanır. Aşağıdaki görsel farklı olasılıkları gösterir:

Kaynak: GeoPandas
Barcelona Belediyesi’nin, kirlilikle mücadele etmek ve toplumsal refahı artırmak amacıyla yeni yerel parklar inşa etmek istediğini hayal edin. Ön fikir olarak, her ilçenin merkezinden 500 metre yarıçaplı, büyük ve yuvarlak parklar oluşturmak düşünülüyor. Bunu, her ilçenin ağırlık merkezine dayalı bir tampon (buffer) oluşturarak simüle edebiliriz.
parks = gpd.GeoDataFrame(districts.centroid.buffer(500), geometry=0)
parks.plot()

Artık bazı bindirme işlemleri yapmaya hazırız. Örneğin, parkların yer alacağı ilçelerin sadece bu alanlarını görmek istiyorsak GeoPandas.overlay() yöntemini kullanabiliriz:
parks_intersection = districts.overlay(parks, how='intersection')
ax = parks_intersection.plot(alpha=0.5, edgecolor='black', column='district_name')

Ya da, projeksiyonu yapılan parkların kapladığı alanlar hariç ilçeleri görmek istersek, farklı bir bindirme işlemi yapmak için “how” parametresini değiştirebiliriz.
parks_difference = districts.overlay(parks, how='difference')
ax = parks_difference.plot(alpha=0.5, edgecolor='black', column='district_name')

Sonuç
Bu GeoPandas eğitiminden keyif aldığınızı umuyoruz. Mekânsal analiz, veri biliminin en havalı alanlarından biridir ve analizinizi konum tabanlı bilgilerle zenginleştirmek için sonsuz fırsatlar sunar. Mekânsal analiz için birçok araç vardır; ancak hâlihazırda Python’a aşinaysanız, GeoPandas başlamak için harika bir yerdir.
Mekânsal eğitimine devam etmek ister misiniz? Sizi düşündük! Aşağıdaki materyallerimize göz atın ve mekânsal konularda uzmanlaşın:
GeoPandas SSS
CBS veri analizi nedir?
Coğrafi veri bilimi, mekânsal algoritmaların ve analitik tekniklerin gücünden yararlanarak coğrafi verilerden bilgi çıkarmaya odaklanan veri biliminin bir alt alanıdır.
GeoPandas nedir?
GeoPandas, Python’da mekânsal verilerle çalışmayı kolaylaştıran açık kaynaklı bir projedir.
pandas ile GeoPandas arasındaki fark nedir?
GeoPandas, pandas tarafından kullanılan veri tiplerini, geometrik türler üzerinde mekânsal işlemlere izin verecek şekilde genişletir. GeoPandas, sözde GeoDataFrame’i oluşturmak için pandas DataFrame’lerini kullanır.




