休息API

进口商概念

importer rest API是围绕表示单个导入的对象树构建的,其结构如下:

  • 进口
    • 目标工作区

    • 数据

    • 任务(一个或多个)
      • 数据

      • 图层

      • 转换(一个或多个)

一个 import 指的是顶层对象,是一个类似于整个导入状态的“会话”实体。它维护与整个导入相关的信息,诸如用户信息、时间戳以及与所有任务一致的可选信息,诸如目标工作空间、共享输入数据(例如,目录、数据库)。可以对任意数量的任务对象进行导入。

A data 是对导入(总体)或任务的源数据的描述。如果导入具有全局数据定义,则通常指的是聚合存储,如目录或数据库,而与任务关联的数据指的是此类聚合中的单个元素,如单个文件或表。

A task 向导入程序表示注册一个新层或更改现有层所需的工作单元,并包含以下信息:

  • 正在导入的数据

  • 作为导入目标的目标存储区

  • 目标层

  • 任务的数据(称为其源)是作为任务一部分处理的数据。

  • 在导入数据之前需要应用到数据的转换

这些数据有多种形式,包括:

  • 空间文件(shapefile、geotiff、kml等…)

  • 空间文件目录

  • 空间数据库中的表

  • 服务器将从中下载数据的远程位置

任务分为“直接”或“间接”。A 直接任务 在其中导入的数据不需要导入转换。它是直接进口的。这种任务的一个例子就是简单地导入现有的形状文件。一个 间接任务 是一个需要 转型 到原始导入数据。间接任务的一个例子是将Shapefile导入现有PostGIS数据库。间接任务的另一个例子可能涉及将CSV文件作为输入,将x和y列转换为点,将字符串列重新映射为时间戳,最后将结果导入PostGIS。

REST API引用

所有的进口

/进口

方法

行动

状态代码/标题

输入

产量

参数

GET

检索所有导入

200

n/a

导入集合

n/a

POST

创建新导入

201,带位置标题

n/a

进口

异步=假/真,执行=假/真

正在检索所有导入的列表

GET /imports

结果为:

Status: 200 OK
Content-Type: application/json

        {
           "imports": [{
             "id": 0,
             "state": "COMPLETE",
             "href": "http://localhost:8080/geoserver/rest/imports/0"

           }, {
             "id": 1,
             "state": "PENDING",
             "href": "http://localhost:8080/geoserver/rest/imports/1"
           }]
        }

创建新导入

发布到/imports路径导入JSON对象创建新的导入会话:

Content-Type: application/json

{
   "import": {
      "targetWorkspace": {
         "workspace": {
            "name": "scratch"
         }
      },
      "targetStore": {
         "dataStore": {
            "name": "shapes"
         }
      },
      "data": {
        "type": "file",
        "file": "/data/spearfish/archsites.shp"
      }
   }
}

参数为:

名字

可选的

描述

目标工作区

Y

要导入到的目标工作区

目标存储

Y

要导入到的目标存储区

数据

Y

要导入的数据

仅仅创建不会启动导入,但它可以根据目标自动填充其任务。例如,通过引用要导入的形状文件的目录,创建将自动填充一个任务,以将每个形状文件作为新层导入。

对上述POST请求的响应为:

Status: 201 Created
Location: http://localhost:8080/geoserver/rest/imports/2
Content-Type: application/json

{
  "import": {
    "id": 2,
    "href": "http://localhost:8080/geoserver/rest/imports/2",
    "state": "READY",
    "targetWorkspace": {
      "workspace": {
        "name": "scratch"
      }
    },
    "targetStore": {
      "dataStore": {
        "name": "shapes",
        "type": "PostGIS"
      }
    },
    "data": {
      "type": "file",
      "format": "Shapefile",
      "href": "http://localhost:8080/geoserver/rest/imports/2/data",
      "file": "archsites.shp"
    },
    "tasks": [
      {
        "id": 0,
        "href": "http://localhost:8080/geoserver/rest/imports/2/tasks/0",
        "state": "READY"
      }
    ]
  }
}

填充任务的操作可能需要时间,尤其是在对一组大文件或“远程”数据(稍后将详细介绍)执行时,在这种情况下,POST请求可以包括 ?async=true 在URL的末尾使导入程序异步运行它。在这种情况下,导入将在INIT状态下创建,并将保持这种状态,直到完成所有数据传输和任务创建操作。如果无法获取数据,导入将立即停止,状态将切换到 INIT_ERROR 状态,并且错误消息将出现在导入上下文“消息”字段中。

在上下文创建中添加“execute=true”参数也会使导入立即启动,前提是可以在初始化阶段创建任务。结合执行和异步,“?async=true&execute=true“将使导入程序启动异步初始化和执行。

