Shapely: CBS’de Geometrik İşlemler için Python’un Güçlü Aracı
Coğrafi Bilgi Sistemleri (CBS) çalışmalarında geometrik nesneler(nokta, çizgi ve poligonlar) sadece verilerin taşıyıcısı olmakla kalmaz, aynı zamanda mekânsal analizlerin temel yapı taşlarını oluşturur. Bu nesneler üzerinde gerçekleştirilen kesişim, mesafe, alan veya tampon (buffer) gibi işlemler, mekânsal veriden anlamlı sonuçlar elde etmemizi sağlar.
Python ekosisteminde bu tür geometrik işlemleri kolay, hızlı ve programatik biçimde yapmamızı sağlayan en güçlü araçlardan biri Shapely’dir. Açık kaynak kodlu olması, yalın sözdizimi ve endüstri standardı kütüphanelerle uyumu sayesinde Shapely, CBS uzmanları ve geliştiriciler için vazgeçilmez bir araç haline gelmiştir.
Shapely Nedir?
Shapely, düzlemsel (planar) geometrik nesnelerin oluşturulması, dönüştürülmesi ve analiz edilmesi için geliştirilmiş, BSD lisanslı açık kaynak bir Python kütüphanesidir.
Arka planda, coğrafi veri işleme dünyasında yaygın olarak kullanılan açık kaynaklı GEOS kütüphanesini kullanır. GEOS; PostGIS’in geometrik motoru olup, Java tabanlı JTS (Java Topology Suite) kütüphanesinin C++ portudur. Bu sayede Shapely, CBS yazılımlarının (örneğin ArcGIS, QGIS) sunduğu birçok geometrik fonksiyonu Python ortamına taşır ve programatik bir biçimde kullanılmasını mümkün kılar.
Benzer Kütüphanelerden Neleri Farklı Yapıyor ?
Shapely, GEOS geometrilerini ve operasyonlarını sarmalayarak zengin bir Geometry API’si sunar.
- Odak noktası: Geometri işleme (buffer, intersection, union vb.).
- Odak dışı: Veri formatları, koordinat sistemleri, görselleştirmeve I/O işlemleri
- Ayrıca bu alanlarda uzman kütüphanelerle kolayca entegre olur.
CBS Kütüphaneleri ile İşlevsel Etkileşimleri
GeoPandas
- Pandas + Shapely kombinasyonudur.
- Geometry kolonundaki her satır bir Shapely nesnesidir (Point, Polygon, vb.).
- Buffer, intersection gibi işlemler, Shapely’nin fonksiyonlarını çağırır.
Fiona / Rasterio
- I/O işlemlerine odaklıdır (dosya açma/kapama).
- Geometrik işlem yapmaz, sadece veriyi Shapely nesnesine dönüştürür.
PyProj
- Koordinat dönüşümleri için özelleşmiştir.
- Geometrik yapıyı değiştirmez, sadece koordinat sistemini dönüştürür.
- Genellikle Shapely ile birlikte kullanılır:
-
- PyProj ile projeksiyon değiştir.
- Shapely ile geometri üzerinde işlem yap.
GDAL
- Geometrik işlemler içerse de genelllikle okuma, yazma ve dönüştürme için kullanılır.
- Motor olarak yine GEOS’u kullanır, fakat Shapely aynı altyapıyı daha basit ve Pythonic bir şekilde erişilebilir kılar.
Performans
- Shapely, yüksek performanslı NumPy ufunc desteğiyle çok boyutlu geometri dizileri üzerinde vektör işlemleri yapabilir.
- GEOS fonksiyonlarını çalıştırırken Python’un Global Interpreter Lock (GIL)’ini serbest bırakır.
- Böylece aynı Python süreci içinde gerçek çoklu iş parçacığı (multithreading) mümkündür.
- Bu, Shapely’yi hız açısından birçok CBS kütüphanesinden ayıran önemli bir avantajdır.
Shapely’nin Temel Fonksiyonlarına Bakış
Shapely’nin diğer kütüphanelerden farklarını ve performans avantajlarını inceledikten sonra en güçlü yanı olan geometrik işlemler için sunduğu fonksiyonlara odaklanabiliriz. Bu bölümde Shapely’nin en temel özelliklerini ve sık kullanılan bazı fonksiyonlarını örnek kodlarla birlikte inceleyeceğiz.
Geometri Oluşturma
Her şeyin başlangıç noktası, coğrafi nesnelerin tanımlanmasıdır. Shapely ile:
- Noktalar (Point),
- Çizgiler (LineString),
- Alan (Polygon)
gibi temel geometrik nesneler kolayca oluşturulabilir. Daha karmaşık yapılar için ise MultiPoint, MultiLineString ve MultiPolygon sınıfları kullanılır.

Şekil: Temel Geometrik Nesneler

