SF对象的多边形错误分配,可能是bbox问题

时间:2018-02-12 20:00:30

标签: r polygon sf

所以我有两个SF对象,一个多边形和一个多面体类,代表一个城市的邻域和子邻域。两者都来自ArcGIS并覆盖完全相同的区域。然而,当我发现两个物体时,在我的传单图中略微错误地指出了次邻居的情况, as shown here。 最初的预测是:

iver `ESRI Shapefile'
Simple feature collection with 92 features and 19 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 55500 ymin: 428647.4 xmax: 101032.6 ymax: 447000
epsg (SRID):    NA
proj4string:    +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs

ESRI Shapefile'
Simple feature collection with 7 features and 7 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 438682.1 ymin: 6771629 xmax: 512270.9 ymax: 6800944
epsg (SRID):    3857
proj4string:    +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs

之后我用st_transform将两者都改为WGS84。

传单代码是:

   leaflet(width = "100%") %>%
  addProviderTiles("Stamen.Terrain") %>%
  setView(lng = 4.314960, lat = 51.916024, zoom = 10) %>%
  addPolygons(data = rtdm_gebieden, weight = 2, color = "black", fillOpacity = 0.8, fillColor = groen_kleuren) %>%
  addPolygons(data = rtdm_buurten, weight = 2, color = "red")

我怀疑这是因为sf对象的bbox略有不同

SF对象1

Geometry set for 92 features 
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 3.940974 ymin: 51.84307 xmax: 4.602129 ymax: 52.0055
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs

sf对象2

Geometry set for 7 features 
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 3.940748 ymin: 51.84212 xmax: 4.601808 ymax: 52.00453
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs

我尝试将一个bbox设置为另一个的bbox,但是使用st_bbox不起作用。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

在评论中讨论后找到解决方案

不同空间数据集之间的这种轻微转变似乎经常出现在比利时(例如比利时兰伯特EPSG 31370)和荷兰空间层。

第一个SF对象在导入时显示:

epsg (SRID):    NA
proj4string:    +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs

缺少EPSG代码,并且在proj4字符串开头的快速搜索指向Amersfoort投影EPSG:28992,其中包含以下proj4字符串:

+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +no_defs 

在原始SF对象中结束的+towgs84部分是观察到的移位的来源。根据参考数据库,它是否存在...
来自this Postgis forum answer的Jan Hartman表示:

  

问题在于国家电网有不同的基准面   比WGS84:它使用略微不同的椭球来近似   地球表面。使用标准PROJ epsg文件,此Datum   差异将计算,并且您得到的差异高达100   米。要完全转换到WGS84,您需要额外的   PROJ参数字符串中的“+ towgs”参数。

@Sjoerd Braaksma应用的一个解决方案是回到生成图层的软件(即ArcGIS)并在那里修复投影。

另一种解决方案是在R中导入数据时强制R通过epsg代码分配投影,以确保使用正确的投影:

SF <- read_sf(your_layer, crs = 28992)

这将导致以下警告在此处可以忽略,因为实际上我们不想重新投影此数据:

Warning message:
st_crs<- : replacing crs does not reproject data; use st_transform for that  warning

以下是比利时数据集的示例:

> SF <- read_sf(dsn = "mylayer.shp")
> SF
## Simple feature collection with 2664 features and 19 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: 22265.45 ymin: 21162.99 xmax: 295157.4 ymax: 244027.9
## epsg (SRID):    NA
## proj4string:    +proj=lcc +lat_1=49.8333339 +lat_2=51.16666733333333 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +units=m +no_defs

强制投影:

> SF <- read_sf(dsn = "mylayer.shp", crs = 31370)
## Warning message:
## st_crs<- : replacing crs does not reproject data; use st_transform for that 

> SF
## Simple feature collection with 2664 features and 19 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: 22265.45 ymin: 21162.99 xmax: 295157.4 ymax: 244027.9
## epsg (SRID):    31370
## proj4string:    +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747 +units=m +no_defs