Více

Čáry na reprojekčních předmětech sp s projekcí Mollweide

Čáry na reprojekčních předmětech sp s projekcí Mollweide


Mám takový zvláštní problém, že když reprojektuji mapy na Mollweideovu projekci v R pomocí sp, dostanu další čáry táhnoucí se po celém světě. Co se tady děje, a máte nějaké návrhy, jak to opravit. Zde je reprodukovatelný příklad:

knihovna (sp) knihovna (mapy) knihovna (maptools) mapa světa <- mapa ("svět", plot = F) plot (mapa světa, typ = "l)

Zatím je vše dobré. dostanu

Takže teď reprojektuji. Toto je CRS, který používám, aby byl kompatibilní s některými dalšími projekty. Všimněte si, jak se pak ořezávají světové linky.

worldmapLines <- map2SpatialLines (worldmap, proj4string = CRS (" +proj = longlat +datum = WGS84")) worldM <- spTransform (worldmapLines, CRS (" +proj = moll +lon_0 = 0 +x_0 = 0 +y_0 = 0 + ellps = WGS84 +jednotky = m +no_defs ")) plot (worldM)


Vaše data překračují limit 180 ° E ve východním Rusku a na nějakém pacifickém ostrově. Pokud chcete dobře vypadající mapu ve stupních, musíte svá zdrojová data oříznout na 179,9 ° E/W.

Podívejte se na moji odpověď zde (i když se zabývá pohledem zaměřeným na Pacifik)

QGIS zobrazuje světové obrazce zemí se středem v Tichém oceánu pomocí Robinsonovy, Millerovy válcové nebo jiné projekce


Takže na základě výše uvedené odpovědi AndreJ jsem to vybičoval.

cleanSpLinesForProjection <- funkce (w) { #To budeme muset projít, řádek po řádku ... slot (w, "lines") <- lapply (slot (worldmapLines, "lines"), function (x) {coords <- slot (x, "Lines") [[1]]@coords #získejte řádky s příliš velkými hodnotami délky rIDX <- which (coords> = 180, arr.ind = T) [, 1] #if there are některé, nahraďte je, pokud (délka (rIDX> 0)) kordy <- coords [-rIDX,] #replace slot slot (x, "Lines") [[1]]@coords <- coords x}) w}

To funguje.

worldM <- spTransform (cleanSpLinesForProjection (worldmapLines), CRS (" +proj = moll +lon_0 = 0 +x_0 = 0 +y_0 = 0 +ellps = WGS84 +units = m +no_defs")) plot (worldM)

Přál bych si, aby existoval argument pro spTransform nebo obecnou funkci pro všechny objekty sp. Ach dobře. Dozvěděl jsem se zde něco o sp a vybičoval nějaký kód, který téměř jistě použiji v budoucnu. A teď to musíte použít na objekt SpatialPolygons ... Co by se mohlo pokazit?


Vaše údaje jsou neplatné:

> bbox (worldmapLines) min max x -179,95721 190,29080 y -85,44308 83,57391

a děj je správný, protože jste mu poskytli nesprávná data.

S pomocí Rogera Bivanda: opravená verze této sady dat je k dispozici vmaptooly, Snaž se:

data knihovny (maptools) (wrld_simpl) plot (spTransform (wrld_simpl, CRS = (" +proj = moll +lon_0 = 0 +x_0 = 0 +y_0 = 0")))

Roger dále zmínil: Neexistuje absolutně žádný snadný způsob, jak rozbít geometrii na hranicích „na druhé straně světa“. wrld_simpl byl částečně založen na recenter (), ale potřeboval ruční zásahy (to bylo s GPCLib, před rgeos).


Můžete snížit oblast za 180 stupňů a přejít na její obvyklé zobrazení (na stupních nad 180 není nic špatného, ​​ale většina softwaru to neočekává).

To, co máte

knihovna (sp) knihovna (mapy) knihovna (maptools) mapa světa <- mapa ("svět", plot = F) worldmapLines <- map2SpatialLines (mapa světa, proj4string = CRS (" +proj = longlat +datum = WGS84"))

Nyní můžete:

knihovna (rastr) w1 <- oříznutí (worldmapLines, rozsah (-180, 180, -90,90)) w2 <- oříznutí (worldmapLines, rozsah (180, 200, -90,90)) w2 <- posun (w2, -360) w <- vazba (w1, w2) x <- spTransform (w, CRS (" +proj = moll +lon_0 = 0 +x_0 = 0 +y_0 = 0 +ellps = WGS84 +jednotky = m +no_defs") ) plot (x)

Podívejte se na video: वछनन मलवड परकषप. Interrupted Mollweide Projection.