0Pricing
SQL Academy · Ders

Mekânsal Birleştirmeler ve İçerme

Hangi noktaların hangi alanlara düştüğünü belirleyin.

Mekânsal Birleştirmeler ve İçerme, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.

Mekânsal Birleştirme Nedir?

Bir mekânsal birleştirme, iki tabloyu eşleşen bir anahtar yerine coğrafi bir ilişkiye göre birleştirir. "Bu ID şu ID'ye eşit mi?" diye sormak yerine, "Bu nokta şu çokgenin içinde mi?" veya "Bu iki şekil örtüşüyor mu?" gibi sorular sorarsınız.

PostGIS, PostgreSQL'i geometri türleri ve mekânsal işlevlerle genişleterek bu birleştirmeleri mümkün kılar. Sonuç, normal bir SQL JOIN ile aynıdır — her iki tablodaki satırlar birleştirilir — ancak koşul geometriktir.

Örnek Tabloları Oluşturma

Üzerinde çalışmak için iki tablo oluşturalım: nokta konumlarını tutan cities ve poligon sınırlarını tutan countries. Her ikisi de PostGIS'in SRID 4326 ile kullanılan GEOMETRY türünü kullanır (standart WGS84 enlem/boylam sistemi).

SRID (Mekânsal Referans ID'si), PostGIS'e hangi koordinat sistemini kullanacağını bildirir. SRID 4326, GPS verileri için en yaygın kullanılan sistemdir.

CREATE TABLE countries (
  id     SERIAL PRIMARY KEY,
  name   TEXT NOT NULL,
  border GEOMETRY(POLYGON, 4326)
);

CREATE TABLE cities (
  id       SERIAL PRIMARY KEY,
  name     TEXT NOT NULL,
  location GEOMETRY(POINT, 4326)
);

Örnek Verileri Ekleme

Geometri değerlerini Well-Known Text (WKT) biçiminden eklemek için ST_GeomFromText işlevini kullanacağız. WKT, geometrilerin standart metin gösterimidir: noktalar için POINT(lon lat), poligonlar için POLYGON((...)).

WKT'de boylamın enlemden önce geldiğine dikkat edin; bu, matematikteki X, Y kuralıyla uyumludur.

INSERT INTO countries (name, border) VALUES
  ('France', ST_GeomFromText('POLYGON((-5 42, 8 42, 8 51, -5 51, -5 42))', 4326)),
  ('Spain',  ST_GeomFromText('POLYGON((-9 36, 3 36, 3 44, -9 44, -9 36))', 4326));

INSERT INTO cities (name, location) VALUES
  ('Paris',    ST_GeomFromText('POINT(2.35 48.85)',   4326)),
  ('Madrid',   ST_GeomFromText('POINT(-3.70 40.42)',  4326)),
  ('Bordeaux', ST_GeomFromText('POINT(-0.58 44.84)',  4326)),
  ('Lisbon',   ST_GeomFromText('POINT(-9.14 38.72)',  4326));

ST_Contains: Temel İşlev

ST_Contains(geometry A, geometry B), A geometrisi B geometrisini tamamen kapsadığında TRUE döndürür. Kullanım senaryomuzda ST_Contains(country.border, city.location), bir şehir noktası ülke poligonunun içinde bulunduğunda doğru değerini döndürür.

Bu, PostGIS'teki kapsama birleştirmelerinin temelidir. İşlev, OGC standardının bir parçasıdır ve her türlü geometri türü birleşimiyle çalışır.

SELECT
  ci.name  AS city,
  co.name  AS country
FROM   cities   ci
JOIN   countries co
  ON   ST_Contains(co.border, ci.location);

ST_Within: Ters Bakış Açısı

ST_Within(geometry A, geometry B), ST_Contains işlevinin tam tersidir: A geometrisi B geometrisinin tamamen içinde olduğunda TRUE döndürür. ST_Within(city, country), mantıksal olarak ST_Contains(country, city) ile aynıdır.

Her iki işlev de burada aynı sonucu üretir. Aralarındaki seçim okunabilirlikle ilgilidir; sorgunuzda daha doğal görüneni seçin.

-- These two queries return identical results:

-- Using ST_Contains (country contains city)
SELECT ci.name, co.name
FROM   cities ci
JOIN   countries co ON ST_Contains(co.border, ci.location);

-- Using ST_Within (city is within country)
SELECT ci.name, co.name
FROM   cities ci
JOIN   countries co ON ST_Within(ci.location, co.border);

Eşleşmeyen Noktaları Bulmak için LEFT JOIN

Normal bir JOIN, hiçbir ülke poligonunun içine düşmeyen şehirleri sonuçtan çıkarır. Kendilerini kapsayan hiçbir poligonu olmayan noktaları bulmak için LEFT JOIN ile birlikte WHERE ... IS NULL denetimini kullanın. Bu yöntem, veri kalitesi sorunlarını veya kapsama alanınızın dışındaki noktaları tespit etmek için yararlıdır.

SELECT
  ci.name  AS city,
  co.name  AS country
FROM   cities   ci
LEFT JOIN countries co
  ON   ST_Contains(co.border, ci.location)
ORDER BY co.name NULLS LAST;

Poligon Başına Noktaları Sayma

Mekânsal birleştirmeler, toplama işlemiyle birleştirildiğinde çok işe yarar. Şehirleri ülkelere bağlayıp ülkeye göre gruplandırarak her poligonun içinde kaç nokta bulunduğunu sayabilirsiniz. Bu kalıp, coğrafi analizlerde son derece yaygındır: bölge başına mağazaları, ilçe başına etkinlikleri, bölge başına sensörleri ve benzerlerini saymak için kullanılır.

SELECT
  co.name          AS country,
  COUNT(ci.id)     AS city_count
FROM   countries co
LEFT JOIN cities  ci
  ON   ST_Contains(co.border, ci.location)
GROUP BY co.name
ORDER BY city_count DESC;

Performans için Mekânsal Dizin Kullanma

Her nokta her poligona karşı denetlendiği için büyük veri kümelerinde mekânsal birleştirmeler yavaş olabilir. Bir GIST dizini (Genelleştirilmiş Arama Ağacı), PostGIS'in kesin ST_Contains denetimini çalıştırmadan önce çoğu karşılaştırmayı atlamak için sınırlayıcı kutu ön filtresi kullanmasını sağlar.

Birleştirme veya filtreleme yaptığınız geometri sütunlarında her zaman bir GIST dizini oluşturun. Sorgu planlayıcısı bunu otomatik olarak kullanır.

-- Create GIST indexes on both geometry columns
CREATE INDEX idx_countries_border
  ON countries USING GIST (border);

CREATE INDEX idx_cities_location
  ON cities USING GIST (location);

-- The same join now benefits from index acceleration
SELECT ci.name, co.name
FROM   cities ci
JOIN   countries co
  ON   ST_Contains(co.border, ci.location);

ST_Intersects: Kesişen Geometriler

ST_Intersects(A, B), iki geometri herhangi bir ortak noktayı paylaşıyorsa TRUE döndürür; buna yalnızca bir sınırda birbirine değmeleri de dahildir. ST_Contains işlevine göre daha esnektir: İki poligon, hiçbiri diğerini tamamen kapsamasa bile örtüşüyorsa kesişir.

Nokta-poligon denetimlerinde ST_Intersects ve ST_Contains eşdeğerdir; ancak ST_Intersects, GIST dizinini daha verimli kullanır ve uygulamada çoğu zaman tercih edilir.

-- ST_Intersects is index-friendly and equivalent
-- to ST_Contains for point-in-polygon tests
SELECT
  ci.name  AS city,
  co.name  AS country
FROM   cities   ci
JOIN   countries co
  ON   ST_Intersects(co.border, ci.location);

Noktaları En Yakın Poligona Bağlama

Bir nokta tam olarak bir sınır üzerinde bulunduğunda veya birden fazla poligona çok yakın olduğunda, tüm eşleşmeler yerine en yakın poligonu isteyebilirsiniz. ST_Distance iki geometri arasındaki mesafeyi ölçer; böylece ORDER BY + LIMIT kalıplarını veya ORDER BY ... LIMIT 1 içeren özel LATERAL birleştirmesini kullanabilirsiniz.

Buna en yakın komşu birleştirmesi denir. GPS izlerini yol parçalarına oturturken veya bir noktayı en yakın bölgeye atarken sıkça kullanılır.

-- For each city, find the single closest country centroid
SELECT DISTINCT ON (ci.name)
  ci.name                              AS city,
  co.name                              AS nearest_country,
  ST_Distance(ci.location, ST_Centroid(co.border)) AS dist
FROM   cities   ci
CROSS JOIN countries co
ORDER BY ci.name, dist;

Uygulamalı Örnek: İlçelerdeki Restoranlar

İşte gerçekçi, baştan sona bir örnek: Her restoranın hangi şehir ilçesine ait olduğunu bulup ardından ilçe başına restoranları saymak. Bu kalıp, her türlü nokta-poligon senaryosuna uygulanabilir: mahallelerdeki ATM'ler, bölgelerdeki kazalar, teslimat alanlarındaki siparişler.

Sorgu, mekânsal birleştirme içinde ST_Within kullanır ve bir özet raporu için sonuçları gruplandırır.

-- Assume tables: districts(id, name, boundary GEOMETRY)
--                restaurants(id, name, location GEOMETRY)

SELECT
  d.name                 AS district,
  COUNT(r.id)            AS restaurant_count,
  STRING_AGG(r.name, ', ' ORDER BY r.name) AS names
FROM   districts    d
LEFT JOIN restaurants r
  ON   ST_Within(r.location, d.boundary)
GROUP BY d.name
ORDER BY restaurant_count DESC;

Hızlı Kontrol

PostGIS'teki mekânsal birleştirmeler ve kapsama konusundaki anlayışınızı sınayın.

Özet: Mekânsal Birleştirmeler ve Kapsama

Bu derste PostGIS mekânsal birleştirmelerini kullanarak "hangi noktaların hangi alanlarda bulunduğu" sorusunu nasıl yanıtlayacağınızı öğrendiniz.

Önemli noktalar:

  • ST_Contains(poligon, nokta) — poligon noktayı tamamen kapsadığında doğru değerini döndürür.
  • ST_Within(nokta, poligon) — bunun tersidir; mantıksal olarak ST_Contains ile eşdeğerdir.
  • ST_Intersects — daha genel bir örtüşme denetimidir; nokta-poligon işlemlerinde dizin kullanımına uygundur.
  • Geometri sütunlarındaki GIST dizinleri, büyük ölçekte performans için gereklidir.
  • Bölge başına noktaları saymak veya toplamak için mekânsal birleştirmeleri GROUP BY ile birleştirin.
  • Tüm poligonların dışında kalan noktaları tespit etmek için LEFT JOIN kullanın.

Mekânsal birleştirmeler, harici bir GIS aracına gerek kalmadan doğrudan SQL içinde coğrafi analizin önünü açar.

Sıkça Sorulan Sorular

“Mekânsal Birleştirmeler ve İçerme” dersi ücretsiz mi?

Evet — “Mekânsal Birleştirmeler ve İçerme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.

“Mekânsal Birleştirmeler ve İçerme” dersinde ne öğreneceğim?

Hangi noktaların hangi alanlara düştüğünü belirleyin. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Mekânsal Birleştirmeler ve İçerme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Mekânsal Veri Türleri
  2. Mesafe ve En Yakın Komşular
  3. Mekânsal Birleştirmeler ve İçerme
  4. Mekânsal İndeksler (GiST)
← SQL Academy Sayfasına Dön