休息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服务器。这个 username
, password
和 domain
元素都是可选的,并且只有当远程服务器需要某种身份验证时才是必需的。如果所引用的文件被压缩,则在下载完成时将对其进行解压缩,并在解压缩的结果上创建任务。
任务¶
/导入/<importid>/tasks¶
方法 |
行动 |
状态代码/标题 |
输入 |
产量 |
---|---|---|---|---|
GET |
使用id<importid> |
200 |
n/a |
任务集合 |
POST |
创建新任务 |
201,带位置标题 |
任务 |
获取任务列表¶
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类名(例如。, |
中国质量认证中心 |
N |
用于计算新字段的(E)CQL表达式(可以是常量,例如。 |
AttributesToPointGeometryTransform¶
转换两个数值字段 latField
和 lngField
转换为点几何图形表示,使用 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 |
将传递给的选项数组 |
GdalWarpTransform¶
应用 gdalwarp
到单个文件栅格输入。要求 gdalwarp
位于运行GeoServer的web容器所使用的路径内。
参数 |
可选的 |
描述 |
---|---|---|
选项 |
N |
将传递给的选项数组 |
GdalAddoTransform¶
应用 gdaladdo
到单个文件栅格输入。要求 gdaladdo
位于运行GeoServer的web容器所使用的路径内。
参数 |
可选的 |
描述 |
---|---|---|
选项 |
N |
将传递给的选项数组 |
水平 |
N |
具有将传递给的概述级别的整数数组 |
PostScriptTransform¶
在导入数据后运行指定的脚本。脚本必须位于 $GEOSERVER_DATA_DIR/importer/scripts
. 脚本可以是任何可执行文件。在编写本文时,无法传递有关刚刚导入脚本(TBD)的数据的信息。
参数 |
可选的 |
描述 |
---|---|---|
名称 |
N |
要调用的脚本的名称 |
选项 |
Y |
将传递给脚本的选项数组 |