Korzystam z map ulotek, aby stworzyć reprezentację globalnego wyzwania. Chciałbym dodać polilinię, która kieruje się na wschód od Tokio, a następnie pojawia się na mapie na zachód od Ameryki Południowej - ale zamiast tego otrzymuję linię, która przecina mapę w przeciwnym kierunku (patrz żółta linia).
Myślę, że jest to prawdopodobnie związane z liniami danych i / lub układami współrzędnych, ale jestem nieco szkicowy w szczegółach. Czy ktoś może wyjaśnić teorię, co muszę zrobić, aby to zadziałało? Korzystam z niebieskiej projekcji Nasa:
var bluemarble = new L.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});
coordinate-system
polyline-creation
leaflet
codecowboy
źródło
źródło
Odpowiedzi:
Musisz złamać polilinię na południku + -180 stopni. Wymaga to znalezienia szerokości geograficznej, na której polilinia przecina ten południk. Twój GIS prawdopodobnie ma metody na złamanie. Jeśli nie, proste rozwiązanie można uzyskać z kodu pokazanego w powiązanym wątku . Oto kilka szczegółów.
Polilinia jest reprezentowana jako sekwencja wierzchołków , każda podana w formie (lat, lon), z -180 <= lon <= 180. Musisz sprawdzić każdą kolejną parę, aby zobaczyć, czy przecina południk + -180. Jest szybki test: jeśli wartość bezwzględna różnicy długości wynosi 180 lub więcej, następuje przekroczenie.
W obrębie każdego segmentu (lat0, lon0) -> (lat1, lon1), który przecina południk + -180, musisz rozbić polilinię na dwie części, w których przecina się.
Kluczem jest znalezienie szerokości geograficznej punktu przerwania z rozsądną dokładnością. Najłatwiej to zrobić za pomocą kulistego modelu ziemi: błąd (w porównaniu z bardziej dokładnym modelem elipsoidalnym) będzie zbyt mały, aby go zauważyć.
Niech dany segment przechodzi od punktu 0 w (lat0, lon0) do punktu 1 w (lat1, lon1). Punkt przerwania można znaleźć, prowadząc odcinek linii prostej w 3D między dwoma punktami przedstawionymi we współrzędnych kartezjańskich i znajdując, gdzie współrzędna y wynosi zero. Te współrzędne kartezjańskie są
i podobne wyrażenie dające (x1, y1, z1) dla punktu 1. Rozwiąż równanie
dla t; to jest,
Współrzędne przecięcia są zatem
Ten punkt (który leży pod powierzchnią ziemi gdzieś pod południkiem + -180) ma szerokość równą
Punkt przerwania należy przedstawić na dwa sposoby. Dołączając go po (lat0, lon0), aby zakończyć pierwszą część łamanej polilinii, użyj (lat2, -180), jeśli lon0 jest ujemny, a w przeciwnym razie użyj (lat2, 180). Dołączając go wcześniej (lat1, lon1), aby rozpocząć drugą część łamanej polilinii, postępuj zgodnie z podobną zasadą.
W wyjątkowych przypadkach jeden lub oba z punktów 0 i 1 mogą znajdować się na południku + -180. Postępowanie zgodnie z tą procedurą spowoduje umieszczenie segmentu o zerowej długości na jednym z utworzonych elementów polilinii. Jeśli może to powodować problem z GIS, przetestuj ten warunek.
Zauważ, że polilinia może przekroczyć ten południk więcej niż jeden raz. Dlatego po znalezieniu pierwszego podziału i podzieleniu polilinii na dwie części drugą część należy przetworzyć w ten sam sposób.
źródło
W przypadku podobnej dyskusji być może ten bilet jest interesujący:
„rzut wektorowy na granicę owijania jest podzielony”
https://trac.osgeo.org/grass/ticket/1527
źródło