我有一个包含一些编码多边形结构的SQL数据库。这些可以提取如下
poly <- data.frame(sqldf("SELECT ST_astext(geometry) FROM table"))
data.frame&#39; poly&#39;包含现在可以转换为真实&#39; SpatialPolygons&#39;对象如下(对于第一个字符串)
realWKT(poly[1,1])
我可以为每个字符串执行上一个字符串,并将其保存在向量
中list <- c()
for (i in 1:100){
list <- c(list, readWKT(poly[i,1])
}
我要做的最后一件事是通过利用以下函数创建一个基于所有SpatialPolygons的邻居列表
poly2nb(list)
但遗憾的是,此命令会导致以下错误
Error: extends(class(pl), "SpatialPolygons") is not TRUE
我知道问题与列表的类型有关,但我真的没有看到出路..任何帮助都将不胜感激!
修改
如建议的那样,输出的某些部分。请记住,&#39; poly&#39;是非常长的坐标串
> poly[1,1]
[1] "POLYGON((4.155976 50.78233,...,4.153225 50.76121,4.152384 50.761191,4.151878 50.761194,4.151319 50.761163,4.150872 50.761126))"
> poly[2,1]
[1] "POLYGON((5.139526 50.914059,...,5.140994 50.913612,5.156976 50.895945))"
答案 0 :(得分:0)
这似乎有效:
list <- lapply(1:2,function(i)readWKT(poly[i,1],id=i))
sp <- SpatialPolygons(lapply(list,function(sp)sp@polygons[[1]]))
library(spdep)
poly2nb(sp)
SpatialPolygons
的内部结构相当复杂。 SpatialPolygons
对象是Polygons
个对象(代表地理位置)的集合(列表),每个对象都是Polygon
个对象的列表,表示几何形状。例如,代表美国州的SpatialPolygons
对象有50个左右的Polygons
个对象(每个州一个),每个对象可以有多个Polygon
个对象(如果是不是连续的,例如有岛屿等)。
看起来poly2nb(...)
需要 单个 SpatialPolygons
对象,并根据所包含的Polygons
个对象列表计算邻域结构。您正在传递SpatialPolygons
个对象的 列表 。
因此,挑战在于将SQL查询的结果转换为单个SpatialPolygons
对象。 readWKT(...)
将每一行转换为SpatialPolygons
个对象,每个对象只包含一个Polygons
个对象。所以你必须提取它们并将它们重新组装成一个SpatialPolygons
对象。这一行:
sp <- SpatialPolygons(lapply(list,function(sp)sp@polygons[[1]]))
那样做。前一行:
list <- lapply(1:2,function(i)readWKT(poly[i,1],id=i))
替换你的for (...)
循环,并为每个多边形添加一个多边形id,这对于调用SpatialPolygons(...)
是必需的。