如何将John Snow数据集转换为地图坐标


14

在R的HistData数据包(https://r-forge.r-project.org/R/?group_id=574)中,我具有与约翰·斯诺(John Snow)1854年伦敦霍乱疫情地图有关的数据集。我相信它们在Walter Tobler的监督下经过精心数字化处理后,具有权威性。John Mackenzie在http://www1.udel.edu/johnmack/frec480/cholera/cholera2.html上描述了有关这些数据集的一些详细信息。

不幸的是,死亡,水泵和街道的坐标使用任意坐标系,而不是适用于R中其他GIS应用程序或地图软件(空间包,ggmap等)的地图坐标。

http://freakonometrics.hypotheses.org/19213中, Arthur Charpentier将ggmap与来自http://www.rtwilson.com/downloads/SnowGIS_v2.zip的John Snow数据版本一起使用 。Cholera_Deaths.shp但是,该文件仅列出489人死亡,而不是我在中记录的578人HistData::Snow.deaths

一种想法是找到均值与(x,y)坐标的标准偏差之间的关系并进行线性缩放,但是也许有更好的方法吗?

到目前为止,这是我尝试过的

> 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

读取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
>

好的,然后我尝试重新定标D以具有与相同的均值和标准差XX,但此处有些方法无法正常工作-的列均值Dscaled应该等于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 
>

编辑:在这个问题上查看新功能绘制的Snow地图可能会有所帮助,SnowMap(axis.labels=TRUE)现在在HistDataR-Forge 的(rev 102)开发版中。轴标签在左下角显示坐标系统的原点,就像在我的数据Snow.*数据集中一样。

雪地图


我一直在尝试按比例调整每个数据集的泵。我不认为help(Snow.pumps)中的坐标系为100米,因为比例尺大约为54(含平移)能最好地将这些坐标映射到shapefile的UK网格坐标(绝对位于米)。即使这样,这些点也不会完全重叠,显然还有其他旋转/倾斜。由于泵的数量较少,因此有可能在每个数据集中识别相应的泵并为其计算移位/转换。
Spacedman '16

我认为您已经查看了HistData / inst / doc / Snow_deaths-duplicates.html,发现它没有帮助?
barrycarter '16

我还想到,我可以将Snow.*文件中的坐标线性转换为基于GIS的地图中的坐标,并使用两个或三个泵的位置来检查精度。不幸的是,SnowGIS文件中没有泵的标签,并且我还没有看到如何绘制它们的示例,以便可以直观地进行比较。
user101089 '16

1
在读完标题之后的一秒钟,我以为您想在Westeros中绘制坐标。
user35594 '16

Answers:


4

也许从http://donboyes.com/2011/10/14/john-snow-and-serendipity评估shapefile,它有578分。

我不认为尝试将HistData Snow Deaths与Robin Wilson(@robintw)版本关联起来是可行的,因为shapefile在单个地址中包含多个死亡的单点坐标,而不是从街道上的街道上堆叠的多个点。地图

Robin的版本肯定缺少很多要点。快速浏览,有很多人遗漏了单个死亡。另一个问题是靠近地图的中心,该中心在放在一起时没有正确地进行边缘匹配(这在Wikipedia 地图中也可见),并且遮盖了许多点。

下载中提供的地图摘录:

在此处输入图片说明

摘自UCLA版本

在此处输入图片说明


大!具体而言,.shp文件链接为donboyes.com/download/snow_shp.zip
user101089 2016年

2

为了完成该问题的答案,以下代码在原始Tobler文件(在中HistData)和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]

然后,对X [,1]上的D [,1]和X [,2]上的D [,2]进行关联和回归。线性变换由回归系数给出。

> 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  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.