FlatGeobuf

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2022-04-26

FlatGeobuf是一种针对矢量的优化二进制编码,基于 Flatbuffers ,它通过利用 Packed Hilbert R-Tree 空间索引,支持快速边界框空间过滤。FlatGeobuf的性能使其成为通过HTTP/“云”传输空间数据的首选格式之一。

../../_images/flatgeobuf.jpg

更多信息

有关FlatGeobuf的更多信息,请访问:

文件列表

FlatGeobuf文件通常是具有fgb文件扩展名的单个二进制文件,例如:

countries.fgb

备注

想要跟随的Windows用户可以转换 MS4W 包括在内 demo.db SpatiaLite数据库转换为FlatGeobuf文件(适用于 国家 表)和命令(在内部执行 /ms4w/apps/local-demo/data/ )::

ogr2ogr -f FlatGeobuf countries.fgb demo.db countries

数据访问/连接方法

可通过OGR在地图服务器中访问FlatGeobuf FlatGeobuf driver 。您必须使用GDAL版本3.1.0或更高版本才能访问FlatGeobuf。

OGR使用FlatGeobuf文件中的空间层名称作为层。

连接参数必须包括 .fgb 扩展名,数据参数应该是OGR层的名称。

CONNECTIONTYPE OGR
CONNECTION "name.fgb"
DATA "layername"

小技巧

从MapServer 7.6.0版本开始,您还可以指定OGR驱动程序选项,并且对于FlatGeobuf驱动程序,您可以禁用对无效数据的检查,这对于实现最高性能至关重要:

CONNECTIONOPTIONS
  "VERIFY_BUFFERS" "NO" # for maximum performance
END

步骤1:使用ogrinfo检查

首先,您应该确保您的本地GDAL/OGR版本包含“FlatGeobuf”驱动程序,方法是使用 --formats 命令:

ogrinfo --formats

   Supported Formats:
        ...
        FlatGeobuf -vector- (rw+v): FlatGeobuf
        ...

确认拥有FlatGeobuf驱动程序后,即可在文件上尝试ogrinfo命令以获取空间图层列表:

ogrinfo countries.fgb

  INFO: Open of `countries.fgb'
      using driver `FlatGeobuf' successful.
  1: countries (Multi Polygon)

现在使用ogrinfo获取有关空间‘Country’层结构的信息:

ogrinfo countries.fgb countries -summary

      INFO: Open of `countries.fgb'
            using driver `FlatGeobuf' successful.

      Layer name: countries
      Geometry: Multi Polygon
      Feature Count: 177
      Extent: (-180.000000, -90.000000) - (180.000000, 83.645130)
      Layer SRS WKT:
      GEOGCRS["WGS 84",
          ENSEMBLE["World Geodetic System 1984 ensemble",
              MEMBER["World Geodetic System 1984 (Transit)"],
              MEMBER["World Geodetic System 1984 (G730)"],
              MEMBER["World Geodetic System 1984 (G873)"],
              MEMBER["World Geodetic System 1984 (G1150)"],
              MEMBER["World Geodetic System 1984 (G1674)"],
              MEMBER["World Geodetic System 1984 (G1762)"],
              MEMBER["World Geodetic System 1984 (G2139)"],
              ELLIPSOID["WGS 84",6378137,298.257223563,
                  LENGTHUNIT["metre",1]],
              ENSEMBLEACCURACY[2.0]],
          PRIMEM["Greenwich",0,
              ANGLEUNIT["degree",0.0174532925199433]],
          CS[ellipsoidal,2],
              AXIS["geodetic latitude (Lat)",north,
                  ORDER[1],
                  ANGLEUNIT["degree",0.0174532925199433]],
              AXIS["geodetic longitude (Lon)",east,
                  ORDER[2],
                  ANGLEUNIT["degree",0.0174532925199433]],
          USAGE[
              SCOPE["Horizontal component of 3D system."],
              AREA["World."],
              BBOX[-90,-180,90,180]],
          ID["EPSG",4326]]
      Data axis to CRS axis mapping: 2,1
      featurecla: String (0.0)
      scalerank: Integer (0.0)
      labelrank: Integer (0.0)
      sovereignt: String (0.0)
      sov_a3: String (0.0)
      adm0_dif: Integer (0.0)
      level: Integer (0.0)
      type: String (0.0)
      ...

