Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 3/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Konumuma en yakın 5 lokasyonu gösterme
#1
Merhaba arkadaşlar.

Bir sorunum var. sizin değerli fikirleriniz benim için çok önemli.

yazdığım uygulamada, en yakın 5 noktayı göstermem gerekiyor. bu konuda lokasyonların yer aldığı bir tablom var ve bu tabloda lat,long bilgileri yer almakta ve tabloda 100bin in üzerinde kayıt var. (mysql kullanmaktayım)

Mesafe hesaplayan bir fonksiyon yazdım.
CREATE FUNCTION mesafe_hesapla(lat1 FLOAT, lng1 FLOAT, lat2 FLOAT, lng2 FLOAT) RETURNS float
    DETERMINISTIC
BEGIN
        RETURN 6371 * 2 * ASIN(SQRT(
            POWER(SIN((lat1 - abs(lat2)) * pi()/180 / 2),
            2) + COS(lat1 * pi()/180 ) * COS(abs(lat2) *
            pi()/180) * POWER(SIN((lng1 - lng2) *
            pi()/180 / 2), 2) ));
    END;

ve bu fonksiyonu kullaan bir select i de bir SP nin içine yazdım.

CREATE PROCEDURE sp_yakin_istasyon_bul(
  i_long                varchar(50),
  i_lat                 varchar(50))
BEGIN
Select distinct(site_no) as site_no,Latitude,Longitude,mesafe_hesapla(Latitude, Longitude, i_lat, i_long) as mesafe 
from tb_sites_m limit 5 order by mesafe asc; 

End;

CALL ifisdb.sp_yakin_istasyon_bul('41,0415589','28,2461268'); şeklinde çalıştırıp, sonucu almak istediğimde sanırım 30 dk bekletmekte ve işin kötü tarafı net bir sonuç alamamış olmam.

bu konuda daha önce çalışma yapan ve fikir verebilecek olan var mı?..

Şimdiden teşekkürler..
WWW
Cevapla
#2
Merhaba,

5 kayıtta bu kadar beklemesi garip. Hesaplama da bu kadar uzun sürmemeli.

Spatial Data Type, Spatial index ve Spatial Search kullanmayı denediniz mi ? Aşağıdaki linkte bir örnek mevcut;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

İyi çalışmalar.
Cevapla
#3
(06-12-2017, Saat: 22:03)mcuyan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba arkadaşlar.

Bir sorunum var. sizin değerli fikirleriniz benim için çok önemli.

yazdığım uygulamada, en yakın 5 noktayı göstermem gerekiyor. bu konuda lokasyonların yer aldığı bir tablom var ve bu tabloda lat,long bilgileri yer almakta ve tabloda 100bin in üzerinde kayıt var. (mysql kullanmaktayım)

Mesafe hesaplayan bir fonksiyon yazdım.
CREATE FUNCTION mesafe_hesapla(lat1 FLOAT, lng1 FLOAT, lat2 FLOAT, lng2 FLOAT) RETURNS float
    DETERMINISTIC
BEGIN
        RETURN 6371 * 2 * ASIN(SQRT(
            POWER(SIN((lat1 - abs(lat2)) * pi()/180 / 2),
            2) + COS(lat1 * pi()/180 ) * COS(abs(lat2) *
            pi()/180) * POWER(SIN((lng1 - lng2) *
            pi()/180 / 2), 2) ));
    END;

ve bu fonksiyonu kullaan bir select i de bir SP nin içine yazdım.

CREATE PROCEDURE sp_yakin_istasyon_bul(
  i_long                varchar(50),
  i_lat                 varchar(50))
BEGIN
Select distinct(site_no) as site_no,Latitude,Longitude,mesafe_hesapla(Latitude, Longitude, i_lat, i_long) as mesafe 
from tb_sites_m limit 5 order by mesafe asc; 

End;

CALL ifisdb.sp_yakin_istasyon_bul('41,0415589','28,2461268'); şeklinde çalıştırıp, sonucu almak istediğimde sanırım 30 dk bekletmekte ve işin kötü tarafı net bir sonuç alamamış olmam.

bu konuda daha önce çalışma yapan ve fikir verebilecek olan var mı?..

Şimdiden teşekkürler..

Merhaba,
Delphi kitabımızın Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol (27.11.2017 tarihinde açıklamıştım) "Harita üzerinde iki nokta arasındaki mesafeyi hesaplama" konu başlığında örnek uygulamalı bir anlatım yer almaktadır. 
Örnekte, Delphi fonksiyonu ile iki koordinat arasındaki mesafe metre cinsinden hesaplanıp, haritada bu yol ve mesafe bilgisi gösterilmektedir.
SQL sorgulama ile değil de Delphi fonksiyonu ile yapmayı deneyin.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#4
Fesih bey bu konuda delphi ile yapmak daha da geciktirmez mi?.. Ayrıca x,y noktsına enyakın 5 noktayı delphi de bulmak için 100bin kayıd locale çekip, işlemek sanırım daha çok zaman alır..

bunu sp ile yapmak en hızlı çözüm ama kodlama da nerde hata yaptığımı bulamadım

Pardon sorunu buldum.

Meğer se bazı lat long datasında binlik ayırca "," kullanılmış.. "." olması gerkeiyormuş..