Şekil: Temel Geometrik Nesnelerin Oluşturulması
Kod:
from shapely import Point, LineString
point = Point(5.2, 52.1)
line = LineString([(0, 0), (1, 2)])
print("point:",point)
print("line:",line)
Kod Çıktısı:
point: POINT (5.2 52.1)
line: LİNESTRİNG (0 0, 1 2)
Input / Output Fonksiyonları
Shapely, sadece Python içinde geometrik işlemler yapmakla kalmaz; aynı zamanda CBS ekosisteminde yaygın olarak kullanılan veri formatlarıyla etkileşime geçebilir. Bu sayede veriyi harici kaynaklardan alabilir ve işlenmiş geometrileri tekrar standart formatlara dönüştürebilirsiniz.
Bu amaçla Shapely, Input/Output (I/O) fonksiyonları sağlar.
Input (Girdi) Fonksiyonları
Harici formatlardaki verileri Shapely nesnelerine dönüştürür. Örnekler:
- from_geojson(): GeoJSON verilerini geometry objesine çevirir.
- from_wkt(): WKT (Well-Known Text) formatını geometry objesine dönüştürür.
- from_wkb(): WKB (Well-Known Binary) verisini Shapely geometrisine çevirir.
Output (Çıktı) Fonksiyonları:
Shapely geometrilerini standart formatlara dönüştürür. Örnekler:
- to_geojson(): GeoJSON formatında çıktı üretir.
- to_wkt(): WKT formatında çıktı verir.
- to_wkb(): WKB formatına dönüştürür.

Görsel: from_geojson() fonksiyonu ile GeoJSON formatındaki bir nokta verisinin Shapely Point nesnesine dönüştürülmesi
Kod:
from shapely import from_wkb, from_wkt, from_geojson
geojson_str = '{"type":"Point","coordinates":[30.5, 50.5]}'
point1 = from_geojson(geojson_str)
print("point1:",point1)
Kod Çıktısı:
point1: POINT (30.5 50.5)

Görsel: from_wkt() fonksiyonu kullanılarak WKT (Well-Known Text) biçimindeki nokta geometrisinin Shapely objesine çevrilmesi
Kod:
point2 = from_wkt("POINT (10 20)")
print("point2:",point2)
Kod Çıktısı:
point2: POINT (10 20)