导入还可以有一个默认转换列表,这些转换将在任务创建时应用于任务,无论是从初始数据中还是通过上载。下面是使用默认转换创建导入上下文的示例:

{
  "import": {
    "targetWorkspace": {
      "workspace": {
        "name": "topp"
      }
    },
    "data": {
      "type": "file",
      "file": "/tmp/locations.csv"
    },
    "targetStore": {
      "dataStore": {
        "name": "h2"
      }
    },
    "transforms": [
      {
        "type": "AttributesToPointGeometryTransform",
        "latField": "LAT",
        "lngField": "LON"
      }
    ]
  }
}

要获取有关转换的更多信息,请参见 转换参考 .

导入对象

/导入/<importid>

方法

行动

状态代码/标题

输入

产量

参数

GET

检索id<importid>

200

n/a

进口

n/a

POST

使用id<importid>

204

n/a

n/a

异步=真/假

PUT

使用建议的id<importid>创建导入。如果建议的ID在当前(下一个)ID之前,则当前ID将被提升。如果建议的ID小于或等于当前ID,则将使用当前ID。这允许外部系统指定ID管理。

201,带位置标题

n/a

进口

n/a

DELETE

删除ID为的导入

200

n/a

n/a

n/a

导入的表示形式与导入创建响应中包含的表示形式相同。执行导入可能是一项很长的任务,因此,可以添加 async=true 对于使其以异步方式运行的请求,客户端将必须轮询导入表示并检查它何时达到“Complete”或“Complete_Error”状态。

数据

导入可以具有表示要导入的数据源的“数据”。数据可以是不同的类型,特别是“文件”、“目录”、“马赛克”、“数据库”和“远程”。在导入初始化期间,导入程序将扫描所述资源的内容,并为其中找到的每个数据生成导入任务。

大多数数据类型在任务部分讨论,唯一特定于整个导入上下文的类型是“远程”类型,它用于要求导入程序自动从远程位置获取数据,而不要求客户端执行上载。

远程资源的表示形式如下:

"data": {
  "type": "remote",
  "location": "ftp://fthost/path/to/importFile.zip",
  "username": "user",
  "password": "secret",
  "domain" : "mydomain"
}

地点可以是 any URI supported by Commons VFS ,包括HTTP和FTP服务器。这个 usernamepassworddomain 元素都是可选的,并且只有当远程服务器需要某种身份验证时才是必需的。如果所引用的文件被压缩,则在下载完成时将对其进行解压缩,并在解压缩的结果上创建任务。

任务

/导入/<importid>/tasks

方法

行动

状态代码/标题

输入

产量

GET

使用id<importid>

200

n/a

任务集合

POST

创建新任务

201,带位置标题

Multipart form data

任务

获取任务列表

GET /imports/0/tasks

结果为:

Status: 200 OK
Content-Type: application/json

{
  "tasks": [
    {
      "id": 0,
      "href": "http://localhost:8080/geoserver/rest/imports/2/tasks/0",
      "state": "READY"
    }
  ]
}

将新任务创建为文件上载

可以通过向 imports/<importId>/tasks 作为“内容类型:多部分/表单数据”多部分编码数据,定义如下 RFC 2388 . 可以通过这种方式上载一个或多个文件,并将创建一个用于导入这些文件的任务。如果上传的文件是zip文件,它将在服务器端解压,并作为文件目录处理。

对上载的响应将是创建新任务,例如:

Status: 201 Created
Location: http://localhost:8080/geoserver/rest/imports/1/tasks/1
Content-type: application/json

{
  "task": {
    "id": 1,
    "href": "http://localhost:8080/geoserver/rest/imports/2/tasks/1",
    "state": "READY",
    "updateMode": "CREATE",
    "data": {
      "type": "file",
      "format": "Shapefile",
      "href": "http://localhost:8080/geoserver/rest/imports/2/tasks/1/data",
      "file": "bugsites.shp"
    },
    "target": {
      "href": "http://localhost:8080/geoserver/rest/imports/2/tasks/1/target",
      "dataStore": {
        "name": "shapes",
        "type": "PostGIS"
      }
    },
    "progress": "http://localhost:8080/geoserver/rest/imports/2/tasks/1/progress",
    "layer": {
      "name": "bugsites",
      "href": "http://localhost:8080/geoserver/rest/imports/2/tasks/1/layer"
    },
    "transformChain": {
      "type": "vector",
      "transforms": []
    }
  }
}

从表单上载创建新任务

此创建模式假定发布到 imports/<importId>/tasks 包含 url 参数::

