Comment traduire les ensembles de données John Snow en coordonnées cartographiques

14

Dans le package HistData pour R ( https://r-forge.r-project.org/R/?group_id=574 ) j'ai les ensembles de données liés à la carte de John Snow de l'épidémie de choléra à Londres, 1854. Je crois qu'ils font autorité, ayant été soigneusement numérisées sous la supervision de Walter Tobler. Certains détails sur ces ensembles de données sont décrits par John Mackenzie, à http://www1.udel.edu/johnmack/frec480/cholera/cholera2.html .

Malheureusement, les coordonnées des décès, des pompes et des rues utilisent un système de coordonnées arbitraires, et non des coordonnées cartographiques adaptées à d'autres applications SIG ou logiciels de cartographie en R (packages spatiaux, ggmap, etc.)

Dans http://freakonometrics.hypotheses.org/19213, Arthur Charpentier utilise ggmap avec une version des données John Snow de http://www.rtwilson.com/downloads/SnowGIS_v2.zip . Le Cholera_Deaths.shpfichier ne répertorie cependant que 489 décès, pas les 578 que j'ai enregistrés HistData::Snow.deaths.

Une idée est de trouver les relations entre les moyennes et les écarts-types des coordonnées (x, y) et de redimensionner linéairement, mais peut-être y a-t-il une meilleure façon?

Voici ce que j'ai essayé jusqu'à présent

> 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

Lire le fichier 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, alors j'essaie de redimensionner Dpour avoir les mêmes moyennes et écarts-types que XX, mais quelque chose ne fonctionne pas correctement ici - la moyenne des colonnes de Dscaledaurait dû être égale à celles de 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 
>

EDIT: Il pourrait être utile dans ce problème de voir la carte de Snow dessinée par la nouvelle fonction, SnowMap(axis.labels=TRUE)maintenant dans la version de développement de HistData(rév 102) sur R-Forge. Les étiquettes des axes indiquent l'origine du système de coordonnées dans le coin inférieur gauche, comme dans mes Snow.*ensembles de données.

SnowMap

user101089
la source
J'ai juste essayé de faire évoluer les pompes de chaque ensemble de données pour qu'elles correspondent. Je ne crois pas que la ligne d'aide (Snow.pumps) sur les coordonnées soit à 100 mètres, car une échelle d'environ 54 (et une traduction) fait le meilleur travail pour les mapper aux coordonnées de la grille britannique du shapefile (qui sont certainement en mètres). Même alors, les points ne se chevauchent pas exactement, une autre rotation / inclinaison est clairement présente. Puisqu'il y a moins de pompes, il est possible d'identifier les pompes correspondantes dans chaque ensemble de données et de calculer le décalage / la traduction pour celles-ci.
Spacedman
Je suppose que vous avez consulté HistData / inst / doc / Snow_deaths-duplicates.html et que vous l'avez trouvé inutile?
barrycarter
Il m'est également venu à l'esprit que je pouvais obtenir la transformation linéaire des coordonnées de mes Snow.*fichiers en celles d'une carte SIG avec les emplacements de deux pompes, ou trois pour vérifier la précision. Malheureusement, il n'y a pas d'étiquettes pour les pompes dans les SnowGISfichiers, et je n'ai pas vu d'exemple pour les tracer afin de pouvoir les comparer visuellement.
user101089
1
Pendant une seconde, après avoir lu votre titre, j'ai pensé que vous vouliez cartographier les coordonnées à Westeros .
user35594

Réponses:

4

Évaluez peut-être le fichier de formes de http://donboyes.com/2011/10/14/john-snow-and-serendipity, il a 578 points.

Je ne pense pas que d'essayer de relier les HistData Snow Deaths à la version de Robin Wilson (@robintw) fonctionnera car le fichier de formes contient une coordonnée de point unique pour plusieurs décès à une seule adresse, au lieu des points multiples empilés de la rue dans le carte .

La version de Robin manque définitivement beaucoup de points. D'un coup d'œil, il y a pas mal de décès isolés isolés. Un autre problème est plus proche du centre de la carte où il n'était pas correctement apparié lors de la mise en place (cela est également visible sur la carte Wikipedia ) et cela obscurcit un certain nombre de points.

Extrait de la carte fournie dans le téléchargement :

entrez la description de l'image ici

Extrait de la version UCLA :

entrez la description de l'image ici

user2856
la source
Génial! Pour être concret, le lien vers les .shpfichiers est donboyes.com/download/snow_shp.zip
user101089
2

Pour compléter la réponse à cette question, le code suivant trouve la transformation linéaire des coordonnées dans les fichiers Tobler originaux (en HistData) et ceux fournis par Don Boyes.

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]

Ensuite, corréler et régresser D [, 1] sur X [, 1] et D [, 2] sur X [, 2]. La transformation linéaire est donnée par les coefficients de régression.

> 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  
user101089
la source