映射点和多边形

时间:2017-06-27 12:17:22

标签: r geospatial spatial

我是第一次使用R和空间数据进行R初学者处理。所以我希望我能说清楚。

我有一个意大利地区的形状文件,分为几个人口普查区。 另一方面,我有一个csv文件,其中包含案例列表和每个案例的地址。 我想映射点和shapefile,并获得每个人口普查部门中有多少点的计数。

这是我从现在开始做的事情:

#get cases file
cases <- read.csv("cases.csv", sep =';', header = TRUE)
names(cases)
[1] "name"    "address"

#geocode addresses from Google Maps
library(GISTools)
library(rgeos)
library(ggmap)
geolocalize <- geocode(as.character(cases$address))

# bind latitude and longitude to the previous cases data frame
cases <- data.frame(cases, geolocalize)
names(cases)
[1] "name"    "address" "lon"     "lat"

#make cases a SpatialPointDataFrame
#since addresses were retrieved using GoogleMaps, I set proj4string as follows
cases.points <- SpatialPointsDataFrame(cases[,3:4], cases, proj4string = CRS("+init=EPSG:3857"))

#get the shapefile
region <- readOGR("R02_11_WGS84.shp")

现在,我可以分别绘制cases.points和shapefile,但不能在同一个图中添加它们。除此之外,正如我所说,我想计算每个多边形中有多少点(即“地区”的人口普查区)。

我必须承认我对地理不太热衷。我怀疑不同的坐标和/或投影参考系统可能是问题,因此我已经检查过了。

head(coordinates(region))
[,1]    [,2]
0 364509.0 5065900
1 363916.3 5056629
2 372585.0 5068078
3 360692.3 5048321
4 356029.7 5062399
5 360012.1 5065663


coordinates(cases)
lon      lat
[1,] 7.323667 45.73664

proj4string(region)
[1] "+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"

proj4string(cases.points)
[1] "+init=EPSG:3857 +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"

shapefile坐标是否以度为单位,而case坐标是十进制的?如果是这样,如何转换它们?

谢谢, 萨罗

1 个答案:

答案 0 :(得分:2)

您有两个不同的预测 - 您的&#34;区域&#34; shapefile在UTM区域32中投影,你告诉R使用Web Mercator进行&#34;案例&#34;。但是,如果您刚从Google下载了案例数据为lat / long,那么您不想告诉R他们的预测是Web Mercator,因为它不是 - 它是未经投影的WGS 84,所以你想要EPSG 4326.Web Mercator是Google用来显示地图的,但是如果你下载lat / long,那只是未经投影的坐标。要正确读取lat / long数据,请使用:

library(sp)
cases.points <- SpatialPointsDataFrame(cases[,3:4], cases, 
                                   proj4string = CRS("+init=EPSG:4326"))

然后,对于投影,您需要spTransform - 尝试:

cases.points.utm32 <- spTransform(cases.points, CRS(proj4string(region)))

使用不恰当或不匹配的投影会产生很多问题,并且它们并不会立即引人注意。

编辑: 要选择多边形内的点,您需要over()函数,也需要sp包(这是一个单独的问题)。请阅读sp包的基本功能以及sp类的工作原理 - 下面基本上是从over()的帮助部分复制的。

region$pointCount <- sapply(over(region, geometry(cases.points), 
                             returnList = TRUE), length)