R & Postgis: ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

R & Postgis: ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

下面的代码使我能够将在传单地图上绘制的多边形添加到数据库中的 tables。 但是我遇到了一些困难,因为我的 table 的几何列称为“geom”,而使用传单地图创建的几何列称为“geometry”。

我收到这样的警告消息:

"Error in : Failed to initialise COPY: ERREUR: the column "geometry" does not exists"

ui <- fluidPage(leafletOutput("map"))
 
server <-  function(input, output, session){
  output$map <- renderLeaflet({
  leaflet() %>%  
  addTiles(group = "OSM") %>%
  addDrawToolbar(targetLayerId = NULL, targetGroup = NULL,
                 polygonOptions = drawPolygonOptions(showArea = TRUE, metric=TRUE, shapeOptions=drawShapeOptions(fillColor="aquamarine", fillOpacity=0.8, clickable = TRUE), repeatMode=FALSE),
                 polylineOptions = FALSE, 
                 circleOptions = FALSE, 
                 rectangleOptions = FALSE, 
                 markerOptions = FALSE,
                 circleMarkerOptions = FALSE,
                 singleFeature = FALSE,
                 editOptions = FALSE)})

  observeEvent(input$map_draw_new_feature, {
polygon_coordinates <- input$map_draw_new_feature$geometry$coordinates[[1]]
drawn_polygon <- Polygon(do.call(rbind,lapply(polygon_coordinates,function(x){c(x[[1]][1],x[[2]][1])})))

sps <- SpatialPolygons(list(Polygons(list(drawn_polygon),"drawn_polygon")))
created_polygon  <- st_as_sf(sps, CRS("+proj=longlat +datum=WGS84"))

st_write(created_polygon , pool, "mytable", append = TRUE)
})


}

shinyApp(ui, server)

如何在不更改数据库中的列的情况下解决这个问题?


编辑:

我试过这样丑陋的东西:

created_polygon$geom <- created_polygon$geometry  
    
created_polygon<- created_polygon%>% st_drop_geometry()

但是我收到这条警告消息

"Warning: Error in : COPY returned error: ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)"

猜测 created_polygon 是一个 sf 对象,您可以使用 st_geometry(nc) <- "geom".

重命名 geometry

请在下面找到一个代表。

注意:您需要 sf 1.0.6 或更高版本(如果不是,请取消注释 reprex 的第一行)

Reprex

  • 正在导入数据并读取 nc 对象(即 geometry 列被命名为 "geometry"
#> library(devtools)
#> install_github("r-spatial/sf")

library(sf)

nc <- st_read(system.file("shape/nc.shp", package="sf"))

nc
#> Simple feature collection with 100 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79                       geometry
#> 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 4      123   830     2     145 MULTIPOLYGON (((-76.00897 3...
#> 5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
#> 7      115   350     2     139 MULTIPOLYGON (((-76.00897 3...
#> 8      254   594     2     371 MULTIPOLYGON (((-76.56251 3...
#> 9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...
  • 重命名 geometry 列的代码
st_geometry(nc) <- "geom" 
  • 输出(即"geometry"已更改为"geom"
nc
#> Simple feature collection with 100 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79                           geom
#> 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 4      123   830     2     145 MULTIPOLYGON (((-76.00897 3...
#> 5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
#> 7      115   350     2     139 MULTIPOLYGON (((-76.00897 3...
#> 8      254   594     2     371 MULTIPOLYGON (((-76.56251 3...
#> 9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...

reprex package (v2.0.1)

创建于 2022-02-01

编辑

作为对您的评论的 follow-up,请在下面找到将几何类型从 MULTIPOLYGON 更改为 POLYGON

的方法
library(sf)

# Geometry type at the origin : MULTIPOLYGON
unique(st_geometry_type(nc))
#> [1] MULTIPOLYGON
#> 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE
  • 将几何类型从 MULTIPOLYGON 转换为 POLYGON
  • 的代码
nc <- st_cast(nc, "POLYGON")
#> Warning in st_cast.sf(nc, "POLYGON"): repeating attributes for all sub-
#> geometries for which they may not be constant
  • 输出:几何现在是 POLYGON
  • 类型
unique(st_geometry_type(nc))
#> [1] POLYGON
#> 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE
  • 上次检查(请参阅 geom 列)
nc
#> Simple feature collection with 108 features and 14 fields
#> Geometry type: POLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>      AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1   0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2   0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3   0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4   0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 4.1 0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 4.2 0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5   0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6   0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7   0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8   0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#>     NWBIR74 BIR79 SID79 NWBIR79                           geom
#> 1        10  1364     0      19 POLYGON ((-81.47276 36.2343...
#> 2        10   542     3      12 POLYGON ((-81.23989 36.3653...
#> 3       208  3616     6     260 POLYGON ((-80.45634 36.2425...
#> 4       123   830     2     145 POLYGON ((-76.00897 36.3196...
#> 4.1     123   830     2     145 POLYGON ((-76.02717 36.5567...
#> 4.2     123   830     2     145 POLYGON ((-75.90199 36.5562...
#> 5      1066  1606     3    1197 POLYGON ((-77.21767 36.2409...
#> 6       954  1838     5    1237 POLYGON ((-76.74506 36.2339...
#> 7       115   350     2     139 POLYGON ((-76.00897 36.3196...
#> 8       254   594     2     371 POLYGON ((-76.56251 36.3405...

reprex package (v2.0.1)

创建于 2022-02-01