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': 'my PostGIS ',
'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/my PostGIS .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': 'my PostGIS ',
'href': 'http://118.190.135.194:8080/geoserver/rest/workspaces/geonode/datastores/my PostGIS .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界面并列出已配置的数据存储。您的添加请求是否成功?

图 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
,并插入代码。 强制连接参数是 host
, port
, 数据库
,
样式
, user
和 密码
.
在本例中,我们插入了通过从web界面添加数据存储可以找到的所有默认值:
<dataStore>
<name>my PostGIS </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 'my PostGIS ' 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>my PostGIS </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/my PostGIS
* 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/my PostGIS 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/my PostGIS '
>>> 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. 刚刚发生了什么?¶
您学习了如何使用数据存储,但有另一种方法可以创建它。 在某些情况下,可以在创建要素类型时隐式创建它。我们将在下一段中讨论它。