Content-type: application/x-www-form-urlencoded

url=file:///data/spearfish/

创建响应将与多部分上载相同。

单个任务资源

/Imports/<导入ID>/TASKS/<taskID>

方法

行动

状态代码/标题

输入

产量

GET

在id<importid>import中检索id<taskid>

200

n/a

任务

PUT

在id<importid>import中修改id<taskid>

200

任务

任务

DELETE

在ID为的导入中删除ID为<task id>的任务

200

n/a

n/a

任务资源的表示与任务创建响应中报告的表示相同。

更新任务

对现有任务的Put请求可用于更新其表示形式。表示可以是部分的,只包含需要更新的元素。

任务的更新模式可能具有不同的值。

UpdateMode

描述

CREATE

这是任务的默认启动update模式,即:如果缺少,则创建目标资源。

REPLACE

对于矢量存储:删除目标图层中的现有要素,并将其替换为任务源中的要素。对于栅格存储:替换底层数据。在处理结构GridCoverage阅读器(例如ImageMosaic)时,将获取新文件(替换旧文件)。对于单个栅格Coverage(例如GeoTIFF),文件的名称应该相同,以便overageStore层将保留原始名称(旧文件将被删除)。

APPEND

将任务源中的要素添加到现有图层中。

以下放置请求将任务从“创建”更新为“附加”模式:

Content-Type: application/json

{
  "task": {
     "updateMode": "APPEND"
  }
}

目录文件表示法

以下操作特定于类型为的数据对象 directory .

/Imports/<导入ID>/任务/<任务ID>/数据/文件

方法

行动

状态代码/标题

输入

产量

GET

在id<importid>import中检索id<taskid>的任务的文件列表

200

n/a

任务

对GET请求的响应将为:

Status: 200 OK
Content-Type: application/json

{
        files: [
                {
                file: "tasmania_cities.shp",
                href: "http://localhost:8080/geoserver/rest/imports/0/tasks/0/data/files/tasmania_cities.shp"
                },
                {
                file: "tasmania_roads.shp",
                href: "http://localhost:8080/geoserver/rest/imports/0/tasks/0/data/files/tasmania_roads.shp"
                },
                {
                file: "tasmania_state_boundaries.shp",
                href: "http://localhost:8080/geoserver/rest/imports/0/tasks/0/data/files/tasmania_state_boundaries.shp"
                },
                {
                file: "tasmania_water_bodies.shp",
                href: "http://localhost:8080/geoserver/rest/imports/0/tasks/0/data/files/tasmania_water_bodies.shp"
                }
        ]
}

/imports/<importId>/tasks/<taskId>/data/files/<fileId>

方法

行动

状态代码/标题

输入

产量

GET

从id<importid>

200

n/a

任务

DELETE

在id<importid>import中从id<taskid>

200

n/a

n/a

在链接之后,我们将获得单个文件的表示,请注意,在这种情况下,主文件如何与SideCar文件关联:

Status: 200 OK
Content-Type: application/json

{
        type: "file",
        format: "Shapefile",
        location: "C:\devel\gs_data\release\data\taz_shapes",
        file: "tasmania_cities.shp",
        href: "http://localhost:8080/geoserver/rest/imports/0/tasks/0/data/files/tasmania_cities.shp",
        prj: "tasmania_cities.prj",
        other: [
                "tasmania_cities.dbf",
                "tasmania_cities.shx"
        ]
}

马赛克扩展

如果输入数据是 mosaic 类型,我们拥有目录的所有典型属性,以及直接指定特定颗粒时间戳的支持。

为了指定时间戳,可以针对颗粒发出Put请求:

Content-Type: application/json

{
   "timestamp": "2004-01-01T00:00:00.000+0000"
}

答案是:

Status: 200 OK
Content-Type: application/json

{
  "type": "file",
  "format": "GeoTIFF",
  "href": "http://localhost:8080/geoserver/rest/imports/0/tasks/0/data/files/bm_200401.tif",
  "location": "/data/bluemarble/mosaic",
  "file": "bm_200401.tiff",
  "prj": null,
  "other": [],
  "timestamp": "2004-01-01T00:00:00.000+0000"
}

数据库数据

以下操作特定于类型为的数据对象 database . 在编写时,REST API不允许创建数据库数据源,但它可以提供使用GUI创建的数据库数据源的只读描述。

/导入/<importid>/tasks/<taskid>/data

方法

行动

状态代码/标题

输入

产量

GET

在id<importid>import中检索id<taskid>的任务的数据库连接参数

200

n/a

数据库连接参数和可用表列表

对数据库类型数据执行get将导致以下响应:

