Biorąc pod uwagę zestaw współrzędnych, jak mogę obliczyć minimalne granice?

13

Mam zestaw współrzędnych w lon / lat. Zawsze są co najmniej 3 uporządkowane współrzędne, które tworzą poli (jeśli były rzutowane na płasko). Jak obliczyć minimalne granice dla tych współrzędnych jako zestawu prawidłowych zakresów długości i szerokości geograficznej? („prawidłowy” mam na myśli zakresy, które jednoznacznie uwzględniają antimeridian). Trudno mi wyjaśnić, czego szukam, więc mam zdjęcie.

wprowadź opis zdjęcia tutaj

Przypadek na zdjęciu jest trywialny; po prostu znajdziesz absolutne minimum i maksimum dla wszystkich punktów. Nie działa to jednak we wszystkich przypadkach. Czy istnieje ogólne rozwiązanie?

Edycja: Aby wyjaśnić, co mam na myśli przez „prawidłowy”, powiedzmy, że miałem trzy wartości długości geograficznej w moim zbiorze danych: -76, -135 i 164. Wartości przekraczają antimeridian i chciałbym, aby wynikowe zakresy zostały podzielone: ​​-76 do -180 ORAZ od 164 do 180.

Więcej wyjaśnień. Punkty tworzą wielokąt, więc w niektórych przypadkach wymagany zakres może wynosić od -180 do +180 (tj. Pełne 360 ​​stopni):

wprowadź opis zdjęcia tutaj

Zdjęcie po lewej pokazuje długość czterech współrzędnych, które występują na jednej „połowie” Ziemi. Wyobraź to sobie tak, jakbyś patrzył w dół na biegun północny (czarna kropka). Kolor różowy pokazuje minimalny zakres wzdłużny obejmujący wielokąt (wielokąt jest pokazany między czterema punktami na fioletowo). Przypadek po lewej stronie miałby dwa zakresy podłużne: [-180 do -120] i [135 do 180] (tylko wizualnie ją szacując)

Zdjęcie po prawej pokazuje inny przypadek, w którym punkty biegną dookoła Ziemi. Ten zakres wynosiłby [-180 do 180].

Pris
źródło
1
Nigdy wcześniej nie rozważałem tego problemu, to świetne pytanie. Kolejny przykład, w którym płaska ziemia ułatwiłaby nam pracę! Z niecierpliwością czekam na rozwiązania tego problemu.
sgrieve
Myślę, że musisz bardziej wyrazić się na temat „(przez„ prawidłowy ”mam na myśli zakresy, które jednoznacznie uwzględniają antimeridian)” - Domyślam się, że słowo minimum musi przekraczać granice pytania.
Ian Turton
czy możesz ponownie dodać obraz, może pomóc wyjaśnić problem.
Mapperz
1
iant: wyraźnie wyjaśniono „ważny” Mapperz: dodać ponownie? czy to się nie pojawia? Widzę to dobrze.
Pris,
1
Współrzędne są podane w lon / lat i są używane do przeszukiwania bazy danych w celu pobrania danych geograficznych. Ściśle mówiąc, możesz przekształcić to w czysty problem matematyczny (chociaż można to powiedzieć o wielu rzeczach w GIS)
Pris

Odpowiedzi:

5

Mam nadzieję, że rozumiem pytanie poprawnie ...

Możemy rozwiązać problem długości i szerokości geograficznej osobno, więc wezmę twój przykład z długościami geograficznymi: -76, -135 i 164.

Najpierw zamówiłbym je:

-135, -76, 164

Następnie dodałbym ponownie lewą współrzędną najbardziej po prawej: -135 + 360 = 225

-135, -76, 164, 225

Teraz możemy obliczyć odstępy między współrzędnymi:

-135 (59) -76 (240) 164 (61) 225
             .......

