Birden çok katmanın sınırlayıcı kutusunu lat / long olarak nasıl hesaplayabilirim?


11

Başta AGS 9.x, AGS 10 ve WMS 1.x olmak üzere her türlü harita hizmetinin performans testi için bir uygulama yazıyorum.

Uygulamanın bir kısmı, hizmetin tam kapsamı dahilinde bireysel istekler için rastgele sınırlayıcı kutular oluşturmayı içerir. Bu bölüm, hizmetin tam kapsamı biliniyorsa (ör. AGS hizmetinin fullExtent özelliği aracılığıyla) coğrafi ve öngörülen koordinat sistemleri için iyi çalışır.

Benim sorunum WMS ile: GetCapability yanıt her katman sınırlama alanını> = 1 CRSs tanımlayabilirsiniz. Uygulamanın bazı bölümleri, bir hizmetin CRS'sinin coğrafi mi yoksa yansıtılı mı olduğunu bilmelidir, bu nedenle WMS'deki belirsizliği kaldırmak için her zaman katmanın her zaman tanımlanmış olan ve EPSG: 4326'da bulunan LatLonBoundingBox'ı kullanıyorum. Sonra tek bir istek (rasgele olan) gitmek tüm katmanları dayalı bir tam hizmet sınırlama kutusu hesaplamak zorunda. Zorlaştığı yer burası.

Her lat / lon sınırlayıcı kutu için LLx (sol alt boylam), hangi meridyenlere bağlı olarak URx'den (sağ üst boylam) daha büyük veya daha küçük bir sayı olabilir. Kare veya dairesel diyagramlar çizmeye her başladığımda anlaşılan bir yaklaşımım olduğunu düşünüyorum ve sonra onu mahveden bir durum buluyorum ve beynim lapa dönüşüyor.

Çalışana kadar ona dayamaya devam edeceğim ve burada bir çözüm gönderirsem, ancak hayatımı kolaylaştıracak kabul görmüş ve tamamen test edilmiş bir yaklaşım olması gerektiğinden eminim. Şu an bulamıyorum.


Tamam bu makalede: stonybrook.edu/libmap/coordinates/seriesa/no2/a2.htm (Global Gotchas bölümü) "Maalesef, Global Gotchas'ı çözmek için basit ve zarif bir çözüm yok" yazıyorum. Tüm katman uzantılarını taramayı düşünüyorum ve eğer URx <LLx kapsamı -180 +180 olarak ayarladıysa. Aynı makale, çoğu CBS'nin bu koordinatlara sahip bir çokgeni iki ayrı özelliğe böldüğünü göstermektedir.
tomfumb

Bu mükemmel
gönderiyi

Yanıtlar:


6

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

    1. LLy <= y <= URy ve

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

resim açıklamasını buraya girin

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

  1. 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.)

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

  3. (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).)

  4. İ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).

  5. MBR'nin köşeleri için y değerlerinin min ve maks'lerini kullanın.

    ((-283, -85), (-36, 81))
    

4. maddenin son cümlesinde neden "-283'ten -36'ya" yazıyorsunuz? Neden 77-36 değil?
letmaik

1
@neo Çünkü "77 ila -36" boş bir aralıktır. (Tanım olarak, [a, b] aralığı, tüm x sayılarından oluşur, öyle ki <= x <= b. A = 77 ve b = -36 ile böyle sayılar yoktur.) Biri "iyi , boylam gittikçe, 77 ila -36 tamamen açık. " Sorun şu değildir: 77'den 180'e = -180'e gider ve -36'ya kadar devam eder mi yoksa 77'den -36'ya mı düşer ? Bu tür belirsizlikleri önlemek için dikkatli olmayı seçtim.
whuber

Cevabınızı hızlı bir şekilde uyguladım (bkz. Gist ). Bir kutunun bir aralık içerip içermediğini kontrol etmek için kutu boylamlarını açmak zorunda kaldım, aksi takdirde süreksizliği geçen kutular için işe yaramazdı. Bir acemi olmak bu benim için tamamen açık değildi :)
letmaik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.