目录

上一个主题

10.2. 管理数据

下一个主题

10.9. 使用要素类型


10.6. 使用数据存储

数据存储将GeoServer连接到您的数据。不能将GeoServer不支持的数据与内置连接器或插件一起使用。 当然,REST接口支持对数据存储的所有操作。公开的资源格式如下:

/workspaces/<ws>/datastores

在这里, ws 表示数据存储链接到的工作区。

10.7. 行动时间-管理数据存储

你喜欢使用cURL和Python吗?既然你现在如此熟练,我们又能用cURL和Python了! 因此,让我们获取有关数据存储的信息:

1.GET操作让您知道在配置中哪些数据存储是可用的。

使用以下代码在Python中检索信息:

>>> import requests
>>> myurl='http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores'
>>> resp=requests.get(myurl,auth=('admin','geoserver'))
>>> resp.status_code
200
>>> import json
>>>
>>> json.loads(resp.text)
{'dataStores': {'dataStore': [{'name': 'Natural Earth Countries',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/Natural+Earth+Countries.json'},
   {'name': 'PostGeo',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/PostGeo.json'},
   {'name': 'maplet60_MapServerBook_data',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/maplet60_MapServerBook_data.json'},
   {'name': 'myPostGIS',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/myPostGIS.json'},
   {'name': 'postgeo',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/postgeo.json'},
   {'name': 'tiger_counties_REST',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/tiger_counties_REST.json'},
   {'name': 'tiger_counties_REST1',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/tiger_counties_REST1.json'}]}}

2.在cURL中,使用以下命令:

>>> !curl -v -u admin:geoserver -XGET -H 'Content-type: application/json'  http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores -o naturalEarthDataStores.json
Note: Unnecessary use of -X or --request, GET is already inferred.
* Expire in 0 ms for 6 (transfer 0x55cb55d02f50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55cb55d02f50)
  % 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/workspaces/geonode/datastores HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Accept: /
> Content-type: application/json
>
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=19CAF7E1F3500FF4DFC6B5008253C647; Path=/geoserver; HttpOnly
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Sat, 16 May 2020 10:41:20 GMT
<
{ [1017 bytes data]
100  1010    0  1010    0     0   9901      0 --:--:-- --:--:-- --:--:--  9901
* Connection #0 to host 118.190.135.194 left intact

3.响应包含链接到工作区的所有数据存储。 唯一的属性是名称和用于检索每个属性的详细信息的链接:

{"dataStores":{"dataStore":[{"name":"Natural Earth Countries","href":"http:\/\/118.190.135.194:8080\/geoserver\/rest\/workspaces\/geonode\/datastores\/Natural+Earth+Countries.json"},{"name":"maplet60_MapServerBook_data","href":"http:\/\/118.190.135.194:8080\/geoserver\/rest\/workspaces\/geonode\/datastores\/maplet60_MapServerBook_data.json"}]}}

如果您想知道获取GeoServer上配置的所有数据存储的列表的请求是什么, 很抱歉告诉您它不存在。你必须查询每个工作区。 您可以请求工作区列表并迭代项以检索所有数据存储。

4.你在 第六章 , 设计您的图层样式 . 如果您不记得它是关于什么的, 让我们用Python请求信息:

>>> import requests
>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/'
>>> headers = {'Content-type': 'text/xml'}
>>> resp = requests.get(myUrl,auth=('admin','geoserver'),headers=headers)
>>> resp.status_code
200

5.curl:

>>> !curl -v -u admin:geoserver -XGET -H 'Content-type: application/json' \
>>>     http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/Natural+Earth+Countries  \
>>>     -o naturalEarthShapes.json
Note: Unnecessary use of -X or --request, GET is already inferred.
* Expire in 0 ms for 6 (transfer 0x55ee1184df50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55ee1184df50)
  % 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/workspaces/geonode/datastores/Natural+Earth+Countries HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Accept: /
> Content-type: application/json
>
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=B2A2A35B1A5E78EB85D6EAA43819A849; Path=/geoserver; HttpOnly
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Sat, 16 May 2020 10:58:51 GMT
<
{ [544 bytes data]
100   537    0   537    0     0   5479      0 --:--:-- --:--:-- --:--:--  5479
* Connection #0 to host 118.190.135.194 left intact

6.打开XML文件。它包含的信息比以前的回复多得多。

数据存储是比工作空间更复杂的对象。请记住,数据存储是异构的; 连接参数标记可能包含非常不同的元素,具体取决于数据存储类型, 例如,PostGIS数据存储将具有用户ID、密码和TCP端口:

>>> import json
>>> json.loads(resp.text)
{'dataStores': {'dataStore': [{'name': 'Natural Earth Countries',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/Natural+Earth+Countries.json'},
   {'name': 'PostGeo',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/PostGeo.json'},
   {'name': 'maplet60_MapServerBook_data',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/maplet60_MapServerBook_data.json'},
   {'name': 'myPostGIS',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/myPostGIS.json'},
   {'name': 'postgeo',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/postgeo.json'},
   {'name': 'tiger_counties_REST',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/tiger_counties_REST.json'},
   {'name': 'tiger_counties_REST1',
    'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/tiger_counties_REST1.json'}]}}

7.现在是创建新数据存储的时候了。我们将从复制一个shapefile开始 tiger counties . 您必须提供大量信息,因此创建一个新的XML文件,插入以下代码, 并将其另存为 tigerCounties.xml . 你应该认识到许多参数 第五章 , 添加数据 ,从WEB界面添加数据存储时。关键是 type 元素,指定要添加的数据类型。 连接参数集合也很重要,您可以在其中插入有关GeoServer如何从文件系统或数据库检索数据的信息:

<dataStore>
    <name>tiger_counties_REST</name>
    <description>tiger counties created from REST</description>
    <type>Shapefile</type>
    <enabled>true</enabled>
    <connectionParameters>
        <entry key="memory mapped buffer">false</entry>
        <entry key="create spatial index">true</entry>
        <entry key="charset">ISO-8859-1</entry>
        <entry key="filetype">shapefile</entry>
        <entry key="cache and reuse memory maps">true</entry>
        <entry key="url">file:geodata/maplet60_MapServerBook_data/statesp0200.shp</entry>
        <entry key="namespace">http://www.geonode.org/</entry>
    </connectionParameters>
    <__default>false</__default>
</dataStore>

8.现在调用cURL中的REST接口并添加数据存储:

>>> !curl -v -u admin:geoserver -XPOST -T tiger.xml -H 'Content-type: text/xml' -H 'Accept: text/xml' http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores
* Expire in 0 ms for 6 (transfer 0x5582be613f50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5582be613f50)
* Connected to 118.190.135.194 (118.190.135.194) port 8080 (#0)
* Server auth using Basic with user 'admin'
> POST /geoserver/rest/workspaces/geonode/datastores HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Content-type: text/xml
> Accept: text/xml
> Content-Length: 755
> Expect: 100-continue
>
* Expire in 1000 ms for 0 (transfer 0x5582be613f50)
< HTTP/1.1 100
* We are completely uploaded and fine
< HTTP/1.1 201
< Set-Cookie: JSESSIONID=EAA8882DE4AB14586B7EB61C5FA071A3; Path=/geoserver; HttpOnly
< Location: http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/tiger_counties_REST
< Content-Type: text/xml;charset=ISO-8859-1
< Content-Length: 19
< Date: Wed, 06 May 2020 12:49:30 GMT
<
* Connection #0 to host 118.190.135.194 left intact
tiger_counties_REST

9.打开web界面并列出已配置的数据存储。您的添加请求是否成功?

tiger_rest

图 10.2 tiger_rest

10.在Python中执行同样的操作。注意,在Python字典中,例如headers变量, 您可以添加多个键值对。在这种情况下,可以指定两个标题值:

>>> import requests
>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores'
>>> file = open('tiger.xml','r')
>>> payload = file.read()
>>> headers = {'Content-type': 'text/xml','Accept': 'text/xml'}
>>> resp = requests.post(myUrl, auth=('admin','geoserver'), data=payload, headers=headers)
>>> resp.status_code
500

11.当然,您不能添加两个相同的数据存储;这就是为什么您得到了一个内部服务器错误代码。 在GeoServer日志中,您将找到以下内容:

org.geoserver.rest.RestletException: java.lang.IllegalArgumentException: Store 'tiger_counties_REST' already exists in workspace 'tiger'
at
org.geoserver.rest.R eflectiveResource.handleException(R eflectiveResource.java:325)
at
org.geoserver.rest.ReflectiveResource。
handlePost(ReflectiveResource.java:123)…

12.添加shapefile数据存储非常简单。让我们尝试将一个新的PostGIS源添加到配置中。 同样,最好创建一个包含所有参数的XML文件,命名为 postgis.xml ,并插入代码。 强制连接参数是 hostport数据库样式user密码 . 在本例中,我们插入了通过从web界面添加数据存储可以找到的所有默认值:

<dataStore>
    <name>myPostGIS</name>
    <description>PostGIS local instance</description>
    <type>PostGIS</type>
    <enabled>true</enabled>
    <connectionParameters>
        <entry key="host">118.190.135.194</entry>
        <entry key="port">5432</entry>
        <entry key="database">postgeo</entry>
        <entry key="schema">public</entry>
        <entry key="user">postgres</entry>
        <entry key="passwd">postgres</entry>
        <entry key="dbtype">postgis</entry>
        <entry key="validate connections">true</entry>
        <entry key="Connection timeout">20</entry>
        <entry key="min connections">1</entry>
        <entry key="max connections">10</entry>
        <entry key="Loose bbox">true</entry>
        <entry key="fetch size">1000</entry>
        <entry key="Max open prepared statements">50</entry>
        <entry key="Estimated extends">true</entry>
    </connectionParameters>
    <__default>false</__default>
</dataStore>

13.现在使用cURL调用创建新的PostGIS源:

>>> !curl -v -u admin:geoserver -XPOST -T postgis.xml -H 'Content-type: text/xml' \
>>>     -H 'Accept: text/xml' http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores
* Expire in 0 ms for 6 (transfer 0x5611e64eff50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5611e64eff50)
* Connected to 118.190.135.194 (118.190.135.194) port 8080 (#0)
* Server auth using Basic with user 'admin'
> POST /geoserver/rest/workspaces/geonode/datastores HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Content-type: text/xml
> Accept: text/xml
> Content-Length: 1052
> Expect: 100-continue
>
* Expire in 1000 ms for 0 (transfer 0x5611e64eff50)
< HTTP/1.1 100
* We are completely uploaded and fine
< HTTP/1.1 500
< Set-Cookie: JSESSIONID=70451A8DBB37D5A53FD23C2608A28F6B; Path=/geoserver; HttpOnly
< Transfer-Encoding: chunked
< Date: Sat, 16 May 2020 11:00:42 GMT
< Connection: close
<
* Closing connection 0
Store 'myPostGIS' already exists in workspace 'geonode'

14.可以使用以下Python语法发送相同的请求。与往常一样, 如果您已经使用cURL创建了它,您将得到一个HTTP 500错误代码:

>>> import requests
>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores'
>>> file = open('postgis.xml','r')
>>> payload = file.read()
>>> headers = {'Content-type': 'text/xml','Accept': 'text/xml'}
>>> resp = requests.post(myUrl, auth=('admin','geoserver'), data=payload, headers=headers)
>>> resp.status_code
500

15.您可以更新数据存储配置。如果您的PostGIS密码已从DBA更改, 则可以在GeoServer上发送更新请求。使用修改后的值创建XML文件:

<dataStore>
    <name>myPostGIS</name>
    <description>PostGIS local instance</description>
    <type>PostGIS</type>
    <enabled>true</enabled>
    <connectionParameters>
        <entry key="host">localhost</entry>
        <entry key="port">5432</entry>
        <entry key="database">postgis20</entry>
        <entry key="schema">public</entry>
        <entry key="user">postgres</entry>
        <entry key="passwd">new_pwd</entry>
        <entry key="dbtype">postgis</entry>
        <entry key="validate connections">true</entry>
        <entry key="Connection timeout">20</entry>
        <entry key="min connections">1</entry>
        <entry key="max connections">10</entry>
        <entry key="Loose bbox">true</entry>
        <entry key="fetch size">1000</entry>
        <entry key="Max open prepared statements">50</entry>
        <entry key="Estimated extends">true</entry>
    </connectionParameters>
    <__default>false</__default>
</dataStore>

16.然后发送一个PUT请求。卷曲时, 如下所示:

>>> !curl -v -u admin:geoserver -XPUT -T updPostgis.xml -H 'Content-type: text/xml' -H 'Accept: text/xml' http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/myPostGIS
* Expire in 0 ms for 6 (transfer 0x558b1403cf50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x558b1403cf50)
* Connected to 118.190.135.194 (118.190.135.194) port 8080 (#0)
* Server auth using Basic with user 'admin'
> PUT /geoserver/rest/workspaces/geonode/datastores/myPostGIS HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Content-type: text/xml
> Accept: text/xml
> Content-Length: 826
> Expect: 100-continue
>
* Expire in 1000 ms for 0 (transfer 0x558b1403cf50)
< HTTP/1.1 100
* We are completely uploaded and fine
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=826FF77BE97B0DE775350CF2ED6347A0; Path=/geoserver; HttpOnly
< Content-Length: 0
< Date: Wed, 06 May 2020 12:39:17 GMT
<
* Connection #0 to host 118.190.135.194 left intact

17.在Python中,语法如下:

>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/myPostGIS'
>>> file = open('updPostgis.xml','r')
>>> payload = file.read()
>>> headers = {'Content-type': 'text/xml','Accept': 'text/xml'}
>>> resp = requests.put(myUrl, auth=('admin','geoserver'), data=payload, headers=headers)
>>> resp.status_code
200

18.最后一个支持的操作是DELETE,用于删除数据存储。 通过删除我们创建的tiger counties的重复数据存储来清理配置:

>>> !curl -v -u admin:geoserver -XDELETE -H 'Accept: text/xml' \
>>>     http://118.190.135.194:8080/geoserver/rest/workspaces/tiger/datastores/tiger_counties_REST
* Expire in 0 ms for 6 (transfer 0x5560b47bcf50)
*   Trying 118.190.135.194...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5560b47bcf50)
* Connected to 118.190.135.194 (118.190.135.194) port 8080 (#0)
* Server auth using Basic with user 'admin'
> DELETE /geoserver/rest/workspaces/tiger/datastores/tiger_counties_REST HTTP/1.1
> Host: 118.190.135.194:8080
> Authorization: Basic YWRtaW46Z2Vvc2VydmVy
> User-Agent: curl/7.64.0
> Accept: text/xml
>
< HTTP/1.1 404
< Set-Cookie: JSESSIONID=E6D26DCD24873D73BCD2ACE24F05D61A; Path=/geoserver; HttpOnly
< Transfer-Encoding: chunked
< Date: Sat, 16 May 2020 10:43:07 GMT
<
* Connection #0 to host 118.190.135.194 left intact
No such datastore: tiger,tiger_counties_REST

19.以及Python中的相同操作:

>>> import requests
>>> myUrl = 'http://118.190.135.194:8080/geoserver/rest/workspaces/tiger/datastores/tiger_counties_REST'
>>> headers = {'Accept': 'text/xml'}
>>> resp = requests.delete(myUrl, auth=('admin','geoserver'),headers=headers)
>>> resp.status_code
404

10.8. 刚刚发生了什么?

您学习了如何使用数据存储,但有另一种方法可以创建它。 在某些情况下,可以在创建要素类型时隐式创建它。我们将在下一段中讨论它。