【问题标题】:How to import OSM polygons data from PostGIS to R?如何将 OSM 多边形数据从 PostGIS 导入 R?
【发布时间】:2016-04-11 04:24:30
【问题描述】:

我是使用 R 进行空间分析的新手。使用 this 链接我已经下载了 .osm.pbf 格式的 OSM 数据。然后我使用osm2pgsql 工具在 PostgreSQL(PostGIS 扩展)中获取数据。现在我的数据库中有几个表,我想访问 R 中的多边形表,然后对多边形矢量数据执行空间分析。我一直在搜索分配,但无法在 R 中导入所需的数据。我发现 this 教程与我正在寻找的非常相似,但它在 Python 中。我想使用 R 从 PostGIS 访问多边形数据。

因此,基本上我想知道 R 与 PostGIS 的交互。任何人都可以向我推荐任何关于这个主题的书吗?由于到目前为止我找不到适用于我的 Windows 10 64 位机器的博客或教程。

感谢您的宝贵时间并期待您的建议。

【问题讨论】:

  • 非常宽泛的问题,但这个cran.r-project.org/web/packages/dplyr/vignettes/databases.html 可以帮助您开始
  • @MLavoie 到目前为止我发现问题在于 rgdal,我必须以与 postgis 交互的方式对其进行配置。如果您有任何想法,那将很有帮助。谢谢。
  • 感谢 MLavoie,使用此链接我可以在 R 中获取表格,但我必须从中构建 SpatialPolygon。由于我拥有的表格格式,这很忙。但是,如果我使用 rgdal,那么这里提到的分配会更容易:gis.stackexchange.com/questions/64950/…
  • 但由于我的操作系统是 Windows 10(64 位),rgdal 不附带对 postgis 的隐式驱动程序支持。我正在研究它并将发布完整的解决方案。谢谢你的时间。 :)

标签: r postgresql postgis spatial ogr


【解决方案1】:

我不懂R,但对postgis很熟悉。 postgis只是SQL函数,如果可以使用Select就可以访问postgis,

所以如果你想访问多边形,只需在 postgres 中创建新函数。

但是如果你想显示多边形,你需要用 R 检查有哪些功能可用,我通常使用Openlayer javascript api 在网页中显示我的结果。

【讨论】:

  • 是的,我非常了解 Leaflet 和 OpenLayers3,但我目前的问题是从 R 连接到 postgis,可能使用 rgdal。感谢您的宝贵时间。
  • 但是connect to postgis 是什么意思?为什么连接postgresql不一样?
  • 因为我有几何(多边形)数据,所以我提到了postgis。我可以使用 sqldf 或 RPostgreSQL 连接到 postgres。但对于空间数据,我必须配置 rgdal!
  • 我明白了,我又不熟悉R 并且不确定他们是否有办法接收几何对象。但是您始终可以使用ST_AsText postgis 函数将几何对象作为字符串返回。这样,您将该字符串传递给 Leaflet 或 Openlayer,让他们处理几何部分,您的通信就像任何 postgres SELECT
  • 是的,我正在研究它,并会在我找到它时发布完整的解决方案。谢谢你的时间兄弟:)
【解决方案2】:

我仍然没有找到使用 R 中可用的 rgdal 包从 PostGIS 获取所需数据的方法。可能是因为我的操作系统问题。 (我不确定,因为我不是专家)。但我找到了 rgdal 的替代品,它完全符合我的要求。代码如下:

library(RPostgreSQL)
library(rgeos)
library(sp)

# Load data from the PostGIS server
conn = dbConnect(
  dbDriver("PostgreSQL"), dbname="dbNAME", host="localhost", port=5432, 
  user="username", password="pw"
)

strSQL = "SELECT osm_id, name, area, highway, railway, place, ST_AsText(way) AS wkt_geometry FROM table"
df = dbGetQuery(conn, strSQL)

#Geomtery column as R list
geo_col = df$wkt_geometry

polygon_list = suppressWarnings(lapply(geo_col, function(x){
x <- gsub("POLYGON\\(\\(", "", x)
x <- gsub("\\)", "", x)
x <- strsplit(x, ",")[[1]]

#Now each polygon has been parsed by removing POLYGON(( from the start and )) from the end
#Now for each POLYGON its xValues and yValues are to be extracted to for Polygon object
xy <- strsplit(x, " ")

v_xy = suppressWarnings(sapply(xy, function(p){        
  xValue = p[1]
  yValue = p[2]
  vec = c(xValue, yValue)
}))

#Now we have all x values in first column of v_xy and all y values in second column of v_xy
#Let us make the Polygon object now
p_xvalues = as.numeric(v_xy[1, ])
p_yvalues = as.numeric(v_xy[2, ])
p_object <- Polygon(cbind(p_xvalues, p_yvalues))      
}))

#Now we have all of the polygons in polygon object format
#Let us join it with main data frame, i.e. df
df$object_polygon <- polygon_list
#View(df)

#Now Let us form SpatialPolygons() object out of it
Ps_list = list()
for (i in seq(nrow(df))) {
  Ps_list[[i]] <- Polygons(polygon_list[i], ID=df[i,][1])
}
SPs = SpatialPolygons(Ps_list)

#Now FINALY its the time to form SpatialPolygonsDataFrame
row.names(df) = df$osm_id
SPDF = SpatialPolygonsDataFrame(Sr = SPs, data = df[, 1:6], match.ID = TRUE) 

因此,基本上我必须编写一个解析器来获取 readOGR() 一行所需的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2011-09-18
    • 2021-01-31
    • 2017-01-29
    • 2023-03-06
    • 2017-02-16
    • 2014-05-03
    • 2017-01-12
    相关资源
    最近更新 更多