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
下面的代码使我能够将在传单地图上绘制的多边形添加到数据库中的 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