Yorumları: 1.381
Konuları: 75
Kayıt Tarihi: 20-03-2017
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.3
- Delphi 10.2
- Delphi 7
- Lazarus / FPC
Rep Puanı: 3.849 Uzman
06-12-2017, Saat: 22:03
(Son Düzenleme: 06-12-2017, Saat: 22:06, Düzenleyen: TescilsizUzman.)
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..
Yorumları: 227
Konuları: 19
Kayıt Tarihi: 08-11-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 773 Acemi
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.
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
06-12-2017, Saat: 22:23
(Son Düzenleme: 06-12-2017, Saat: 22:24, Düzenleyen: TescilsizUzman.)
(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.
Yorumları: 1.381
Konuları: 75
Kayıt Tarihi: 20-03-2017
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.3
- Delphi 10.2
- Delphi 7
- Lazarus / FPC
Rep Puanı: 3.849 Uzman
06-12-2017, Saat: 23:00
(Son Düzenleme: 06-12-2017, Saat: 23:08, Düzenleyen: mcuyan.)
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..
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
(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.
Yorumları: 52
Konuları: 2
Kayıt Tarihi: 06-11-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 154 Başlangıç
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.
Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868 Üstad
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...
Yorumları: 52
Konuları: 2
Kayıt Tarihi: 06-11-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 154 Başlangıç
(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?
Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868 Üstad
(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...
Yorumları: 52
Konuları: 2
Kayıt Tarihi: 06-11-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 154 Başlangıç
(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.
|