使用st_read导入WFS数据时坐标反转(XY)的问题

时间:2019-04-23 16:11:25

标签: r gis sf

我正在尝试使用通过WFS分发的法国空间数据。我想在允许用户更新数据的Shiny应用程序中使用这些数据,所以我真的更喜欢使用WFS,而不仅仅是将来自shapefile的数据嵌入应用程序中。

我可以获取数据,但是从某种意义上来说,它似乎有所偏离(坐标似乎已经颠倒了(X代替Y,Y代替X代替)),从而产生了法国的怪异景象。我对空间分析和数据的细节不是很熟悉,并且肯定缺少一些东西。

我使用功能st_read导入了数据,该功能与WFS服务的链接一起提供。然后,我得到了法国水文网络的上下图。但是,当我使用相同的WFS链接连接QGIS时,地图是正确的,因此我猜SF和QGIS不能以相同的方式完全处理事物,但是调查原因超出了我的理解范围。

在查看边界框时,我们看到x的返回值与y的期望值相对应,反之亦然。

我遇到了由同一提供者(http://www.sandre.eaufrance.fr/)使用WFS分发的两个不同数据集的问题。第一个是显示点,数据包含XY坐标,因此我删除了几何图形,并使用st_as_sf并在coords参数中将X和Y字段的名称转换为数据框。这是一个肮脏的解决方法,但不适用于我的第二个具有MULTILINESTRING几何图形的数据集。因此,我希望以一种正确的格式导入/转换数据的干净方法。

这是重现意外行为的最小代码示例。

library(dplyr)
library(sf)
library(ggplot2)

data <- st_read("http://services.sandre.eaufrance.fr/geo/zon_FXX?Request=GetCapabilities&SERVICE=WFS&VERSION=1.1.0",
                layer = "SegClassContinuiteEco_Liste2",
                stringsAsFactors = FALSE)

st_bbox(data)

ggplot() +
geom_sf(data = data)

上面的代码给出了这张地图: wrong map

正确的地图应如下所示(我旋转并翻转了原图): correct map

我的sessionInfo:

R version 3.5.3 (2019-03-11)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252   
[3] LC_MONETARY=French_France.1252 LC_NUMERIC=C                  
[5] LC_TIME=French_France.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] sf_0.7-3        forcats_0.4.0   stringr_1.4.0   dplyr_0.8.0.1   purrr_0.3.2    
 [6] readr_1.3.1     tidyr_0.8.3     tibble_2.1.1    ggplot2_3.1.1   tidyverse_1.2.1

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.1       cellranger_1.1.0 pillar_1.3.1     compiler_3.5.3  
 [5] plyr_1.8.4       class_7.3-15     tools_3.5.3      jsonlite_1.6    
 [9] lubridate_1.7.4  gtable_0.3.0     nlme_3.1-137     lattice_0.20-38 
[13] pkgconfig_2.0.2  rlang_0.3.4      DBI_1.0.0        cli_1.1.0       
[17] rstudioapi_0.10  yaml_2.2.0       haven_2.1.0      e1071_1.7-1     
[21] withr_2.1.2      xml2_1.2.0       httr_1.4.0       fs_1.2.7        
[25] generics_0.0.2   hms_0.4.2.9001   classInt_0.3-1   grid_3.5.3      
[29] tidyselect_0.2.5 glue_1.3.1       R6_2.4.0         fansi_0.4.0     
[33] readxl_1.3.1     modelr_0.1.4     magrittr_1.5     usethis_1.5.0   
[37] units_0.6-2      backports_1.1.4  scales_1.0.0     rvest_0.3.2     
[41] assertthat_0.2.1 colorspace_1.4-1 utf8_1.1.4       stringi_1.4.3   
[45] lazyeval_0.2.2   munsell_0.5.0    broom_0.5.2      crayon_1.3.4 

感谢您提供给我的任何建议。

塞德里克

1 个答案:

答案 0 :(得分:0)

我也无法下载您的数据。要交换y和x,您可能需要尝试

d = st_geometry(data)
drev = d * matrix(c(0,1,1,0), 2, 2)
st_geometry(data) = drev

如果您可以某种形式使用数据集,那将是很棒的,PROJ 6和WKT2轴顺序应得到照顾,希望也可以由sf处理。