{
        type: "database",
        format: "PostGIS",
        href: "http://localhost:8080/geoserver/rest/imports/0/data",
        parameters: {
                schema: "public",
                fetch size: 1000,
                validate connections: true,
                Connection timeout: 20,
                Primary key metadata table: null,
                preparedStatements: true,
                database: "gttest",
                port: 5432,
                passwd: "cite",
                min connections: 1,
                dbtype: "postgis",
                host: "localhost",
                Loose bbox: true,
                max connections: 10,
                user: "cite"
        },
        tables: [
                "geoline",
                "geopoint",
                "lakes",
                "line3d",
        ]
}

数据库表

以下操作特定于类型为的数据对象 table . 在编写时,REST API不允许创建数据库数据源,但它可以提供使用GUI创建的数据库数据源的只读描述。表说明通常链接到任务,并引用链接到整个导入的数据库数据。

/导入/<importid>/tasks/<taskid>/data

方法

行动

状态代码/标题

输入

产量

GET

在import with id<importid>

200

n/a

表表示法

对数据库类型数据执行get将导致以下响应:

{
        type: "table",
        name: "abc",
        format: "PostGIS",
        href: "http://localhost:8080/geoserver/rest/imports/0/tasks/0/data"
}

任务目标层

/导入/<importid>/tasks/<taskid>/layer

层定义如何创建目标层

方法

行动

状态代码/标题

输入

产量

GET

在id<importid>import中检索id<taskid>

200

n/a

层JSON表示

PUT

在id<importid>import中修改id<taskid>的任务的目标层

200

任务

任务

请求任务层将导致以下结果:

Status: 200 OK
Content-Type: application/json

{
        layer: {
        name: "tasmania_cities",
        href: "http://localhost:8080/geoserver/rest/imports/0/tasks/0/layer",
        title: "tasmania_cities",
        originalName: "tasmania_cities",
        nativeName: "tasmania_cities",
        srs: "EPSG:4326",
        bbox: {
                minx: 147.2909004483,
                miny: -42.85110181689001,
                maxx: 147.2911004483,
                maxy: -42.85090181689,
                crs: "GEOGCS["WGS 84", DATUM["World Geodetic System 1984", SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4326"]]"
        },
        attributes: [
                {
                        name: "the_geom",
                        binding: "org.locationtech.jts.geom.MultiPoint"
                },
                {
                        name: "CITY_NAME",
                        binding: "java.lang.String"
                },
                {
                        name: "ADMIN_NAME",
                        binding: "java.lang.String"
                },
                {
                        name: "CNTRY_NAME",
                        binding: "java.lang.String"
                },
                {
                        name: "STATUS",
                        binding: "java.lang.String"
                },
                {
                        name: "POP_CLASS",
                        binding: "java.lang.String"
                }
                ],
                style: {
                        name: "cite_tasmania_cities",
                        href: "http://localhost:8080/geoserver/rest/imports/0/tasks/0/layer/style"
                }
        }
}

以上所有属性都可以使用Put请求进行更新。即使上述表示与rest-config-api类似,也不应与之混淆,因为它不支持所有相同的属性,特别是受支持的属性都是上面列出的属性。

任务转换

/导入/<importid>/tasks/<taskid>/transforms

方法

行动

状态代码/标题

输入

产量

GET

检索id<importid>

200

n/a

JSON格式的转换列表

POST

创建一个新的转换,并将其附加到id为<portID>的导入中的id为<taskID>的任务中

201

JSON转换表示法

转换位置

检索转换列表

对转换列表的get请求将导致以下响应:

Status: 200 OK
Content-Type: application/json

{
  "transforms": [
    {
      "type": "ReprojectTransform",
      "href": "http://localhost:8080/geoserver/rest/imports/0/tasks/1/transforms/0",
      "source": null,
      "target": "EPSG:4326"
    },
    {
      "type": "DateFormatTransform",
      "href": "http://localhost:8080/geoserver/rest/imports/0/tasks/1/transforms/1",
      "field": "date",
      "format": "yyyyMMdd"
    }
  ]
}

附加新转换

创建新的转换需要使用 type 标识转换类的属性,以及转换本身所需的任何额外属性(这是特定于转换的,每个属性将使用不同的属性集)。

以下POST请求创建属性类型重新映射::

Content-Type: application/json

{
   "type": "AttributeRemapTransform",
   "field": "cat",
   "target": "java.lang.Integer"
}

回答如下:

Status: 201 OK
Location: http://localhost:8080/geoserver/rest/imports/0/tasks/1/transform/2

/导入/<importid>/tasks/<taskid>/transforms/<transformid>

方法

行动

状态代码/标题

