Evet, daha iyi bir yol var. Bir uzamsal dizin kullanmanız gerekir . Bu dizinler, geometrileri çok hızlı bir şekilde filtrelemek için geometrilerle ilgili meta verileri düzenleyerek, açıkladığınız hesaplamalardan kaçınarak çok fazla CPU döngüsünden tasarruf sağlar. Tüm büyük ilişkisel veritabanları bir uzamsal geometri türü ve onlarla birlikte gitmek için dizinler sağladığından, birini kendiniz uygulamaktan rahatsız olmamalısınız.
Bakmak istediğiniz şey "mesafe içinde" sorgulardır (diğer bazı geometrilerin belirli bir mesafesindeki geometriler için sorgular). Bunlar çok standart ve çözülmüş bir sorundur ve yukarıdaki tüm veritabanlarında (ve birkaçında yerleşik olarak) mümkündür:
- PostGIS:
ST_DWithin
- SQL Server:
STDistance
(Bu işlevin 3D coğrafya sürümünde dizin kullanımının desteklendiği açık değildir)
- Oracle:
SDO_WITHIN_DISTANCE
(Bu açıkça dizin kullanımını tetikleyeceğini söylemez. Sorgu planını iki kez kontrol ederim. Dizini kullanmak için bir uygulamanız gerekebilir SDO_FILTER
.)
- MySQL: Bunu hala anlıyorum.
Dizin kullanımını tetiklemek için geçici çözüm
Sistemin bu sorgularla uzamsal dizini kullanmasında sorun yaşadığınız en kötü durumda, ek bir filtre ekleyebilirsiniz. Arama noktanızda ortalanmış 2 * (arama mesafesi) kenarları olan bir kare sınırlayıcı kutu oluşturacak ve gerçek mesafeyi kontrol etmeden önce tablo geometrilerinin sınırlama kutularını bununla karşılaştıracaksınız . ST_DWithin
Yukarıda PostGIS 'in dahili olarak yaptığı şey budur .
CBS'de mesafe
Mekansal indeksler harika ve probleminize kesinlikle doğru çözüm olsa da, mesafe hesaplaması mantıksal olarak karmaşık olabilir. Özellikle, verilerinizin hangi projeksiyonda (temel olarak koordinat sistemi için tüm parametreler) depolandığı konusunda endişelenmeniz gerekir . Çoğu 2D projeksiyon (çeşitli enlem / uzun projeksiyonlar gibi açısal koordinat sistemleri dışındaki şeyler) uzunluğu önemli ölçüde deforme eder. Örneğin, Web Mercator projeksiyonu (Google, Bing ve diğer tüm büyük temel harita sağlayıcıları tarafından kullanılan projektör) , konum ekvatordan uzaklaştıkça alanları ve mesafeleri giderek genişletir . Resmi olarak CBS'de eğitim almadığım için yanılıyor olabilirim, ancak 2B projeksiyonlar için gördüğüm en iyi şey, bir mesafeden doğru mesafeler vaat eden bazı spesifik olanlartüm dünyada tek, sabit bir nokta . (Hayır, her sorgu için farklı bir projeksiyon kullanmak pratik değildir; dizinlerinizi işe yaramaz hale getirir.)
Sonuç olarak, matematiğinizin doğru olduğundan emin olmanız gerekir. Bunu bir geliştirme perspektifinden yapmanın en basit yolu, açısal projeksiyonlar kullanmak (bunlar genellikle "coğrafi" olarak adlandırılır) ve bir küremsi model kullanarak matematik yapmayı destekleyen işlevleri kullanmaktır, ancak bu hesaplamalar 2B meslektaşlarından biraz daha pahalıdır. ve bazı DB'ler bunları dizine eklemeyi desteklemeyebilir. Ancak, bunları kullanarak kabul edilebilir bir performans elde edebiliyorsanız, muhtemelen bu yol. Diğer bir yaygın seçenek ise, verileriniz dünyanın belirli bir bölgesi ile sınırlıysa hem mesafeleri hem de alanları düzeltmeye oldukça yaklaştıran bölgesel projeksiyonlardır (UTM bölgeleri gibi). Uygulamanız için en iyi olan şey özel gereksinimlerinize bağlı olacaktır,
Bu, yerleşik uzamsal dizinler kullanmasanız bile geçerlidir. Verileriniz, şu anda hangi teknolojiyi veya tekniği kullandığınızdan veya gelecekte kullanmanızdan bağımsız olarak bazı projeksiyonlara sahiptir ve şu anda yaptığınız sorguları ve hesaplamaları zaten etkilemektedir.