SQL ile mesafe hesaplama function
Merhaba, Bazen verileri anlamlı bir şekilde sunmak için çeşitli fonksiyonlara ihtiyaç duyuyoruz.
Daha önce son 20 yılın verilerini bu yazı'da almıştık. Deprem ilerleyiş chrome eklentisini ile animasyon olarak getirmiştik. Erzincan iliçde Kanada/ABD'li şirketin ihmali sonucu meydana gelen kazadan sonra konuma göre bir raporlama ihtiyacı için bir fonksiyon yazdım.
Bu fonksiyon ile 2 farklı konumun arasında mesafeyi km olarak ölçmeniz mümkün.
Fonksiyon bu :
create FUNCTION [dbo].[mesafeHesaplaFn](@oncekiEnlem float, @oncekiBoylam float, @enlem float, @boylam float)
RETURNS numeric(10,6)
AS
BEGIN
DECLARE @yaricap float = 6370;
DECLARE @enlemFark float = radians(@enlem) - radians(@oncekiEnlem);
DECLARE @boylamFark float = radians(@boylam) - radians(@oncekiBoylam);
DECLARE @a float, @c float, @mesafe float;
--EXCEL:=ACOS(SİN(ENLEM1*Pİ()/180)*SİN(ENLEM2*Pİ()/180)+COS(ENLEM1*Pİ()/180)*COS(ENLEM2*Pİ()/180)*COS(BOYLAM2*Pİ()/180-BOYLAM1*Pİ()/180))*6370 -- %1 FARKLI
SET @a = sin(@enlemFark / 2) * sin(@enlemFark / 2) + cos(radians(@oncekiEnlem)) * cos(radians(@enlem)) * sin(@boylamFark / 2) * sin(@boylamFark / 2);
SET @c = 2 * ATN2(sqrt(@a), sqrt(1 - @a));
SET @mesafe = @yaricap * @c;
RETURN (case when @oncekiEnlem>0 and @enlem>0 then @mesafe else 0 end)
END;
Not: Excel'de kullanacaksanız excel formülünüde açıklama olarak kod içerisine yazdım.
Kullanım şekli: 2 konum arasındaki mesafeyi ölçer
select
dbo.mesafeHesaplaFn('39.4513975', '38.54045', '39.4297','38.3277')
Depremler tablosu için Örnek Rapor
Erzincan İliç madeninde (50km mesafedeki) son 20 yıl içerisinde olan depremlerin Yıl bazında sayısı, Ortalama büyüklüğü ve ortalama mesafesi
SELECT
DATEPART(YEAR, zaman) AS 'Yıl'
--DATEPART(month,zaman) as 'Ay'
,COUNT(*) AS 'Deprem Sayısı'
,ROUND(AVG([buyukluk]), 2) AS 'Büyüklük (Ort.)'
,AVG(dbo.mesafeHesaplaFn('39.45139751165699', '38.540454242647854', t.enlem, t.boylam)) AS 'Mesafe (Ort.)'
FROM depremler t
WHERE dbo.mesafeHesaplaFn('39.45139751165699', '38.540454242647854', t.enlem, t.boylam) <= 50
GROUP BY DATEPART(YEAR, zaman)
ORDER BY 1 DESC
Bunu sadece yakınınızdaki depremler için değil tabi. İnşallah bunun için hiç kullanmazsınız. Yazdığınız bir uygulamada yakınınızdaki ilanlar, kişiler, şirketler vb. amaçla kullanabilirsiniz.
Diğer Örnekler
LinkedIn tarafından öneriliyor
Kaynak resimler ve fonksiyonlar yandex disk bağlantısından indirebilirsiniz.