输入

产量

GET

在id<importid>

200

n/a

JSON格式的单一转换

PUT

修改由id<importid>

200

JSON转换表示法(最终只是需要修改的部分)

完全变换表示

DELETE

删除ID为<importID>

200

JSON转换表示法(最终只是需要修改的部分)

完全变换表示

检索单个转换

通过标识符请求单个转换将导致以下响应::

Status: 200 OK
Content-Type: application/json

{
  "type": "ReprojectTransform",
  "href": "http://localhost:8080/geoserver/rest/imports/0/tasks/1/transforms/0",
  "source": null,
  "target": "EPSG:4326"
}

修改现有转换

假设我们有一个重投影转换,并且我们需要更改目标SRS类型,那么下面的PUT请求将完成此任务:

Content-Type: application/json
{
   "type": "ReprojectTransform",
   "target": "EPSG:3005"
}

回答如下:

Status: 200 OK
    Content-Type: application/json

    {
      "type": "ReprojectTransform",
      "href": "http://localhost:8080/geoserver/rest/imports/0/tasks/1/transform/0",
      "source": null,
      "target": "EPSG:3005"
    }

转换参考

AttributeRemapTransform

将特定字段重新映射到给定的目标数据类型

参数

可选的

描述

领域

N

要重新映射的字段的名称

目标

N

“目标”字段类型,作为完全限定的Java类名

AttributeComputeTransform

基于可以使用其他字段值的表达式计算新字段

参数

可选的

描述

领域

N

要计算的字段的名称

字段类型

N

字段类型,作为完全限定的Java类名(例如。, java.lang.Stringjava.lang.Integerjava.util.Date 等等)

中国质量认证中心

N

用于计算新字段的(E)CQL表达式(可以是常量,例如。 'My String'

AttributesToPointGeometryTransform

转换两个数值字段 latFieldlngField 转换为点几何图形表示,使用 pointFieldName 设置点的名称 POINT(lngField,latField) ,则将删除源字段,如果 preserveGeometry 是假的。

参数

可选的

描述

拉特菲尔德

N

“纬度”字段

英格菲尔德

N

“经度”字段

PointFieldName

Y

点的名称

保留几何图形

Y

设置此标志将阻止删除源字段(默认情况下为False)

CreateIndexTransform

仅限数据库目标,在将数据导入数据库后,在给定列上创建索引

参数

可选的

描述

领域

N

要索引的字段

DateFormatTransform

将日期的字符串表示形式解析为日期/时间戳对象

参数

可选的

描述

领域

N

要分析的字段

格式

Y

日期解析模式,使用Java设置 SimpleDateFormat syntax . 如果它丢失了,将尝试一些内置格式(短的和完整的ISO日期格式,没有任何分隔符的日期)。

结束日期

Y

用作时间维度的结束日期的字段。

演示

Y

时间维度表示类型;列表中的一个;离散间隔;连续间隔

IntegerFieldToDateTransform

取整数字段并将其转换为日期,将Intereger字段解释为日期

参数

可选的

描述

领域

N

包含年份信息的字段

ReprojectTransform

将矢量层从源CRS重新投影到目标CRS

参数

可选的

描述

来源

Y

源坐标参考系的标识符(如果缺少,将使用本机坐标系)

目标

N

目标坐标参考系的标识符

GdalTranslateTransform

应用 gdal_translate 到单个文件栅格输入。要求 gdal_translate 位于运行GeoServer的web容器所使用的路径内。

参数

可选的

描述

选项

N

将传递给的选项数组 gdal_translate (在输入和输出名称旁边,这些名称是内部管理的)

GdalWarpTransform

应用 gdalwarp 到单个文件栅格输入。要求 gdalwarp 位于运行GeoServer的web容器所使用的路径内。

参数

可选的

描述

选项

N

将传递给的选项数组 gdalwarp (在输入和输出名称旁边,这些名称是内部管理的)

GdalAddoTransform

应用 gdaladdo 到单个文件栅格输入。要求 gdaladdo 位于运行GeoServer的web容器所使用的路径内。

参数

可选的

描述

选项

N

将传递给的选项数组 gdaladdo (在输入文件名旁边,它是内部管理的)

水平

N

具有将传递给的概述级别的整数数组 gdaladdo

PostScriptTransform

在导入数据后运行指定的脚本。脚本必须位于 $GEOSERVER_DATA_DIR/importer/scripts . 脚本可以是任何可执行文件。在编写本文时,无法传递有关刚刚导入脚本(TBD)的数据的信息。

参数

可选的

描述

名称

N

要调用的脚本的名称

选项

Y

将传递给脚本的选项数组