Neyse sql kousunda başka arkadaşlara yardımcı olur umarım..
WWW
Cevapla
#5
(06-12-2017, Saat: 23:00)mcuyan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlFesih bey bu konuda delphi ile yapmak daha da geciktirmez mi?.. Ayrıca x,y noktsına enyakın 5 noktayı delphi de bulmak için 100bin kayıd locale çekip, işlemek sanırım daha çok zaman alır..

bunu sp ile yapmak en hızlı çözüm ama kodlama da nerde hata yaptığımı bulamadım

Pardon sorunu buldum.

Meğer se bazı lat long datasında binlik ayırca "," kullanılmış.. "." olması gerkeiyormuş..

Neyse sql kousunda başka arkadaşlara yardımcı olur umarım..
100.000 kayıt çok büyük bir rakam, sunucu üzerinde işlem yaptırmanız da doğru bir yöntemdir.
Üzerinde çalıştığınız projenin detayını bilmiyorum. Oluşturmak istediğiniz metod, iGO ve benzeri uygulamalarda herhangi bir network'e bağlı olmadan lokalde yapılmasına rağmen,"Bulunduğum konuma en yakın ...yerler" araması milisaniyelerde karşımıza geliyor. Onlarda Thaddeus Vincenty tarafından ortaya konan formülasyonu (sizin paylaşmış olduğunuz fonksiyon) arka planda dinamik olarak (veya farklı bir yöntemle=pivot tarzı) gerçekleştiriyorlar.
Anlattıklarımdan StoredProcedure/Sunucu performansının, Lokal cihaz performansından daha kötü olduğu kanısını çıkarmayın.
İyi donanıma sahip bir sunucu, iyi bir veri tabanı ve doğru yöntem (StoredProcedure, function vb.) ile milyarlarca veriyi saniyeler içerisinde modelleyebiliyor veya raporlayabiliyoruz.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#6
tablo yapısını paylaşmamışsınız, hangi field'lar var hangileri index'li göremediğimiz için bir şey söylemek zorlaşıyor.
ilk aklıma gelen yöntem bu fonksiyonu çağırmadan önce farklı bir kriter ile sorguyu filtrelemek. Mesela tabloda ilçe kodu tutuluyor ise önce mevcut konumun ilçe kodu alınır, bu ilçe ve bu ilçeye komşu ilçeler üzerinden arama yapılır. Böylece zaten yakın olması imkansız olan konumların mevcut konuma olan uzaklıklarını hesaplamak zorunda kalmazsınız. Tablonuzun yapısına, mevcut field'lara ve index'lere bir göz atın. Yapabiliyorsanız yeni field'lar ekleyip index'lemeyi düşünün derim.
Cevapla
#7
Sorunun ilgili formülde ya da veritabanında olduğunu düşünmüyorum. Sorun, ilgili formülün bir function olarak tasarlanmasında. Bir select içinde fonksiyon çağrımı her zaman yavaştır. Çünkü, her bir kayıt için ilgili fonksiyona bir kere müracaat ediliyor. İlgili formülü, select içinde gömülü yazarsanız sonucun çok daha hızlı olacağını gözlemlemeniz gerekir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
(07-12-2017, Saat: 10:13)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlSorunun ilgili formülde ya da veritabanında olduğunu düşünmüyorum. Sorun, ilgili formülün bir function olarak tasarlanmasında. Bir select içinde fonksiyon çağrımı her zaman yavaştır. Çünkü, her bir kayıt için ilgili fonksiyona bir kere müracaat ediliyor. İlgili formülü, select içinde gömülü yazarsanız sonucun çok daha hızlı olacağını gözlemlemeniz gerekir.

Arkadaşın zaten her kaydı hesaplaması gerekmiyor mu? Başka türlü nasıl en yakın olanlar listelenebilir?
Cevapla
#9
(07-12-2017, Saat: 12:50)sddk Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(07-12-2017, Saat: 10:13)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlSorunun ilgili formülde ya da veritabanında olduğunu düşünmüyorum. Sorun, ilgili formülün bir function olarak tasarlanmasında. Bir select içinde fonksiyon çağrımı her zaman yavaştır. Çünkü, her bir kayıt için ilgili fonksiyona bir kere müracaat ediliyor. İlgili formülü, select içinde gömülü yazarsanız sonucun çok daha hızlı olacağını gözlemlemeniz gerekir.

Arkadaşın zaten her kaydı hesaplaması gerekmiyor mu? Başka türlü nasıl en yakın olanlar listelenebilir?

Elbette, her kayıt için hesaplama yapması gerekiyor. Benim demek istediğim, fonksiyon çağrımı yavaş olur.!
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#10
(07-12-2017, Saat: 13:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(07-12-2017, Saat: 12:50)sddk Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlArkadaşın zaten her kaydı hesaplaması gerekmiyor mu? Başka türlü nasıl en yakın olanlar listelenebilir?

Elbette, her kayıt için hesaplama yapması gerekiyor. Benim demek istediğim, fonksiyon çağrımı yavaş olur.!

açıklama için teşekkür ederim, şimdi anladım demek istediğinizi.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi cxGrid'e İlişkili Tabloda Veri Gösterme? Halil Han Badem 5 1.261 11-08-2017, Saat: 02:19
Son Yorum: mcuyan
  Farklı tabloları bir Grid'te gösterme Mericx 6 642 04-06-2017, Saat: 15:25
Son Yorum: yhackup
  Silinmiş Kayıtları Gösterme Mericx 17 1.591 28-02-2017, Saat: 09:06
Son Yorum: AhmetBi



Konuyu Okuyanlar: 1 Ziyaretçi