步骤2:在 Mapfile 中添加图层

对于OGR连接,始终建议设置CONNECTIONTYPE、CONNECTIONTYPE和DATA,如下所示:

/* Countries */
LAYER
  NAME "countries"
  TYPE POLYGON
  STATUS ON
  CONNECTIONTYPE OGR
  CONNECTION "countries.fgb"
  DATA "countries"            # the OGR layername, found through ogrinfo
  CONNECTIONOPTIONS
    "VERIFY_BUFFERS" "NO"     # for maximum performance (requires MapServer >=7.6.0)
  END #connectionoptions
  EXTENT -180.000000 -90.000000 180.000000 83.645130 # for maximum performance
  PROCESSING "CLOSE_CONNECTION=DEFER" # for maximum performance
  CLASS
    NAME "World Countries"
    STYLE
      COLOR 200 200 200
      OUTLINECOLOR 0 0 0
      WIDTH 0.1
    END #style
  END #class
END #layer

步骤3:使用shp2img测试您的映射文件

使用MapServer命令行实用程序 Sp2IMG 要验证 Mapfile 是否创建了有效的地图图像,并显示绘制时间,例如:

shp2img -m flatgeobuf.map -o ttt.png -map_debug 3

msDrawMap(): rendering using outputformat named png (AGG/PNG).
msDrawMap(): WMS/WFS set-up and query, 0.000s
msDrawMap(): Layer 0 (countries), 0.012s
msDrawMap(): Drawing Label Cache, 0.002s
msDrawMap() total time: 0.015s
msSaveImage(flatgeobuf.png) total time: 0.008s
../../_images/countries-shp2img.png

可选:配置WFS服务以输出FlatGeoBuf

从MapServer 6.0开始,您可以为您的WFS(或WMS)服务、OGR连接配置OUTPUTFORMAT。请参阅 废气再循环输出 有关更多信息,请参阅文档。

首先,必须在映射文件中为FlatGeobuf指定OUTPUTFORMAT,例如:

OUTPUTFORMAT
  NAME "OGRFLATGEOBUF"
  DRIVER "OGR/FlatGeoBuf"
  FORMATOPTION "STORAGE=filesystem"
  FORMATOPTION "FORM=simple"
  FORMATOPTION "FILENAME=result.fgb"
  FORMATOPTION "LCO:VERIFY_BUFFERS=NO"
END

下一步,您必须使用 wfs_getfeature_formatlist 元数据参数,在层级别,例如:

METADATA
  "ows_title"         "World Countries"
  "ows_abstract"      "World Countries, served by MS4W"
  "ows_include_items" "all"
  "gml_include_items" "all"
  "gml_featureid"     "ogc_fid"
  "wfs_getfeature_formatlist" "OGRGML,OGRFLATGEOBUF"
  "ows_geomtype"      "MultiPolygon"
  "wfs_use_default_extent_for_getfeature" "false"
END

通过GetCapilities请求验证OUTPUTFORMAT,并查找GetFeature/ResultFormat部分,例如:

http://127.0.0.1/cgi-bin/mapserv.exe?
   map=/ms4w/apps/local-demo/flatgeobuf.map
   &SERVICE=wfs
   &VERSION=1.0.0
   &REQUEST=GetCapabilities

它给出一个包含以下内容的响应:

../../_images/wfs-outputformat-flatgeobuf.png

一旦我们看到 OGRFLATGEOBUF 在GetCapables响应中,然后我们可以添加 &OUTPUTFORMAT=OGRFLATGEOBUF 添加到任何WFS GetFeature请求的结尾,例如:

http://127.0.0.1/cgi-bin/mapserv.exe?
   map=/ms4w/apps/local-demo/flatgeobuf.map
   &SERVICE=WFS
   &REQUEST=GetFeature
   &VERSION=2.0.0
   &TYPENAMES=ms:countries
   &STARTINDEX=0
   &COUNT=1000
   &SRSNAME=urn:ogc:def:crs:EPSG::4326
   &BBOX=-333.02127061643835759,-189,326.66640061643835224,189,urn:ogc:def:crs:EPSG::4326
   &OUTPUTFORMAT=OGRFLATGEOBUF

和一个名为 result.fgb 将会被退还。