目录

上一个主题

10.9. 使用要素类型

下一个主题

11. 使用前保护GeoServer


10.12. 发布数据

在GeoServer上配置好数据之后,就可以发布它了。 REST接口为您提供用于管理图层、样式和图层组的资源。

10.13. 使用样式

你学到了很多关于风格和SLD的知识在第六章, 设计您的图层样式 . 配置适当的可视化需要创建和发布适当的样式。

REST为您提供了两种管理样式的资源。具体如下:

  • /styles

  • /workspaces/<ws>/styles

前者指向与工作空间无关的样式, 而后者包含具有关联样式的工作空间。

10.14. 添加新样式

如果要使用REST发布数据,添加新样式是一项例行任务。 我们将从GeoServer检索现有样式,更新它, 然后作为新样式上载到GeoServer。

1.我们将使用 PopulatedPlacesLabeled 作为我们新风格的模板。 向GeoServer发送请求以检索它并保存到 PopulatedPlacesBlueLabeled.xml 文件。 请注意,我们正在发送一个头来告诉GeoServer我们需要 SLD 格式。 如果您指定 text/xml ,您将只得到SLD是什么的描述:

>>> !curl -v -u admin:geoserver -XGET -H 'Accept: application/vnd.ogc.sld+xml' \
>>>     http://118.190.135.194:8080/geoserver/rest/styles/line -o line.xml
Note: Unnecessary use of -X or --request, GET is already inferred.
* Expire in 0 ms for 6 (transfer 0x55737c173f50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55737c173f50)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 118.190.135.194 (118.190.135.194) port 8080 (#0)
* Server auth using Basic with user 'admin'
> GET /geoserver/rest/styles/line HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Accept: application/vnd.ogc.sld+xml
>
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=3F75BD96E431AA0A26299876FFB9C4AC; Path=/geoserver; HttpOnly
< Content-Type: application/vnd.ogc.sld+xml
< Transfer-Encoding: chunked
< Date: Sat, 16 May 2020 11:09:09 GMT
<
{ [1192 bytes data]
100  1185    0  1185    0     0  12880      0 --:--:-- --:--:-- --:--:-- 12880
* Connection #0 to host 118.190.135.194 left intact

2.在Python中,代码如下:

>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/styles/'

填充位置标记’

>>> import requests
>>> headers = {'Content-type': 'application/vnd.ogc.sld+xml'}
>>> resp = requests.get(myUrl, auth=('admin','geoserver'), headers=headers)
>>> resp.status_code
200

3.现在,打开 line.xml 文件, 转到第46行,将黑色的RGB代码替换为蓝色的RGB代码:

<sld:CssParameter name="fill">#0000FF</sld:CssParameter>

4.转到第9行,用新名称替换旧名称,如下代码行所示:

<sld:Name>PopulatedPlacesBlueLabeled</sld:Name>

5.保存文件并关闭它。 现在,我们将使用此文件创建新样式。 发送POST请求以创建PopulatedPlacesBlueLabeled样式。

>>> !curl -v -u admin:geoserver -XPOST -H 'Content-type: application/vnd.ogc.sld+xml' -T PopulatedPlacesBlueLabeled.xml http://118.190.135.194:8080/geoserver/rest/styles
* Expire in 0 ms for 6 (transfer 0x5607ba72ff50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5607ba72ff50)
* Connected to 118.190.135.194 (118.190.135.194) port 8080 (#0)
* Server auth using Basic with user 'admin'
> POST /geoserver/rest/styles HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Accept: /
> Content-type: application/vnd.ogc.sld+xml
> Content-Length: 1185
> Expect: 100-continue
>
* Expire in 1000 ms for 0 (transfer 0x5607ba72ff50)
< HTTP/1.1 100
* We are completely uploaded and fine
< HTTP/1.1 403
< Set-Cookie: JSESSIONID=EF1312A20060309CFCEA6923A5690C5C; Path=/geoserver; HttpOnly
< Content-Type: text/html;charset=utf-8
< Content-Language: en
< Content-Length: 1041
< Date: Sat, 16 May 2020 11:09:09 GMT
< Connection: close
<
<!doctype html><html lang="en"><head><title>HTTP Status 403 – Forbidden</title><style type="text/css">h1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} h2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} h3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} b {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} p {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;} a {color:black;} a.name {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 403 – Forbidden</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Message</b> Style Default Styler already exists.</p><p><b>Description</b> The server understood the request but refuses to authorize it.</p><hr class="line" /><h3>Apache Tomcat/9.0.20</* Closing connection 0
h3></body></html>

6.或者在Python中:

>>> import requests
>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/styles'
>>> file = open('PopulatedPlacesBlueLabeled.xml','r')
>>> payload = file.read()
>>> headers = {'Content-type': 'application/vnd.ogc.sld+xml'}
>>> resp = requests.post(myUrl, auth=('admin','geoserver'), data=payload, headers=headers)

7.转到WEB界面并列出样式;您应该会看到新的样式:

image228

图 10.10 image228

10.14.1. 刚刚发生了什么?

我们只查看样式的GET和POST操作,但如果要从配置中删除样式, 或者要更改现有样式,也可以使用DELETE。您可以模拟前面几节中学习的语法。

10.14.2. 使用图层

配置完样式后,可能需要将其应用于图层。 创建或修改样式是数据发布的最后一步。 毫不奇怪,可以使用REST接口执行层操作。

10.15. 管理图层

在上一节中,您创建了一个新样式;但是如果无法向其添加图层, 则该样式无效。我们现在将更新 populatedplace 通过添加新样式分层。

1.检索层上的信息 ne_10m_admin_0_countries .

>>> !curl -v -u admin:geoserver -XGET -H 'Content-type: application/vnd.ogc.sld+xml' http://118.190.135.194:8080/geoserver/rest/layers/ne_10m_admin_0_countries -o ne_10m_admin_0_countries.xml
Note: Unnecessary use of -X or --request, GET is already inferred.
* Expire in 0 ms for 6 (transfer 0x55a62d6b4f50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55a62d6b4f50)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 118.190.135.194 (118.190.135.194) port 8080 (#0)
* Server auth using Basic with user 'admin'
> GET /geoserver/rest/layers/ne_10m_admin_0_countries HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Accept: /
> Content-type: application/vnd.ogc.sld+xml
>
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=99F03254C314BCE0C6C4494DAF43734B; Path=/geoserver; HttpOnly
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Sat, 16 May 2020 11:09:09 GMT
<
{ [494 bytes data]
100   487    0   487    0     0   7378      0 --:--:-- --:--:-- --:--:--  7378
* Connection #0 to host 118.190.135.194 left intact

2.用Python编写如下:

>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/layers/ne_10m_admin_0_countries'
>>> headers = {'Content-tpye':'text/xml'}
>>> resp = requests.get(myUrl, auth=('admin','geoserver'), headers=headers)
>>> resp.status_code
200

3.打开 ne_10m_admin_0_countries.xml 文件;它以 styles 收藏。 您需要为创建的新样式插入代码。我们不需要从GeoServer返回所有元素。 按以下代码修改文件。(请注意,我们插入了 enabled 元素; 默认值为 false 为了它。如果你做了一个PUT, 但没有明确地将其设置为 true ,您的层将被修改和禁用):

>>> import json
>>> from pprint import pprint
>>> cnt = json.loads(resp.text)
>>> pprint(cnt)
{'layer': {'attribution': {'logoHeight': 0, 'logoWidth': 0},
           'defaultStyle': {'href': 'http://118.190.135.194:8080/geoserver/rest/styles/polygon.json',
                            'name': 'polygon'},
           'name': 'ne_10m_admin_0_countries',
           'opaque': False,
           'queryable': True,
           'resource': {'@class': 'featureType',
                        'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/Natural+Earth+Countries/featuretypes/ne_10m_admin_0_countries.json',
                        'name': 'geonode:ne_10m_admin_0_countries'},
           'type': 'VECTOR'}}

4.现在将文件另存为 addStyle.xml 并将PUT请求发送到GeoServer, 以修改层的配置:

>>> !curl -v -u admin:geoserver -XPUT -H 'Content-type: application/json' -T addStyle.xml http://118.190.135.194:8080/geoserver/rest/layers/ne_10m_admin_0_countries
* Expire in 0 ms for 6 (transfer 0x56358251bf50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x56358251bf50)
* Connected to 118.190.135.194 (118.190.135.194) port 8080 (#0)
* Server auth using Basic with user 'admin'
> PUT /geoserver/rest/layers/ne_10m_admin_0_countries HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Accept: /
> Content-type: application/json
> Content-Length: 455
> Expect: 100-continue
>
* Expire in 1000 ms for 0 (transfer 0x56358251bf50)
< HTTP/1.1 100
* We are completely uploaded and fine
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=E1410D39EA391F5CF8ABCFA39796E49F; Path=/geoserver; HttpOnly
< Content-Length: 0
< Date: Sat, 16 May 2020 11:09:09 GMT
<
* Connection #0 to host 118.190.135.194 left intact

5.在Python中,代码如下:

>>> import requests,json
>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/layers/ne_10m_admin_0_countries'
>>> file = open('addStyle.xml','r')
>>> payload = file.read()
>>> headers = {'Content-type': 'application/json'}
>>> resp = requests.put(myUrl, auth=('admin','geoserver'), data=payload, headers=headers)
>>> resp.status_code
200

6.现在去 层预览 接口并打开 OpenLayers 预览 ne_10m_admin_0_countries 图层; 然后打开工具并查看样式下拉列表。新的在那儿吗?选择它,你的地图应该像下面的截图:

rest_ne

图 10.11 rest_ne

10.15.1. 刚刚发生了什么?

向现有图层添加了新样式。您还可以更改默认样式, 只需将其XML代码添加到随PUT请求发送的代码中即可。

我们介绍了使用GeoServer的REST接口时应该知道的基本操作。 联机文档涵盖了每个资源上允许的所有操作。当您不确定XML代码执行请求的外观时, 一个好的方法是使用同一对象上的GET请求检查语法。创建应用程序时,您可能需要查看以下参考页:

http://docs.geoserver.org/stable/en/user/restconfig/rest-config-api.html#

10.16. 小测验-复习REST操作

问题1。你能用REST停止数据的发布吗?

1.不,您必须删除一个层才能使其不再可见。

2.是的,您可以通过POST操作将图层更新为“未启用”。

3.是的,您可以使用PUT操作禁用层。

问题2。哪些操作可用于 geoserver/rest/workspaces//styles 资源?

1.您可以执行GET、POST、DELETE和PUT。

2.你可以执行GET和POST。

3.您可以执行GET和DELETE。

问题3。GeoServer的REST接口可以使用哪种协议?

1.下列任一协议:HTTP、HTTPS、FTP。REST是在多个协议上实现的架构模型。

2.HTTP用于GET,HTTPS用于POST、PUT和DELETE。

3.HTTP协议。