MongoDB’de Lokasyon Bazlı İşlemler — Geospatial (Spring Boot)
Merhabalar, bugün anlatacağım konu MongoDB’de nasıl lokasyon bazlı işlemler yapabileceğinizden bahsetmek olacak. İlk önce Geospatil nedir ondan bahsedelim.
Geospatial
Yeryüzünde herhangi bir yerin vektörel uzayda bir biçimde (line,point ve shape) şeklinde tutulmasıdır. Yani herhangi bir konumu Geospatil data olarak tutabilirsiniz.
Gelişen teknolojiler ile lokasyon bazlı işlemler günümüzün vazgeçilmez işlerinden birisi olmaya başladı. Ve gelişen teknolojiler bünyesinde bu tür çözümleri default olarak barındırmaya başladı. Bugün MongoDB’de de bulunan Geospatil işlemlerini yapmaya çalışacağız. Ondan sonra bunu Spring Boot ve JPA ile yapmaya çalışacağız.
Amaç;
- Bir dükkanımız olacak ve bu dükkanın lokasyonunu MongoDB’de Point olarak tutacağız. Point derker x ve y parametreleri olarak Latitude ve Longitude değerlerini vereceğiz.
- Herhangi bir kullanıcının lokasyonunu (Latitude ve Longitude) olarak alıp dükkanımızın kullanıcının belirttiği mesafenin içinde mi değil mi diye kontrol edeceğiz.
Not: MongoDB işlemlerimi ben ROBO 3T ile yapıyorum
Başlayalım :)
Bir Berber oluşturalım ve bu berberin location adlı bir sub dökümanı olsun.
Location’un altında Geospatial data bulunmakta. Ve bu datanın tipi Point. Bu işlemi yaptıktan sonra MongoDB’ye Location datamı 2 boyutlu düzlemde bir lokasyon olduğunu söylemem gerekiyor. MongoDB’de şu queryi çalıştırıyorum;
Burada şunu yapıyorum kafa karışıklığına engel olmak için anlatayım. Users collectionundaki her dökümanının içindeki “location” değerinin içindeki “location” değeri 2 boyutlu düzlemde bir lokasyon. Sub döküman olduğunu için bu şekilde yazmam gerekti.
Belirttiğimiz nokta şöyle bir lokasyona tekabül ediyor;
Şimdi hemen yanındaki “Vatan Sürücü Kursu” nda bir kullanıcının bulunduğunu düşünelim. Ve bak sana yakın olan lokasyon bu yani aradığın dükkan bu şeklinde bir cevap dönelim.
Bunun için gidip Google Maps’ten “Vatan Sürücü Kursu” ’nun lokasyonunu (latitude ve longitude) olarak alalım. Bilgileri aldığımızda lokasyon şu imiş;
Latitude: 40.9996614
Longitude: 28.931425
Bu bilgileri aldığımıza göre MongoDB’ye querymizi atalım artık :)
Bu queryi atınca cevap olarak bu kadar dökümanın olduğu;
Collectionda şu oldu;
Hadi gidelim Zeytinburnu’na ve oradaki bir lokasyon ilede deneme yapalım bakalım bulabilecek mi? :)
Zeytinburnu lokasyonu;
Latitude:40.9909053
Longitude: 28.896494
Evet bulamadı o zaman “maxDistance” değerini 10000 yapalım.
Not: Bir projemin içinde bulunan dökümanların lokasyonları birbirine yakın olduğu için 3 adet buldu.
Evet yine buldu :)
Şimdi Gelelim bunu Spring Boot projesinde nasıl yapabileceğimize :)
Başlayalım;
Bir adet Users DAO oluşturuyorum
Ve bir adet Location DAO oluşturuyorum
burada önemli olan nokta şu Geospatial data belirtecekseniz GeoJsonPoint ve diğer Geospatial data tiplerinden birini yazmanız lazım.
Bunları yaptıktan sonra yukarıda yaptığımız gibi bir mesafe ve lokasyon isteğinde bulunup bize ne döneceğine bakalım servisin. Ama bundan önce JPA’da queryi yazalım
Parametre olarak “Pageable” , Distance ve bir adet Point alıyor. Bir adet request atıyorum.
Curl komutu;
curl -X GET “http://localhost:8080/berbers?distance=1&latitude=40.9996614&longitude=28.931425&page=0" -H “accept: */*”
Biraz DTO tuhaf olabilir ama “address” değerinden gelen cevabı anlayabilirsiniz.
Evet elimden geldiğince Geospatial’i anlatmaya çalıştım. Bana kolaylık sağladı diyebilirim.