SQL ile mesafe hesaplama function

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

Ortalama Büyüklük Yıllara Göre


Ortalama Deprem Sayısı Yıllara Göre


Ortalama Mesafe Yıllara Göre


Yıllara Göre Toplam Deprem Sayısı
Doğruluk için teyit
Doğruluk için teyit


Kaynak resimler ve fonksiyonlar yandex disk bağlantısından indirebilirsiniz.




Yorumları görmek veya yorum eklemek için oturum açın

Ömer O. adlı yazarın diğer makaleleri

Diğer görüntülenenler