0Pricing
SQL Academy · Ders

Mesafe ve En Yakın Komşular

Yakınınızdakileri bulun.

Mesafe ve En Yakın Komşular, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 2. 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 Mesafe Nedir?

Coğrafi veritabanlarında mesafe, iki coğrafi konum arasındaki ölçülen ayrımdır. PostGIS; noktalar, çizgiler, çokgenler ve diğer geometri türleri arasındaki mesafeleri hesaplamak için güçlü işlevler sağlar.

Mesafe sorgularını anlamak, Benim için en yakın restoran hangisi? veya Depomuza 5 km mesafedeki müşteriler hangileri? gibi soruları yanıtlamanızı sağlar.

ST_Distance İşlevi

ST_Distance(geom_a, geom_b), iki geometri nesnesi arasındaki en kısa mesafeyi döndürür. Varsayılan olarak, yalın geometri türleri kullanıldığında sonuç, koordinat referans sistemindeki birimlerle aynıdır (EPSG:4326 için genellikle derece).

Metre cinsinden anlamlı sonuçlar elde etmek için coğrafya türlerini kullanmalı veya verilerinizi yeniden projekte etmelisiniz.

SELECT ST_Distance(
  ST_MakePoint(28.9784, 41.0082)::geography,
  ST_MakePoint(29.0100, 41.0200)::geography
) AS distance_meters;

Örnek Tablo Oluşturma

Coğrafi koordinatlara sahip basit bir yerler tablosu oluşturalım. Tüm mesafe hesaplamalarının otomatik olarak metre cinsinden sonuçlanması için coğrafya türünü kullanacağız; elle projeksiyon yapmamız gerekmeyecek.

Bu tabloda, her birinin adı ve nokta olarak depolanan konumu bulunan bir şehirdeki kafeler yer alacak.

CREATE TABLE cafes (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  location GEOGRAPHY(Point, 4326)
);

INSERT INTO cafes (name, location) VALUES
  ('Cafe Alpha',   ST_MakePoint(28.9784, 41.0082)::geography),
  ('Cafe Beta',    ST_MakePoint(28.9900, 41.0150)::geography),
  ('Cafe Gamma',   ST_MakePoint(29.0100, 41.0200)::geography),
  ('Cafe Delta',   ST_MakePoint(28.9650, 40.9980)::geography),
  ('Cafe Epsilon', ST_MakePoint(29.0250, 41.0350)::geography);

Sabit Bir Noktaya Mesafe Bulma

Konum verileriniz olduğunda, her satırın bir referans noktasına mesafesini hesaplayabilirsiniz. Burada her kafenin (28.9800, 41.0100) koordinatlarında duran bir kullanıcıya ne kadar uzaklıkta olduğunu hesaplıyoruz.

Metre cinsinden sonuç almamızın nedeni coğrafya türünü kullanmamızdır.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY distance_m;

En Yakın Komşuyu Bulma

Belirli bir noktaya olan tek en yakın konumu bulmak için mesafeye göre sıralayın ve LIMIT 1 ile yalnızca bir satır alın. Bu, klasik en yakın komşu sorgusudur.

Bu yaklaşım, konum duyarlı uygulamalarda son derece yaygındır: en yakın mağazayı, doktoru veya toplu taşıma durağını bulmak için kullanılır.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 1;

En Yakın Komşu İçin <-> İşleci

PostGIS, indeks kullanan <-> işleciyi (KNN — K En Yakın Komşu) sağlar. ST_Distance işleçinin ORDER BY yan tümcesindeki kullanımından farklı olarak <->, her satırı taramaktan kaçınmak için GiST mekânsal indeksini kullanabilir.

En yakın komşuları verimli biçimde bulmanız gerektiğinde ORDER BY içinde her zaman <-> işleçini tercih edin. Bunu desteklemek için aşağıdaki gibi bir indeks oluşturun:

CREATE INDEX ON cafes USING GIST (location);

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 5;

Mesafeye Göre Filtreleme (ST_DWithin)

ST_DWithin(geom_a, geom_b, distance), iki geometrinin birbirine belirtilen mesafe içinde olması durumunda TRUE döndürür. Coğrafya türlerinde mesafe metre cinsindendir.

Bu yöntem, WHERE yan tümcesinde ST_Distance(...) < radius kullanmaktan daha verimlidir; çünkü ST_DWithin indeks kullanır ve koşul sağlanır sağlanmaz işlemi durdurur.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
WHERE ST_DWithin(
  location,
  ST_MakePoint(28.9800, 41.0100)::geography,
  2000
)
ORDER BY distance_m;

Yarıçap Sınırıyla En Yakın N Sonuç

