Merhabalar arkadaşlar, bu yazımda sizlerle Laravel kütüphanesinde yapılan model sorgularında uzaklık hesaplayarak sonuç getirme api’si yazacağız.
Öncelikle Model in bulunduğu tabloya gerekli konumu hesaplayacağımız latitude ve longitude sütunlarını ekleyeceğiz. Bu sütunları ister database den elle ister migration dan kod ile ekleyebiliriz. Migration örneği aşağıdadır:
1 2 | $table->string("latitude"); $table->string("longitude"); |
Sonrasında
1 | php artisan migrate |
yaparak tablonuza eklmiş olursunuz. Tablodaki verileri google’dan veya başka bir map servislerinde alacağınız ‘latitude’ ve ‘longitude’ örnekleri ile doldurmanız gerekli. Hepsinin farklı olması bizim için önemli ki aradaki farkları rahatça görebilelim. Örnek olarak ‘latitude’ = ‘40.990544’ ‘longitude’ = ‘29.029136’ bu Kadıköy Boğa heykelinin konumu.
Controller kısmında ise size örnek bir User modelinde arama yaptığım bir fonksiyon ile örnek göstereceğim.
1 2 3 4 5 6 7 | public function index(){ $logged_user = auth()->user(); $latitude = $logged_user->latitude; $longitude = $logged_user->longitude; } |
Başlangıç olarak authentication dan giriş yapmış üyenin konum bilgilerini alıyoruz. Ve yapacağımız sorguda bu kişiye yakından uzağa doğru olan kişileri listeleyeceğiz. Kodun devamı:
1 2 3 4 5 6 7 | $user_list = User::whereNotIn('id', [$logged_user->id]) ->whereNotNull('latitude') ->whereNotNull('longitude') ->select("*", User::raw("6371 * acos(cos(radians(" . $latitude . ")) * cos(radians(latitude)) * cos(radians(longitude) - radians(" . $longitude . ")) + sin(radians(" .$latitude. ")) * sin(radians(latitude))) AS distance")) ->orderBy('distance', 'asc')->get(); |
Bu sorguda giriş yapmış kişiyi ve konum bilgisi olmayan kişileri dışarıda tutarak giriş yapmış kullanıcının konum bilgileri ile ona yakından uzağa doğru tüm kişileri getirtiyoruz.Ve gelen kişi bilgilerinde incelerseniz ‘distance’ adı altında aradaki mesafeyi km cinsinden göreceksinizdir.Ek bilgi olarak sql deki ‘6371’ sayısı km cinsinden hesaplamak için geçerlidir isterseniz bu sayıyı ‘3959’ yaparak mil cinsinden de hesaplayabilirsiniz. Ayrıca bu sorguya ‘->orderBy’ dan önce ekleyeceğimiz bir kod ile isterseniz belirli bir km yarıçapı arasındaki kişileri de getirtebiliriz onun ile birlikte sorgu bloğumuz şu şekilde oluyor:
1 2 3 4 5 6 7 8 | $user_list = User::whereNotIn('id', [$logged_user->id]) ->whereNotNull('latitude') ->whereNotNull('longitude') ->select("*", User::raw("6371 * acos(cos(radians(" . $latitude . ")) * cos(radians(latitude)) * cos(radians(longitude) - radians(" . $longitude . ")) + sin(radians(" .$latitude. ")) * sin(radians(latitude))) AS distance")) ->having('distance', '<', 50) ->orderBy('distance', 'asc')->get(); |
Bu örnekte ise 50 km yarıçapı içerisindeki kişileri getirtiyoruz.
Sonuç olarak Controllerimizin son görüntüsü bu şekilde olmalıdır:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public function index(){ $logged_user = auth()->user(); $latitude = $logged_user->latitude; $longitude = $logged_user->longitude; $user_list = User::whereNotIn('id', [$logged_user->id]) ->whereNotNull('latitude') ->whereNotNull('longitude') ->select("*", User::raw("6371 * acos(cos(radians(" . $latitude . ")) * cos(radians(latitude)) * cos(radians(longitude) - radians(" . $longitude . ")) + sin(radians(" .$latitude. ")) * sin(radians(latitude))) AS distance")) ->having('distance', '<', 50) ->orderBy('distance', 'asc')->get(); return $user_list; } |
Umarım faydalı bir yazı olmuştur. Başka yazılarda görüşmek üzere.