2013-02-07 15 views
7

Mam shapefile przedstawiający oddalonych obszarów w Australii, uzyskany z Australian Bureau of Statistics:R - skazani na działce() - Farbowanie Shapefile wielokątów w oparciu o wartości szczeliny

http://www.abs.gov.au/AUSSTATS/[email protected]/DetailsPage/1270.0.55.005July%202011?OpenDocument

W tym samym adresem URL jest PDF "ASGS Remoteness Structure Edition 2011 Mapy PDF" - Próbuję odtworzyć pierwszą mapę z tego dokumentu PDF.

Czytałem w shapefile i dodaje informacje o kolorze do gniazda data:

ra <- readShapeSpatial("RA_2011_AUST", delete_null_obj = TRUE) 
[email protected]$COLOUR <- "#FFFFFF" 
[email protected]$COLOUR[(as.numeric(as.character([email protected]$RA_CODE11)) %% 10) == 0] <- "#006837" 
[email protected]$COLOUR[(as.numeric(as.character([email protected]$RA_CODE11)) %% 10) == 1] <- "#31A354" 
[email protected]$COLOUR[(as.numeric(as.character([email protected]$RA_CODE11)) %% 10) == 2] <- "#78C679" 
[email protected]$COLOUR[(as.numeric(as.character([email protected]$RA_CODE11)) %% 10) == 3] <- "#C2E699" 
[email protected]$COLOUR[(as.numeric(as.character([email protected]$RA_CODE11)) %% 10) == 4] <- "#FFFFCC" 

Jedyne co pozostaje mi zrobić, to działka mapa! To tutaj utknęłam ...

[email protected] to lista 35 wielokątów, z których każdy ma szczelinę ID, która jest indeksem ramki danych [email protected]. Więc wszystko, co muszę zrobić, to powiedzieć plot(), aby znaleźć kolor w [email protected]$COLOUR[ID]. Cóż, niezupełnie. Każdy z 35 wielokątów (klasa "Wielokąty") ma własną listę wielokątów (klasa "Wielokąt"); w sumie jest 6902 wielokątów !!!

Moje zrozumienie plot() polega na tym, że muszę przekazać mu wektor kolorów w tej samej kolejności, w jakiej będą drukowane wielokąty. Dlatego uważam, że będę musiał stworzyć wektor o długości 6902 z każdym elementem utrzymującym wartość koloru dla powiązanego wielokąta. Jak ja to robię?

Byłoby to łatwe, gdyby wielokąty zostały naniesione w porządku, ale tak nie jest. Każdy z 35 wielokątów ma szczelinę plotOrder, która jest wektorem całkowitym, więc wektor koloru będzie prawdopodobnie musiał być uporządkowany według wartości w każdym z tych wektorów.

W tym momencie wszystko wydaje się nieco zbyt skomplikowane. Czy jestem całkowicie nie na miejscu?

Dzięki za porady!

+2

Powinieneś czytać shapefiles, używając readOGR z pakietu rgdal, który będzie ładowany do danych projekcji, jeśli istnieje plik .prj z plikiem shape. – Spacedman

Odpowiedz

11

Zrobiłeś już całą pracę!

plot(ra, [email protected]$COLOUR) 

Albo nawet, jak @Spacedman zasugerował:

plot(ra, col=ra$COLOUR) 

I to jest to!

enter image description here

A jeśli chcesz się pozbyć granicach wielokąta:

plot(ra, col=ra$COLOUR, border=NA) 

enter image description here

Edit: próba wyjaśnienia tego zachowania:

Według ?SpatialPointsDataFrame:

SpatialPolygonsDataFrame z domyślnym dopasowaniem identyfikatorów sprawdza nazwy wierszy ramek danych w polach Identyfikatory wielokątów. Muszą się ze sobą zgodzić i być unikatowe (żadne obiekty Wieloboków nie mogą udostępniać identyfikatorów); wiersze ramki danych zostaną ponownie zamówione, jeśli będą potrzebne, aby dopasować identyfikatory wielokątów.

Oznacza to, że wielokąty są uporządkowane zgodnie z ich identyfikatorem, a zatem są w kolejności rzędów ramki danych w gnieździe @data.

Teraz, jeśli spojrzeć na funkcję plot.SpatialPolygons (używając getAnywhere(plot.SpatialPolygons)) są te linie w pewnym momencie:

... 
    polys <- slot(x, "polygons") 
    pO <- slot(x, "plotOrder") 
    if (!is.null(density)) { 
     if (missing(col)) 
      col <- par("fg") 
     if (length(col) != n) 
      col <- rep(col, n, n) 
     if (length(density) != n) 
      density <- rep(density, n, n) 
     if (length(angle) != n) 
      angle <- rep(angle, n, n) 
     for (j in pO) .polygonRingHoles(polys[[j]], border = border[j], 
      xpd = xpd, density = density[j], angle = angle[j], 
      col = col[j], pbg = pbg, lty = lty, ...) 
    } 
... 

Wektor wprowadzane do col ma takiej samej kolejności jak gniazda polygons i stąd jako ID. plotOrder służy do indeksowania wszystkich z nich w ten sam sposób.

+2

Po prostu 'ra $ COLOUR' powinno działać - ramki danych przestrzennych działają głównie jak ramki danych, z wyjątkiem sytuacji, gdy nie ... – Spacedman

+0

OK, to całkiem fajne! Ale dlaczego to działa? Czy wielokąty nie są drukowane w kolejności określonej przez ra @ plotOrder ??? To rozwiązanie działa tylko wtedy, gdy są one drukowane w kolejności numerycznej, ignorując ra @ plotOrder. –

+0

A co z wielokątami "liścia" 6902? Sądzę, że właśnie tak jest zaimplementowana metoda plot() dla tej klasy, ale nie jest oczywiste, że tak powinno być. –

Powiązane problemy