Yaygın bir üretim yaklaşımı, ön filtre olarak ST_DWithin işlevini <-> sıralamasıyla birleştirir. ST_DWithin denetimi, uzaktaki satırları hızla elemek için mekânsal indeksi kullanır; ardından kalan adaylar kesin mesafeye göre sıralanır.

Bu sayede en fazla belirli bir yarıçap içindeki en yakın N konumu çok verimli biçimde bulabilirsiniz.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
WHERE ST_DWithin(
  location,
  ST_MakePoint(28.9800, 41.0100)::geography,
  5000
)
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 3;

İki Tablo Arasındaki Mesafe (Çapraz Mesafe)

İki farklı tablodaki satırlar arasındaki mesafeleri, birleştirmeyi ST_Distance ile birlikte kullanarak hesaplayabilirsiniz. Bu, örneğin her müşteriyi en yakın depoyla veya her olayı en yakın hastaneyle eşleştirmek için kullanışlıdır.

Aşağıda, satır başına alt sorgular için güçlü bir PostgreSQL deseni olan yanal birleştirmeyi kullanarak users tablosundaki her kullanıcı için en yakın kafeyi buluyoruz.

SELECT
  u.username,
  c.name AS nearest_cafe,
  ROUND(ST_Distance(u.location, c.location)::NUMERIC) AS distance_m
FROM (
  VALUES
    ('alice', ST_MakePoint(28.9810, 41.0095)::geography),
    ('bob',   ST_MakePoint(29.0200, 41.0300)::geography)
) AS u(username, location)
CROSS JOIN LATERAL (
  SELECT name, location
  FROM cafes
  ORDER BY location <-> u.location
  LIMIT 1
) c;

Mesafe Çıktısını Biçimlendirme

Ham metre cinsinden mesafeleri okumak zor olabilir. CASE ifadelerini ve dize biçimlendirmeyi kullanarak bunları kilometre cinsinden biçimlendirebilir veya kullanıcı dostu etiketler ekleyebilirsiniz. Aşağıda, kısa mesafeleri metre, daha uzun mesafeleri ise kilometre cinsinden gösteren bir sorgu yer alıyor.

SELECT
  name,
  CASE
    WHEN ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography) < 1000
    THEN ROUND(ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography)::NUMERIC)
         || ' m'
    ELSE ROUND((ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography) / 1000.0)::NUMERIC, 2)
         || ' km'
  END AS formatted_distance
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography;

Mesafeye Göre Sıra Atama

RANK() ve ROW_NUMBER() gibi pencere işlevleri, mesafe sorgularıyla mükemmel uyum sağlar. Her konuma bir kullanıcıya göre yakınlık sırası atayabilirsiniz; bu, yakınlığa göre sıralanmış öneri listeleri veya arama sonuçları oluşturmak için kullanışlıdır.

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m,
  ROW_NUMBER() OVER (
    ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
  ) AS proximity_rank
FROM cafes;

Bilgi Kontrolü

PostGIS'te mesafe sorguları ve en yakın komşu aramaları hakkındaki anlayışınızı sınayın.

Ders Özeti

Bu derste PostGIS'te mekânsal mesafeler ve en yakın komşu sorgularıyla çalışmayı öğrendiniz:

  • ST_Distance, iki geometri arasındaki kesin mesafeyi hesaplar; metreyi otomatik olarak elde etmek için coğrafya türünü kullanın.
  • ST_DWithin, mekânsal indeksi kullanarak yarıçap içindeki satırları verimli biçimde filtreler — WHERE yan tümcelerinde ST_Distance < radius yerine bunu tercih edin.
  • ORDER BY içindeki <-> işleci (KNN) indeks kullanır ve en yakın N komşuyu almanın en hızlı yoludur.
  • En verimli yarıçap içindeki en yakın N sorguları için ST_DWithin işlevini ön filtre olarak <-> sıralamasıyla birleştirin.
  • CROSS JOIN LATERAL, başka bir tablodaki en yakın eşleşmeyi satır bazında bulmanızı sağlar.
  • ROW_NUMBER() gibi pencere işlevleri, mesafeye göre sıralanmış sonuçlarınıza yakınlık sıraları atayabilir.

Bu yaklaşımlar, gerçek dünya uygulamalarındaki konum duyarlı özelliklerin temelini oluşturur.

Sıkça Sorulan Sorular

“Mesafe ve En Yakın Komşular” dersi ücretsiz mi?

Evet — “Mesafe ve En Yakın Komşular” 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.

“Mesafe ve En Yakın Komşular” dersinde ne öğreneceğim?

Yakınınızdakileri bulun. 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 2. dersidir.

“Mesafe ve En Yakın Komşular” 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