Cara menerjemahkan kumpulan data John Snow ke peta koordinat

14

Dalam paket HistData untuk R ( https://r-forge.r-project.org/R/?group_id=574 ) Saya memiliki kumpulan data yang terkait dengan peta John Snow tentang wabah kolera di London, 1854. Saya percaya mereka bersifat otoritatif, telah didigitalkan dengan cermat di bawah pengawasan Walter Tobler. Beberapa detail pada set data ini dijelaskan oleh John Mackenzie, di http://www1.udel.edu/johnmack/frec480/cholera/cholera2.html .

Sayangnya, koordinat kematian, pompa, dan jalan-jalan menggunakan sistem koordinat sewenang-wenang, bukan koordinat peta yang cocok untuk aplikasi GIS lain atau perangkat lunak pemetaan di R (paket spasial, ggmap, dll.)

Dalam http://freakonometrics.hypotheses.org/19213 Arthur Charpentier menggunakan ggmap dengan versi data John Snow dari http://www.rtwilson.com/downloads/SnowGIS_v2.zip . Namun Cholera_Deaths.shpfile tersebut hanya mencantumkan 489 kematian, bukan 578 yang telah saya rekam HistData::Snow.deaths.

Satu ide adalah untuk menemukan hubungan antara sarana dan standar deviasi dari koordinat (x, y) dan skala ulang secara linear, tetapi mungkin ada cara yang lebih baik?

Inilah yang saya coba sejauh ini

> 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

Baca file 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, maka saya mencoba untuk skala ulang Duntuk memiliki cara yang sama dan standar deviasi XX, tetapi ada sesuatu yang tidak berfungsi dengan benar di sini - sarana kolom Dscaledseharusnya ternyata sama dengan yang dari 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: Mungkin bermanfaat dalam masalah ini untuk melihat peta Snow yang digambar oleh fungsi baru, SnowMap(axis.labels=TRUE)sekarang dalam versi pengembangan HistData(rev 102) pada R-Forge. Label sumbu menunjukkan asal sistem koordinat di sudut kiri bawah seperti pada Snow.*set data data saya .

SnowMap

pengguna101089
sumber
Saya baru saja mencoba mengukur pompa dari setiap set data agar sesuai. Saya tidak percaya baris dalam bantuan (Snow.pumps) tentang koordinat menjadi 100 meter, karena skala sekitar 54 (dan terjemahan) melakukan pekerjaan terbaik untuk memetakan ini ke koordinat jaringan UK shapefile (yang pasti ada di meter). Meskipun titik-titik tersebut tidak tumpang tindih dengan tepat, beberapa rotasi / kemiringan lainnya jelas ada. Karena ada lebih sedikit pompa, itu mungkin untuk mengidentifikasi pompa yang sesuai di setiap set data dan menghitung shift / translate untuk itu.
Spacedman
Saya berasumsi Anda telah melihat HistData / inst / doc / Snow_deaths-duplicates.html dan menganggapnya tidak membantu?
barrycarter
Terlintas dalam benak saya bahwa saya bisa mendapatkan transformasi linear koordinat dalam Snow.*file saya ke yang ada di peta berbasis GIS dengan lokasi dua pompa, atau tiga untuk memeriksa akurasi. Sayangnya, tidak ada label untuk pompa di SnowGISfile, dan saya belum melihat contoh cara plot mereka sehingga saya bisa membandingkannya secara visual.
user101089
1
Untuk sesaat setelah membaca judul Anda, saya pikir Anda ingin memetakan koordinat di Westeros .
user35594

Jawaban:

4

Mungkin mengevaluasi shapefile dari http://donboyes.com/2011/10/10/14/john-snow-and-serendipity memiliki 578 poin.

Saya tidak berpikir mencoba menghubungkan HistData Snow Deaths dengan versi Robin Wilson (@robintw) akan berfungsi karena shapefile berisi koordinat titik tunggal untuk banyak kematian di satu alamat, alih-alih beberapa titik yang ditumpuk kembali dari jalan di peta .

Versi Robin jelas kehilangan banyak poin. Dari pandangan sekilas, ada beberapa kematian tunggal yang terlewatkan. Masalah lainnya adalah lebih dekat ke pusat peta di mana tidak cocok dengan tepi ketika disatukan (ini juga terlihat di peta Wikipedia ) dan ini mengaburkan sejumlah poin.

Ekstrak peta yang disediakan dalam unduhan :

masukkan deskripsi gambar di sini

Ekstrak dari versi UCLA :

masukkan deskripsi gambar di sini

pengguna2856
sumber
Bagus! Untuk konkretnya, tautan ke .shpfile adalah donboyes.com/download/snow_shp.zip
user101089
2

Untuk menyelesaikan jawaban atas pertanyaan ini, kode berikut ini menemukan transformasi linear dari koordinat dalam file Tobler asli (dalam HistData) dan yang disediakan oleh 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]

Kemudian, berkorelasi dan mundur D [, 1] pada X [, 1] dan D [, 2] pada X [, 2]. Transformasi linier diberikan oleh koefisien regresi.

> 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  
pengguna101089
sumber