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.
[Ars=sql]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;[/ars]

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

[Ars=sql]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;
[/ars]

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..
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;

https://tr.scribd.com/presentation/25693...with-MySQL

İyi çalışmalar.
Cevapla
#3
(06-12-2017, Saat: 22:03)mcuyan Adlı Kullanıcıdan Alıntı: 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.
[Ars=sql]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;[/ars]

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

[Ars=sql]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;
[/ars]

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 TMapView bölümünde (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.
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..
Cevapla
#5
(06-12-2017, Saat: 23:00)mcuyan Adlı Kullanıcıdan Alıntı: 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..
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.
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ı: 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.

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ı:
(07-12-2017, Saat: 10:13)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: 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.

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ı:
(07-12-2017, Saat: 12:50)sddk Adlı Kullanıcıdan Alıntı: 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.!

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


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  delphi7 de timer sayma suresini labelde gosterme sadikacar60 2 507 11-04-2023, Saat: 23:55
Son Yorum: delphi.developer
  Arapça Yazı Gösterme baloglurecep 9 4.511 28-02-2023, Saat: 16:31
Son Yorum: themerdogan
  Fast Report'da HTML Gösterme Hk. pro_imaj 4 961 10-10-2022, Saat: 11:24
Son Yorum: pro_imaj
  Fast Report'ta checkbox "+" basarak alt detayları gösterme Anarchosa 1 848 27-08-2022, Saat: 11:00
Son Yorum: glagher
  Hostingdeki resmi imagede gösterme gonulali 8 2.192 17-04-2021, Saat: 00:03
Son Yorum: Syntax



Konuyu Okuyanlar: 1 Ziyaretçi