Korzystasz z pomiarów geodezyjnych dla promieni okręgu?


15

Obecnie rozwijam witrynę mapowania OpenLayers. Pomiary można wykonać za pomocą narzędzia linii i narzędzia obszaru. Oba są obecnie ustawione do obliczania pomiarów geodezyjnych zgodnie z interfejsem API OpenLayers .

Używam pomiarów geodezyjnych, a nie płaskich, ponieważ podczas testowania przez użytkowników ludzie kwestionowali pomiary narzędzia dla odległości, które już znali (takich jak jazda między miastami).

Nową funkcją witryny jest możliwość narysowania okręgu na mapie o określonym promieniu. OpenLayers pozwala tylko rysować koła przy użyciu odległości planarnych, więc gdy użytkownik mierzy okrąg za pomocą narzędzia do pomiaru geodezyjnego, wartości nie są zgodne. Na zdjęciu poniżej promień planety okręgu wynosi 10 km, ale pomiar linii geodezyjnej dla średnicy wynosi 12 km.

Wyraźnie pozostawi to użytkownikowi (i mnie) zastanawianie się, co jest poprawne.

alternatywny tekst

Patrząc na tę odpowiedź , wydaje się, że większość komputerowych systemów GIS „ignoruje” ten problem i zwraca płaskie pomiary i odległości. Więc jaka jest najlepsza praktyka pod względem interfejsu użytkownika i dokładności w zakresie pomiarów planarnych i geodezyjnych?

Aktualizacja

Znalazłem ten przykład Google, który ilustruje problem promieni i projekcji Mercatora:

http://maps.forum.nu/gm_sensitive_circle2.html

Kod JavaScript do narysowania okręgu jest następujący:

    var lat1 = (PI/180)* center.lat(); // radians
    var lng1 = (PI/180)* center.lng(); // radians

    for (var a = 0 ; a < 361 ; a++ ) {
        var tc = (PI/180)*a;
        var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
        var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
        var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
        var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
        circlePoints.push(point);
        bounds.extend(point);
    }

Czy ten okrąg uwzględnia krzywiznę ziemi?

Ostatnia aktualizacja

Kod roboczy opublikowany na stronie http://geographika.co.uk/creating-a-geodesic-circle-in-openlayers


1
coś tu musi być nie tak. różnica nie może wynosić 20% na tak małej odległości między linią prostą a linią wzdłuż sferoidy. coś jeszcze musi być zaangażowane.
Nicklas Avén

4
Rzutowanie jest bardzo prawdopodobne, że Mercator ma prawdziwą skalę na równiku (generalnie faktycznie możliwe jest posiadanie projekcji Mercator gdzie indziej (na jednej szerokości geograficznej), ale większość globalnych parametryzacji używa równika). Błędy skali dla Mercatora są rzeczywiście bardzo wysokie (nieskończone, w rzeczywistości na biegunach), zwiększając się w miarę przemieszczania się na północ / południe od rzeczywistej szerokości geograficznej.
Paul Ramsey,

Pomiary zostały wykonane przy 52 stopniach na północ i rzeczywiście znajdują się w rzucie Mercatora. Czy to oznacza, że ​​wszelkie funkcje po stronie klienta rysowane w Mercator zwrócą bardzo niedokładne obszary i długości, chyba że w pobliżu równika?
geographika,

1
Tak, w zasadzie tak jest, wyświetlaj dane na lokalnej sieci w metrach lub stopach i wszystko będzie dobrze.
Ian Turton

2
@Paul Good call. Ale te dane wskazują tylko, że rzut jest cylindryczny, z czego Mercator jest jednym. W prawdziwych projekcjach cylindrycznych zniekształcenie poziome jest równe s (szerokość geograficzna). Według tego wzoru zniekształcenie 20 / 12,13 osiąga szerokość geograficzną 52,66 stopnia; to dokładnie szerokość geograficzna Limerick.
whuber

Odpowiedzi:


8

Jeśli przygotowujesz domowe przeglądanie w przeglądarce, możesz uzyskać „koło” (nie będzie okrągłe na ekranie z powodu projekcji; raczej przybliżone przez wielokąt w / tyle punktów, ile chcesz narysować), użyj bezpośrednia forma obliczeń geodezyjnych: dany punkt, kierunek (azymut) i odległość daje wynikowy punkt. Szczegóły Gory: http://en.wikipedia.org/wiki/Vincenty%27s_formulae#Direct_Method

Wygląda na to, że ktoś już wykonał tłumaczenie javascript: http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html . Szczęściarz!

Aby zakończyć:

  • Zdecyduj, jak masywny (liczba wierzchołków, nazwij to n) jesteś gotów, aby wynik końcowy był.
  • Podziel 360 stopni na n kawałków.
  • Zbuduj wielokąt przez (dla i w zakresie (n): polygon.add (vincenty_direct (punkt_początkowy, i * 360 / n, odległość)))
  • Po tym, prawdopodobnie naprawię pewne podrażnienia związane z projekcją i planaryzacją:
    • Jeśli używasz typowej projekcji mapy internetowej, którą prawie na pewno jesteś, powstały wielokąt zostanie mocno rozciągnięty w pionie, jeśli zbliży się do bieguna.
    • Podobnie, jeśli wielokąt wynikowy przekroczy międzynarodową linię daty, zostanie naprawdę zniszczony.

Twoje zdrowie!


1
Metoda Vincenty została już dodana do OpenLayers w przestrzeni nazw utils - dev.openlayers.org/apidocs/files/OpenLayers/... z tym wyjaśnieniem, szczególnie parametrem namiaru, wyjaśnij to. Dzięki!
geographika

:) Daj mi znać, jak irytujące są „podrażnienia”. Idealnie byłoby, gdyby naprawa była już częścią OpenLayers i działałaby, ale nie jestem pewien.
Dan S.

3

OpenLayers pozwala tylko na rysowanie okręgów przy użyciu płaskich odległości

Aby uzyskać okrąg geodezyjny, możesz użyć operacji buforowania w usłudze geometrii ESRI.

... jeśli jednostka jest liniowa, np. stopy lub metry, wykonywane jest buforowanie geodezyjne

Dostępny jest dostępny tutaj .


Dzięki za przydatny link - zobaczę, czy mogę zadzwonić do usługi i zaktualizować funkcję w JavaScript. Moją jedyną obawą byłoby poleganie na usłudze sieciowej, którą można wyłączyć w dowolnym momencie. Zakładam, że geodezyjnym punktem zbuforowanym byłby dokładny / rzeczywisty okrąg o długości 10 km?
geographika,

Koło powinno być dokładne, jednak sprawdziłbym je za pomocą narzędzia do pomiaru. Myślę, że usługa geometrii jest częścią standardowej instalacji serwera Arcgis, więc jeśli ta zostanie wycofana, w sieci powinno być o wiele więcej do wyboru. google.com/…
Kirk Kuykendall
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.