将lat / long或URM坐标添加到R中的shapefile

时间:2015-02-25 15:48:34

标签: r gis rgdal maptools

我是R中的GIS新手,我正在尝试将lat / long或UTM坐标添加到shapefile中。我从这里下载了芝加哥市(City_Boundaries.shp)的边界:http://www.cityofchicago.org/city/en/depts/doit/supp_info/gis_data.html

我加载了maptools和rgeos库:

library(maptools)
library(rgeos)
library(rgdal)

我将数据带入R&尝试为区域16T添加UTM代码:

city<- readShapeSpatial("C:/Users/Luke.Gerdes/Documents/GIS Files/Chicago/City_Boundary.shp")
proj4string(city) <- CRS("+proj=utm +north +zone=16T + datum=WGS84")

然而,结果数据对我来说没有意义。当我看一下“city”中的“coords”槽时,坐标值例如是X = 1092925和Y = 1944820。我使用外部工具(http://home.hiwaay.net/~taylorc/toolbox/geography/geoutm.html)来查找GPS坐标。结果为:lat = 17.511,long = -81.42。这是介于牙买加和洪都拉斯海岸之间的某个地方。在我看来,shapefile坐标存在于他们自己的宇宙中;正如名称shapefile或许暗示的那样,坐标提供了城市形状的准确描述,但这些坐标不会自动映射到地球上。

我的最终目标是确定芝加哥内是否发生了许多地理标记事件。我很乐意将这些由lat / long列出的点转换为UTM,如下所示:

  SP <- SpatialPoints(cbind(-87.63044, 41.79625), proj4string=CRS("+proj=longlat +datum=WGS84"))
  SP <- spTransform(SP, CRS("+proj=utm +north +zone=16T +datum=WGS84"))

如果更有意义的话,我也愿意尝试以原始格式处理事件数据。最终,我需要帮助将芝加哥城市边界变成一个多边形,我可以根据我的事件数据进行检查。像这样:

  gContains(city, SP)

如何将我的shapefile和事件数据放入一个共同(准确)的参考框架中,以便检查点是否在城市中?我们将非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

一般建议是使用rgdal::readOGR读取shapefile,如

library(rgdal)
city = readOGR(".", "City_Boundary")

这不仅会给city正确的CRS:

proj4string(city)
[1] "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs +ellps=GRS80 +towgs84=0,0,0"

但如果您想在不重新投影的情况下进行更改,也会发出警告:

proj4string(city) <- CRS("+proj=utm +north +zone=16T + datum=WGS84")
Warning message:
In `proj4string<-`(`*tmp*`, value = <S4 object of class "CRS">) :
  A new CRS was assigned to an object with an existing CRS:
+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs +ellps=GRS80 +towgs84=0,0,0
without reprojecting.
For reprojection, use function spTransform in package rgdal

意味着在执行此操作后,city 错误。您可以使用city重新投影spTransform,如

city = spTransform(city, CRS("+proj=utm +north +zone=16T + datum=WGS84"))

您的rgeos::gContains呼叫可能会失败,因为utm的两个CRS字符串不同;删除前者+ datum=WGS84中的空格,您就可以了(TRUE)。