Görsel: from_wkb() fonksiyonu aracılığıyla WKB (Well-Known Binary) verisinden Shapely Point nesnesi oluşturulması.
Kod:
point_wkb=from_wkb(b"\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
print("point_wkb:",point_wkb)
Kod Çıktısı:
point_wkb: POINT (0 0)
Hesaplama (Measurement) Fonksiyonları
Shapely, geometriler üzerinde alan, uzunluk ve mesafe gibi temel ölçümleri hızlıca yapmanızı sağlar.
Örnek Fonksiyonlar ve Kullanımı
- area → Çokgenlerin alanını hesaplar.
- length → Çizgi uzunluğu veya poligon çevresini verir.
- distance(a, b) → İki geometri arasındaki mesafeyi hesaplar.

Görsel: Hesaplama fonksiyonlarınıın örnek kullanımı
Kod:
from shapely import Polygon
square = Polygon([(0, 0), (2, 0), (2, 2), (0, 2)])
point = Point(1, 1)
point2 = Point(3, 4)
area = square.area
length = square.length
distance = point.distance(point2)
print("area of square:", area)
print("length of square:", length)
print("distance from point to point2:", distance)
Kod Çıktısı:
area of square: 4.0
length of square: 8.0
distance from point to point2: 3.605551275463989
Predicates: Geometri İlişkilerini Sorgulamak
Shapely, geometriler arasındaki ilişkileri test etmek için predicate (önermelik) fonksiyonları sunar. Örnekler:
- contains → Bir geometri diğerini kapsıyor mu?
- within → Bir geometri başka bir geometrinin içinde mi?
- intersects → Geometriler kesişiyor mu?

Görsel: Geometri ilişki fonksiyonlarının örnek kullanımı
Kod:
square_contains_point = square.contains(point)
point_within_square = point.within(square)
square_intersects_point = square.intersects(point)
print("square contains point:", square_contains_point)
print("point within square:", point_within_square)
print("square intersects point:", square_intersects_point)
Kod Çıktısı:
square contains point: True
point within square: True
square intersects point: True
Set Operations: Geometri Küme İşlemleri
Shapely ile geometriler üzerinde kesişim, birleşim ve fark işlemleri kolayca yapılır:
- intersection(a, b) → Kesişim alanını verir
- union(a, b) → Birleşimi döndürür
- difference(a, b) → Farkı hesaplar

Görsel: Geometri küme ilişki fonksiyonların örnek kullanımı
Kod:
intersection_area = square.intersection(point).area
union_area = square.union(point).area
difference_area = square.difference(point).area
print("intersection area:", intersection_area)
print("union area:", union_area)
print("difference area:", difference_area)
Kod Çıktısı:
intersection area: 0.0
union area: 4.0
difference area: 4.0
Constructive Operations: Geometri Oluşturma ve Dönüşüm
Shapely, mevcut geometrileri düzenleyerek veya yeni geometriler oluşturarak çalışmayı destekler:
- buffer (distance) → Nesnenin etrafında tampon bölge oluşturur.
- simplify (tolerance) → Geometrileri sadeleştirir.
- convex_hull → Geometriyi kapsayan en küçük konveks çokgeni döndürür.

Görsel: Geometri dönüştürme fonksiyonların örnek kullanımı
Kod:
circle = point.buffer(1)
print("circle:", circle)
simplified_square = circle.simplify(0.5)
print("simplified_square:", simplified_square)
hull = circle.convex_hull
print("hull:", hull)
Kod Çıktısı:
circle: POLYGON ((2 1, 1.995184726672197 0.9019828596704393, 1.9807852804032304 0.8049096779838718, 1.9569403357322088 0.7097153227455377, 1.9238795325112867 0.6173165676349102, ..., 2 1))
simplified_square: POLYGON ((2 1, 1 0, 0 1, 1 2, 2 1))
hull: POLYGON ((1 0, 0.9019828596704393 0.0048152733278031, 0.0048152733278032, ...,1 0))
Mekânsal İndeksleme: STRtree
Büyük veri kümelerinde her geometriyi tek tek karşılaştırmak çoğu zaman çok yavaş ve verimsizdir. Shapely’nin sunduğu STRtree (Spatial R-tree) özelliği mekânsal sorguları çok daha hızlı hale getirir.
STRtree Nedir?
- R-tree tabanlı bir mekânsal indeks yapısıdır.
- Geometrileri bounding box (sınırlayıcı dikdörtgen) düzeyinde organize eder.
- Böylece milyonlarca nesne içinden en yakın veya kesişen geometrileri hızlıca bulabilirsiniz.
Örnek Kullanım Senaryoları
- Nearest Neighbor: En Yakın Noktayı veya Poligonu Bulma
- Intersection Queries: Kesişebilecek Geometrileri Listeleme
- Filtreleme: Büyük Veri Kümelerinde Aramaları Hızlandırma

Görsel: STRtree örnek kullanımı
Kod:
from shapely.strtree import STRtree
points = [Point(i, i) for i in range(10)]
tree = STRtree(points)
query_point = Point(5.2, 5.1)
nearest = tree.nearest(query_point)
print(nearest)
Kod Çıktısı:
5
Görselleştirme (Plotting)
Shapely yalnızca geometrik işlemler yapmakla kalmaz, aynı zamanda bu nesneleri görselleştirmeye de imkân tanır. shapely.plotting modülü ile noktalar, çizgiler veya poligonlar doğrudan Matplotlib üzerinde görselleştirilebilir.
Aşağıdaki örnekte iki nokta (Point) ve bu noktaların birlikte oluşturduğu bir MultiPoint görselleştirilmektedir:

Görsel: Geometrik nesnelerin plotting fonksiyonları ile örnek kullanımı
Kod:
from shapely import MultiPoint
multi_point = MultiPoint([point, point2])
plotting.plot_geometry(multi_point, color='green', markersize=100)
plotting.plot_points(points, color='red', markersize=100)
plotting.plot_points(points, color='green', markersize=100)
Kod Çıktısı:

Görsel: Geometrik nesnelerin matplotlib kullanılarak görselleştirilmesi
Sonuç
Shapely, Coğrafi Bilgi Sistemleri (CBS) alanında geometrik işlemleri Python ekosistemine taşıyan önemli bir kütüphanedir. GEOS altyapısını kullanarak, PostGIS düzeyindeki geometrik analiz yeteneklerini sade ve anlaşılır bir API aracılığıyla geliştiricilere sunar. Nokta, çizgi ve poligon gibi temel geometrik nesnelerin oluşturulması, dönüştürülmesi ve analizi Shapely ile kolayca gerçekleştirilebilir. Ayrıca Shapely, GeoPandas, PyProj, Fiona ve GDAL gibi diğer CBS araçlarıyla entegre bir şekilde çalışarak veri işleme, projeksiyon dönüşümü ve görselleştirme süreçlerinde tamamlayıcı bir rol üstlenir.
Bununla birlikte, Shapely yalnızca kullanım kolaylığıyla değil, aynı zamanda performans avantajlarıyla da öne çıkar. GEOS motorunun sağladığı işlem gücü ve Python’un Global Interpreter Lock (GIL) serbestliği sayesinde çoklu iş parçacığı (multithreading) desteği sunar; bu da özellikle büyük ölçekli mekânsal veri kümeleriyle yapılan analizlerde önemli bir hız kazandırır.
Sonuç olarak, Shapely hem akademik çalışmalarda hem de üretim ortamlarındaki uygulamalarda güvenilir, performanslı ve Pythonic bir geometrik analiz aracı olarak CBS geliştiricileri tarafından yaygın olarak kullanılmaktadır.
