如何在R中导入openstreetmaps形状文件并提取纬度/长度质心?

时间:2016-04-16 20:45:43

标签: r geospatial latitude-longitude shapefile rgdal

我正在尝试使用rgdal包导入R中的openstreetmaps形状文件。 我下载的形状文件中有5个组件:

places.cpg
places.dbf
places.prj
places.shp
places.shx

可以在以下位置访问这些文件:

https://drive.google.com/open?id=0B1ITb_7lHh1EUFVfVWc4ekRfSnc

我必须做以下事情: 1)导入形状文件 2)在多边形的情况下,提取点的纬度/长度或形状的质心 3)将lat / long对连接到dbf文件以进行一些分析

我陷入导入的第一阶段,我正在运行以下代码:

shape1 <- readOGR(dsn = "try", layer = "places")

此处'try'是我工作目录中的文件夹,其中包含上述openstreetmaps中的所有5个'place'文件。

执行此操作时出现以下错误:

Error in readOGR(dsn = "try", layer = "places") : no features found
In addition: Warning message:
In ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv =
use_iconv,  : ogrInfo: all features NULL

我需要这个导入的帮助。或者,如果有一种方法可以直接从其中一个位置形状文件中提取lat / long,我可以在excel中打开places.dbf文件并添加lat / long。

3 个答案:

答案 0 :(得分:1)

使用readOGR()函数遇到麻烦时:另一种可能是使用maptools包。它会创建SpatialXXXDataFrames,因此您可以使用rgeos等所有功能。

library(maptools)

setwd("/your/data/path/")

places <- readShapeSpatial("places")
# ... your geospatial functions, like
plot(places)

可能您需要调整空间数据的投影。对于OSM-Data,您需要在https://wiki.duraspace.org/display/DSDOC5x/Discovery#Discovery-DiscoverySolrIndexMaintenance找到WGS84(或EPSG:4326)的proj4string

因此,您可以在R中调整投影:

proj4string(places) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")

有关多边形质心的计算/“提取”,请参阅spatialreference.org post。

答案 1 :(得分:0)

您需要使用shapefile(.shp)作为DSN。将SpatialPointsDataFrame变为&#34;正常&#34; data.frame会给&#34; ugh&#34;列名 为lang&amp; lat,所以你可以重命名它们以使它们更有用:

library(sp)
library(rgdal)

places <- readOGR("places/places.shp", "places", verbose=FALSE, stringsAsFactors=FALSE)

places_df <- setNames(as.data.frame(places),
                      c("osm_id", "name", "type", "population", "longitude", "latitude"))

head(places_df)

##     osm_id          name    type population longitude latitude
## 1 25431184   Stockertown village         NA -75.26156 40.75446
## 2 25716549 Mechanicsburg village         NA -77.00473 40.21020
## 3 25762119     Mansfield  hamlet         NA -77.07929 41.80569
## 4 25840249  New Columbia  hamlet         NA -76.87368 41.03368
## 5 25840585  Williamsport    town      29381 -77.00277 41.24933
## 6 25930002       Hershey    town      14257 -76.65060 40.28549

答案 2 :(得分:0)

我无法让这个包工作,但是“shapefile”包为我做了工作。它有一个read.shapefile函数,用于导入shapefile。