Yakınlık Arama

3 Cevap php

Nasıl bir uygulama yakınlık arama yapmaz? Örneğin, bir posta kodu bir kullanıcı türleri, daha sonra uygulama yakınlığı tarafından sipariş 20 kilometre mesafedeki tüm işletmeler listeler.

PHP ve MySQL gibi bir şey inşa etmek istiyorum. Bu yaklaşım doğru mudur?

  1. Ben ilgileniyorum ve benim veritabanında depolamak yerleri için adresleri alın
  2. Google'ın coğrafi kodlama hizmeti ile tüm adresleri Geocode
  3. Yakınlık arama ve sıralama yapmak Haversine formülü içeren bir veritabanı sorgu yazmak

Tamam mı? 3. adımda, her sorgu için yakınlık hesaplamak için gidiyorum. Her iş ve birkaç referans yerleri arasındaki mesafeyi listeleyen bir YAKINLIK tablo var daha mı iyidir?

3 Cevap

Maddeye hız için yeterli kayıtlar varsa, burada vaktinden endeksi onlara bir yol.

Bir tarafta 20 mil kutuları bir ızgara tanımlayın. Her mağazanın kaydı ile bin numarasını saklayın. Arama zamanda, arama noktasından 20 kilometre yarıçapı kesiştiği tüm kutuları numaralarını hesaplamak. Daha sonra bu kutuları herhangi tüm mağazaları almak ve daha önce olduğu gibi devam edin.

Biz puan binlerce yapmak için kullanabilirsiniz. Eğer Latitude ve Boylam sütun üzerinde bir dizin var SQL bu yapıyorsanız önemlidir. Biz kayma dizinleri ile SQL 2008 yılında bu yapıyor çalıştı ama biz gerçekten beklenen performans artışı görmedim. Eğer ZIP merkezini veya posta kodu bir çokgen gösterimi kullanmak için gidiyoruz eğer düşünmek gerek bir ZIP belirli bir mesafe içinde hesaplamak istiyorsanız rağmen.

Haversine forumla başlamak için iyi bir yerdir.

Biz anında mesafe hesaplama performans sorunları, biz vaktinden noktaları bilmek ve kayıtların milyonlarca orada olacak bazı uygulamalar için vaktinden bunu hesaplamak yok olmadı.

SELECT
    	[DistanceRadius]=
    	69.09 *
    	DEGREES(
    	  ACOS(
    		SIN( RADIANS(latitude) )*SIN( RADIANS(@ziplat) ) 
    	   +
    		COS( RADIANS(latitude) )*COS( RADIANS(@ziplat) ) 
    	   *
    		COS( RADIANS(longitude - (@ziplon)) )
    	  )
    	)
    	,*
    	FROM
    		table

    ) sub
WHERE
    sub.DistanceRadius < @radius

Biz yaklaşık 1200 yerleri için bunu. Size uygulamaya bağlı olarak, PHP yerine SQL depolamak için daha iyi olabilir, ancak ben sadece anında Haversine formülü kullanabilirsiniz. (Senin milage değişebilir yüzden bizim uygulama. Net olduğunu).

Gerçekten biz onu hayata şekilde bizim en büyük dezavantajı, (yakın zamana kadar) her hesaplama (ben yavaş derken, ben gerçekten olmayan anlık bir ikinci ya kadar sürdü demek acı yavaş veri katmanı üzerinde hesaplanacak zorunda olduğunu ), ama bu verilen posta koduna göre Tüm 1200 yerleri için mesafe hesaplamak zorunda olduğu gerçeği nedeniyle oldu.

Eğer 20 kilometre mesafedeki tüm adreste arıyorsanız seçtiğiniz rota bağlı olarak, sayı mesafe hesaplamaları hızlandırmak yolu vardır, boylam ve enlem bakıyor ve önceden belirlenmiş bir aralığın dışında olanları kaldırarak (örneğin var boylam aralığı tüm adresleri 20 kilometre uzaklıkta olduğu için düşmek zorunda hesaplayabilirsiniz.) Bu ihtiyaç olması halinde sorgulamak hızlandırabilir.

Biz aslında bizim veritabanındaki tüm olası kombinasyonlarını saklamak baktı. Bu, büyük bir veri deposu olabilir gibi gerçekte geliyor, ama şeylerin büyük kapsamına gerçekten değil. Indeksleri ile oldukça hızlı olabilir, ve biz C # denklemi vardı, ve o bize tüm hesaplamaları yapmak için gerekli bilgileri önbelleğe için izin çünkü, biz buna karşı karar algoritma optimizasyonu vb hakkında endişelenmenize gerek yok iş katmanlı. Ya bu sadece sizin tercihiniz ne meselesi, sadece iyi çalışır.