Atıfta bulunulan makale düşünceli. Ancak, ben orada inanmak olduğunu "basit ve zarif" çözümü: coğrafi veri setleri için, sınırlayıcı kutuları iki türü vardır. + -180 meridyeni bağlamayanlar her zamanki gibi saklanabilir ve aranabilir. ± 180 meridyen binme anlardır bir saklanabilir yarı tamamlayıcı formda: yani, her zaman olduğu gibi enlemlerde aralığını depolamak, ancak bunun yerine boylamlarının aralığı depolamak olup kutunun içinde bulunan (ve biraz geçiş göstermek için olan bir şekilde depolama alanı kullanılıyor). Esasen coğrafi indekslerde veya arama ağacı yapılarında herhangi bir değişiklik yapılmasına gerek yoktur; arama algoritmaları için sadece küçük bir değişiklik gereklidir.
Her halükarda, sorunun kendisi için bir çözüm.
Girişin sınırlayıcı kutu tanımlayıcılarının ((LLx, LLy), (URx, URy)) bir dizisi olduğunu tahmin ediyorum:
-540 <= LLx, -180 <= URx, LLx <= 180 ve URx <= 180. Ayrıca -90 <= LLy <= URy <= 90.
(boylam, enlem) = (x, y) 'deki bir noktanın, eğer ve sadece
LLy <= y <= URy ve
ya LLx <= x <URX = veya LLx - 360 <= x <URX.
Çıktı için, tüm girdilerin birleşimini içeren en küçük sınırlayıcı kutu için parametreler istersiniz.
Açıkçası, minimum sınırlama kutusunun (MBR) y sınırları, y değerlerinin minimum ve maksimumları olacaktır. X sınırları için, en büyük boşluğu bulmak için bir çizgi süpürme kullanın .
İşte algoritmanın açıklaması. Bunu göstermek için, girdinin dört kutudan oluştuğunu varsayalım,
((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))
İlk önce kutuların (kırmızı) ve MBR'lerin (siyah), daha sonra ilk ikisinin, sonra ilk üçün, ardından tüm kutuların bir şemasıdır.
İkinci adımda, doğu ve batı yarımkürelerdeki kutuların + -180 derece meridyeni geçen bir MBR ile çevrili olduğuna ve bu haritada iki ayrı kutu olarak görünmesine dikkat edin. Son adımda, MBR'nin Güney Amerika ve Antarktika arasında küçük bir kutu içerecek şekilde doğuya doğru genişletilmesi gerekiyor.
Kutuların tüm x-koordinatlarını çıkarın, modulo 360'ı hesaplayın (-180..180 aralığına yerleştirmek için), artan şekilde sıralayın ve sarmak için ilk değeri (360 derece artırılır) sonuna ekleyin etrafında:
-149, -90, -81, -77, -69, -36, 77, 156, 211
(211 ve -149'un aynı meridyen olduğuna dikkat edin.)
Her bir x koordinatını, önceki koordinat (ancak bu önceki değeri içermeyen) ile ara arasındaki aralığı temsil eden olarak düşünün. Örneğin, -77, -81 ile -77 arasındaki tüm değerleri temsil eder, ancak -81'i içermez. İlkinden sonraki her biri için, o aralığı içeren kutu sayısını sayın.
1, 0, 1, 0, 1, 0, 1, 0
Örneğin, ilk "1" bir kutunun -149 ile -90 arasındaki aralığı kapsadığı anlamına gelir. (Bu üçüncü kutu.)
Bir optimizasyon olarak, x aralığını kapsayan herhangi bir kutu bulduğunuzda sayımı durdurabilir ve sonraki x aralığına geçebilirsiniz. Biz sadece olabilir aralıklarla belirlemeye çalışıyoruz değil herhangi kutuları tarafından karşılanacaktır.
(1) 'de sıralanan x koordinatlarının ilk farklılıklarını hesaplayın.
59, 9, 4, 8, 33, 113, 79, 55
Bunları (2) 'deki kapsama alanı sayılarıyla eşleştirin. Kapsama sayısının 0 olduğu en büyük farkı bulun. Burada, 113
önceki dizinin altıncı öğesine eşittir . Bu, kutuların toplanmasının bıraktığı boylamdaki en büyük boşluktur.
(İlginç bir şekilde, maksimumun birden fazla konumda gerçekleşme olasılığı, çözümün mutlaka benzersiz olmadığını gösterir! Bir grup kutu için birden fazla MBR olabilir. Zorunlu gibi ek koşullar ekleyerek benzersiz bir tanımlayabilirsiniz MBR içindeki + -180 meridyene olan ortalama mesafenin mümkün olduğunca büyük olması; bir bağı çözmek için en doğudaki çözümü seçin (diyelim).)
İlgili aralığı bulun: burada, -36 ila 77 arasındadır. Bu, MBR'de olmayan boylam aralığıdır . Bu nedenle, tamamlayıcısını -180 ila 180 aralığında alın. Burada tamamlayıcı, biri -180 ila -36 ve diğeri 77 ila 180 arasında olmak üzere iki ayrık aralıktır. Alternatif olarak, tamamlayıcıyı muhtemelen + -180 derece meridyen: -283 ila -36 burada (veya eşdeğer olarak 77 ila 324 arasında).
MBR'nin köşeleri için y değerlerinin min ve maks'lerini kullanın.
((-283, -85), (-36, 81))