Search code examples
rpostgresqlshinypostgisr-sf

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


The code below enables me to add polygons I draw on a leaflet map to tables in my database. However I have some difficulties since the geometry column of my table is called "geom" and the geometry column created with the leaflet map is called "geometry".

I get a warning message like this:

"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)

How can I solve this without altering the column in my database ?


EDIT:

I tried something ugly like this:

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

But I get this warning message

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


Solution

  • Guessing that created_polygon is an sf object, you can rename the geometry column using st_geometry(nc) <- "geom".

    Please, find below a reprex.

    NB: you need to have the version of sf 1.0.6 or higher (if not, please uncomment the first rows of the reprex)

    Reprex

    • Importing data and reading nc object (i.e. the geometry column is named "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...
    
    • Code to rename the geometry column
    st_geometry(nc) <- "geom" 
    
    • Output (i.e. "geometry" has been changed into "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...
    

    Created on 2022-02-01 by the reprex package (v2.0.1)


    EDIT

    As a follow-up to your comment, please find below the way to change the geometry type from MULTIPOLYGON to POLYGON

    library(sf)
    
    # Geometry type at the origin : MULTIPOLYGON
    unique(st_geometry_type(nc))
    #> [1] MULTIPOLYGON
    #> 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE
    
    • Code to convert geometry type from MULTIPOLYGON to 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
    
    • Output: the geometry is now of type POLYGON
    unique(st_geometry_type(nc))
    #> [1] POLYGON
    #> 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE
    
    • Last check (please see the geom column)
    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...
    

    Created on 2022-02-01 by the reprex package (v2.0.1)