【问题标题】:R WFS overcome server maximum 3D BAGR WFS 克服服务器最大 3D BAG
【发布时间】:2022-12-30 00:33:25
【问题描述】:

对于物种生态位建模,我正在尝试从 TU Delft https://3dbag.nl/nl/download 的 briljant 3D BAG 数据中获取建筑物高度。我想为哈莱姆市做这件事。可以手动选择和下载图块。但这是相当费力的,而且容易出错(一块缺失的瓷砖),我想在更多城市重复这个动作。所以我尝试使用 AFS 服务来下载功能。我为 AFS 请求创建了一个范围为 1.2 的 Haarlem 边界框。然而,服务器传送的最大记录是 5000。尽管有很多替代尝试,但到目前为止我都未能克服这个数字。这部分是由于我对 AWF 语义的混淆,当我检查 GetCapabilities 时,很难找出名称空间、featureTypes 和各个属性(或属性)。我试过的:

添加分页。但是到目前为止我读过的所有教程都需要服务器最大值(resultType =“hits”)之外的实际/最大功能的数量。而且我无法轻松检索边界框限制的最大值。

选择瓷砖。我认为应该可以使用 tile_id(来自 BAG3D_v2:bag_tiles_3k 层的属性)提取与边界框匹配的图块 ID,然后以某种方式构建应用或循环以提取每个图块的特征。但是我已经无法创建一个 cql_filter 来选择一个单独的图块。

创建瓷砖。由于我不完全确定来自 3D BAG 服务的单个图块是否已经超过 5000 个特征限制,因此另一种方法可能是使用 R 包 slippymath 将边界框拆分为许多小图块,然后提取每个图块的特征。但是过滤的挑战仍然是一样的。

对此有任何帮助,我们将不胜感激。我以多种不同方式使用的基本代码:

library(httr)

url <- parse_url("https://data.3dbag.nl/api/BAG3D_v2/wfs")
url$query <- list(service = "WFS",
                  version = "2.0.0",
                  request = "GetFeature",
                  typename = "BAG3D_v2:lod22",
                  #cql_filter = "BAG3D_v2:tile_id ='4199'",
                  bbox = "100768.4,482708.5,107923.1,494670.4",
                  startindex = 10000,
                  sortBy = "gid")
request <- build_url(url)
test <- st_read(request)
qtm(test)

【问题讨论】:

    标签: r gis


    【解决方案1】:

    一种解决方案是将 startindex 5000 循环 5000。然后当返回的形状包含的形状少于 5000 时停止代码,这意味着它已经完成(除非特征总数是 5000 的倍数......)

    下面一段代码改编自happign包。

    library(httr)
    library(sf)
    
    # function for building url
    build_3DBAG_url <- function(startindex){
       url <- parse_url("https://data.3dbag.nl/api/BAG3D_v2/wfs")
       url$query <- list(service = "WFS",
                         version = "2.0.0",
                         request = "GetFeature",
                         typename = "BAG3D_v2:lod22",
                         #cql_filter = "BAG3D_v2:tile_id ='4199'",
                         bbox = "100768.4,482708.5,107923.1,494670.4",
                         startindex = startindex,
                         count = 5000,
                         sortBy = "gid")
       url <- build_url(url)
       return(url)
    }
    
    # initialize first request
    resp <- read_sf(build_3DBAG_url(startindex = 0))
    message("Features downloaded : ", nrow(resp), appendLF = F)
    
    # loop until returned shape is less than 5000
    i <- 5000
    temp <- resp
    while(nrow(temp) == 5000){
       message("...", appendLF = F)
       temp <- read_sf(build_3DBAG_url(startindex = i))
       resp <- rbind(resp, temp)
       message(nrow(resp), appendLF = F)
       i <- i + 5000
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多