Jak tłumaczyć zbiory danych John Snow na współrzędne mapy

14

W pakiecie HistData dla R ( https://r-forge.r-project.org/R/?group_id=574 ) mam zestawy danych związane z mapą wybuchu cholery w Londynie w 1854 roku przez Johna Snowa. Wierzę, że są autorytatywne, ponieważ zostały starannie zdigitalizowane pod nadzorem Waltera Toblera. Niektóre szczegóły dotyczące tych zestawów danych zostały opisane przez Johna Mackenzie na stronie http://www1.udel.edu/johnmack/frec480/cholera/cholera2.html .

Niestety współrzędne śmierci, pomp i ulic używają dowolnego układu współrzędnych, a nie współrzędnych map odpowiednich dla innych aplikacji GIS lub oprogramowania do mapowania w R (pakiety przestrzenne, ggmap itp.)

W http://freakonometrics.hypotheses.org/19213 Arthur Charpentier używa ggmap z wersją danych John Snow z http://www.rtwilson.com/downloads/SnowGIS_v2.zip . Cholera_Deaths.shpPlik, jednak wymienia tylko 489 zgonów, a nie 578 Nagrałem w HistData::Snow.deaths.

Jednym z pomysłów jest znalezienie relacji między średnimi a standardowymi odchyleniami współrzędnych (x, y) i przeskalowanie liniowo, ale może jest lepszy sposób?

Oto, co próbowałem do tej pory

> data(Snow.deaths, package="HistData")
> D <- Snow.deaths[,2:3]
> colMeans(D)
       x        y 
13.03312 11.69721 
> var(D)
          x         y
x 3.8150987 0.3802654
y 0.3802654 2.7213828

Przeczytaj plik Cholera_deaths

> folder <- "C:/Dropbox/R/data/Snow/SnowGIS_v2/SnowGIS"
> library(maptools)
> deaths <- readShapePoints(file.path(folder, "Cholera_Deaths"))
> head(deaths@coords)
  coords.x1 coords.x2
0  529308.7  181031.4
1  529312.2  181025.2
2  529314.4  181020.3
3  529317.4  181014.3
4  529320.7  181007.9
5  529336.7  181006.0
> # deaths has only 250 observations; 489 deaths
> sum(deaths@data$Count)
[1] 489

 > # try to relate to Snow.deaths
> X <- deaths@coords
> colnames(X) <- c("x", "y")
> 
> XX <- data.frame(X, Freq=deaths@data$Count)
> XX <- vcdExtra::expand.dft(XX)
> 
> colMeans(XX)
       x        y 
529414.8 181031.9 
> var(XX)
          x        y
x 10813.816 1521.693
y  1521.693 6227.924
>

OK, następnie próbuję przeskalować, Daby mieć te same średnie i standardowe odchylenia co XX, ale coś tutaj nie działa poprawnie - środki kolumny Dscaledpowinny być równe XX:

> # scale D to have the same means and standard deviations as XX
> Dscaled <- scale(D, center=TRUE, scale=TRUE)
> Dscaled <- scale(Dscaled, center=colMeans(XX), scale=sqrt(diag(var(XX))))
> colMeans(Dscaled)
        x         y 
-5091.040 -2293.947 
>

EDYCJA: Pomocne w tym problemie może być zobaczenie mapy Snow'a narysowanej przez nową funkcję, SnowMap(axis.labels=TRUE)teraz w wersji rozwojowej HistData(rev 102) na R-Forge. Etykiety osi pokazują początek układu współrzędnych w lewym dolnym rogu, tak jak w moich Snow.*zestawach danych.

SnowMap

użytkownik101089
źródło
Właśnie próbowałem skalować pompy z każdego zestawu danych, aby je dopasować. Nie wierzę, że linia pomocy (Snow.pumps) o współrzędnych wynosi 100 metrów, ponieważ skala około 54 (i tłumaczenie) najlepiej odwzorowuje je na współrzędne siatki kształtów w Wielkiej Brytanii (które zdecydowanie są w metrów). Nawet wtedy punkty nie pokrywają się dokładnie, niektóre inne obroty / pochylenie są wyraźnie widoczne. Ponieważ jest mniej pomp, możliwe jest zidentyfikowanie odpowiednich pomp w każdym zestawie danych i obliczenie dla nich przesunięcia / translacji.
Spacedman
Zakładam, że spojrzałeś na HistData / inst / doc / Snow_deaths-duplicates.html i nie byłeś pomocny?
barrycarter
Przyszło mi również do głowy, że mogę uzyskać liniową transformację współrzędnych w moich Snow.*plikach na te na mapie opartej na GIS z lokalizacjami dwóch pomp lub trzech, aby sprawdzić dokładność. Niestety w SnowGISplikach nie ma etykiet dla pomp i nie widziałem przykładu, jak je wykreślić, aby móc porównać je wizualnie.
user101089,
1
Przez chwilę po przeczytaniu twojego tytułu myślałem, że chcesz zmapować współrzędne w Westeros .
user35594,

Odpowiedzi:

4

Być może oceń plik kształtu z http://donboyes.com/2011/10/14/john-snow-and-serendipity, który ma 578 punktów.

Nie sądzę, aby próba powiązania HistData Snow Deaths z wersją Robina Wilsona (@robintw) zadziałała, ponieważ plik kształtu zawiera jedną współrzędną punktu dla wielu zgonów pod jednym adresem, zamiast wielu punktów ułożonych z powrotem na ulicy mapa .

W wersji Robin zdecydowanie brakuje wielu punktów. Z szybkiego spojrzenia wynika, że ​​zginęło całkiem sporo odległych pojedynczych zgonów. Innym problemem jest bliżej środka mapy, gdzie nie została właściwie dopasowana do krawędzi po złożeniu (jest to również widoczne na mapie Wikipedii ), co przesłania kilka punktów.

Wyciąg mapy dostarczonej do pobrania :

wprowadź opis zdjęcia tutaj

Wyciąg z wersji UCLA :

wprowadź opis zdjęcia tutaj

użytkownik2856
źródło
Świetny! Dla konkretności link do .shpplików to donboyes.com/download/snow_shp.zip
user101089
2

Aby uzupełnić odpowiedź na to pytanie, poniższy kod znajduje liniową transformację współrzędnych w oryginalnych plikach Toblera (in HistData) i tych zaproponowanych przez Dona Boyesa.

folder <- "C:/Dropbox/R/data/Snow/snow_shp"
library(maptools)
deaths <- readShapePoints(file.path(folder, "deaths_gcs"))
data(Snow.deaths, package="HistData")
X <- deaths@coords
D <- Snow.deaths[,2:3]

Następnie skoreluj i zresetuj D [, 1] na X [, 1] i D [, 2] na X [, 2]. Transformacja liniowa jest określona przez współczynniki regresji.

> cor(D[,1], X[,1])
[1] 0.9999664
> cor(D[,2], X[,2])
[1] 0.9995559
> 
> # linear transformations to GIS coords
> lm(D[,1] ~ X[,1])

Call:
lm(formula = D[, 1] ~ X[, 1])

Coefficients:
(Intercept)       X[, 1]  
      185.4       1264.7  

> 
> lm(D[,2] ~ X[,2])

Call:
lm(formula = D[, 2] ~ X[, 2])

Coefficients:
(Intercept)       X[, 2]  
    -105441         2047  
użytkownik101089
źródło