Największa szczelina (240) musi być granicą minimalnej ramki ograniczającej, która nie należy do ramki. Linia przerywana to największa część koła, którą możemy oszczędzić. W naszym przykładzie oznacza to, że obwiednia zaczyna się od 164, zawiera -135, a kończy na -76.

martinstoeckli
źródło
To działa w większości przypadków. Ale rozważ mój przykład z dodatkową długością geograficzną (+60) [jako czwarty punkt w poli]. W tym przypadku chciałbym uzyskać wartość od -180 do 180. Za pomocą twojej metody otrzymam od 61 do 180 i od -76 do -180.
Pris,
@Pris - Czyli chcesz, aby długość 180/180 (w końcu to ten sam punkt), aby była częścią pudełka w każdym przypadku, nawet jeśli nie jest to najmniejsze możliwe pudełko?
martinstoeckli,
Myślę, że kluczową różnicą jest to, że punkty tworzą wielokąt. Zobacz moją edycję.
Pris,
@Pris - Cóż, to wygląda naprawdę podstępnie. To tak, jakby każdy punkt krawędzi między dwoma punktami liczy się również jako punkt wierzchołka.
martinstoeckli,
1

Jest to naprawdę łatwe w JavaScript w interfejsie API Map Google. Oto jak zrobiłbyś to po stronie klienta z tym interfejsem API:

var bounds = new google.maps.LatLngBounds();

//Recursively loop through your coordinate list
    latLng = new google.maps.LatLng(<YourLat>, <YourLon>);
    bounds.extend(latLng);
//

extentBox = new google.maps.Rectangle({
    bounds: bounds,
    strokeColor: "#FF0000",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#FF0000",
    fillOpacity: 0.35
});
extentBox.setMap(map);
SeanMaday
źródło
Hej, dzięki za odpowiedź, jednak szukam rzeczywistej metody zamiast wywoływania interfejsu API lub korzystania z istniejącego rozwiązania.
Pris,
Dałeś mi metodę bounds.extend, szukałem właśnie tego rozwiązania, więc dzięki!
Thomson Comer
Czy to działa z wielokątami? Widzę, że używasz prostokąta.
Danny G
1

Myślę, że mogłem znaleźć sposób, aby to zrobić. Moja wstępna implementacja działa, ale nie jestem pewien, czy są jakieś przypadkowe przypadki, które przegapiłem. Jeśli coś jest nie tak z tym rozwiązaniem, proszę to zaznaczyć.

Biorąc pod uwagę, że martwię się o uzyskanie zasięgów lon / lat dla wielokąta, a nie tylko o punkty, które się w nim składają, jednym ze sposobów rozwiązania problemu jest faktyczne „przejście” wzdłuż zestawu uporządkowanych współrzędnych od początku do końca. Śledzisz, jak daleko podróżowałeś zgodnie z ruchem wskazówek zegara i przeciwnie do ruchu wskazówek zegara w stosunku do środka Ziemi, biorąc pod uwagę punkt początkowy, i idź dalej, aż do ukończenia wielokąta:

wprowadź opis zdjęcia tutaj

Możesz uzyskać zakres odległości CW i CCW od punktu początkowego ... daje to wystarczającą ilość informacji, aby uzyskać prawidłowe granice w normalnym przypadku (po lewej na obrazku). W przypadku, gdy wielokąt obróci się całkowicie lub przecina środek, zwrócony kąt podróży wyniesie 360 ​​stopni.

Ta metoda działa również wtedy, gdy wielokąt „tuli się” do powierzchni Ziemi, a nie przecina ją. Więc jeśli masz wielokąt przedstawiający kogoś podróżującego po powierzchni Ziemi od Toronto (lon: -79) do Londynu (lon: -5) do Tokio (lon: 139) iz powrotem (w tej samej kolejności), będziesz uzyskać zasięg [-79 do 139].

Jeśli wielokąt przecina środek (wyobraź sobie dwa sąsiednie punkty na +90 i -90), uważam, że jest to pełny zakres (360 stopni), chociaż możesz pójść w obie strony.

Pris
źródło