cURL¶
The examples in this section use cURL, a command line tool for executing HTTP requests and transferring files, to generate requests to GeoServer’s REST interface. Although the examples are based on cURL, they could be adapted for any HTTP-capable tool or library. Please be aware that cURL doesn’t act exactly the same as a web browser. In contrast to Mozilla Firefox or Google Chrome, cURL will not escape special characters in your request string automatically. To make sure, that your requests can be processed correctly, make sure, that characters like parenthesis, commas and the like are escaped before sending them via cURL. If you use libcurl in PHP 5.5 or newer you can prepare the URL-string using the function curl_escape. In older versions of PHP htmlspecialchars should do the job also.
Adding a new workspace¶
The following creates a new workspace named “acme” with a POST request:
Note
Each code block below contains a single command that may be extended over multiple lines.
curl -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d "<workspace><name>acme</name></workspace>" http://localhost/geoserver/rest/workspaces
If executed correctly, the response should contain the following:
< HTTP/1.1 201 Created
...
< Location: http://localhost/geoserver/rest/workspaces/acme
Note the Location response header, which specifies the location (URI) of the newly created workspace.
The workspace information can be retrieved as XML with a GET request:
curl -v -u admin:geoserver -XGET -H "Accept: text/xml" http://localhost/geoserver/rest/workspaces/acme
The response should look like this:
<workspace>
<name>acme</name>
<dataStores>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate"
href="http://localhost/geoserver/rest/workspaces/acme/datastores.xml"
type="application/xml"/>
</dataStores>
<coverageStores>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate"
href="http://localhost/geoserver/rest/workspaces/acme/coveragestores.xml"
type="application/xml"/>
</coverageStores>
<wmsStores>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate"
href="http://localhost/geoserver/rest/workspaces/acme/wmsstores.xml"
type="application/xml"/>
</wmsStores>
</workspace>
This shows that the workspace can contain “dataStores” (for vector data), “coverageStores” (for raster data), and “wmsStores” (for cascaded WMS servers).
Note
The Accept header is optional. The following request omits the Accept header, but will return the same response as above.
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/workspaces/acme.xml
Uploading a shapefile¶
In this example, a new store will be created by uploading a shapefile.
The following request uploads a zipped shapefile named roads.zip and creates a new store named roads.
Note
Each code block below contains a single command that may be extended over multiple lines.
curl -v -u admin:geoserver -XPUT -H "Content-type: application/zip" --data-binary @roads.zip http://localhost/geoserver/rest/workspaces/acme/datastores/roads/file.shp
The roads identifier in the URI refers to the name of the store to be created. To create a store named somethingelse, the URI would be http://localhost/geoserver/rest/workspaces/acme/datastores/somethingelse/file.shp
If executed correctly, the response should contain the following:
< HTTP/1.1 201 Created
The store information can be retrieved as XML with a GET request:
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/workspaces/acme/datastores/roads.xml
The response should look like this:
<dataStore>
<name>roads</name>
<type>Shapefile</type>
<enabled>true</enabled>
<workspace>
<name>acme</name>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate"
href="http://localhost/geoserver/rest/workspaces/acme.xml" type="application/xml"/>
</workspace>
<connectionParameters>
<entry key="url">file:/C:/path/to/data_dir/data/acme/roads/</entry>
<entry key="namespace">http://acme</entry>
</connectionParameters>
<__default>false</__default>
<featureTypes>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate"
href="http://localhost/geoserver/rest/workspaces/acme/datastores/roads/featuretypes.xml"
type="application/xml"/>
</featureTypes>
</dataStore>
By default when a shapefile is uploaded, a feature type is automatically created. The feature type information can be retrieved as XML with a GET request:
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/workspaces/acme/datastores/roads/featuretypes/tiger_roads.xml
If executed correctly, the response will be:
<featureType>
<name>roads</name>
<nativeName>roads</nativeName>
<namespace>
<name>acme</name>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate"
href="http://localhost/geoserver/rest/namespaces/acme.xml" type="application/xml"/>
</namespace>
...
</featureType>
The remainder of the response consists of layer metadata and configuration information.
Note
Notice that the name of the Layer (and of the FeatureType) corresponds to the physical name of the ShapeFile contained into the archive.
Adding an existing shapefile¶
In the previous example a shapefile was uploaded directly to GeoServer by sending a zip file in the body of a PUT request. This example shows how to publish a shapefile that already exists on the server.
Consider a directory on the server /data/shapefiles that contains the shapefile rivers.shp. The following adds a new store for the shapefile:
Note
In order to execute the exercise, create a folder shapefiles somewhere on the server and extract there the shapefiles.zip.
curl -v -u admin:geoserver -XPUT -H "Content-type: text/plain" -d "file:///home/geonode/data/shapefiles/rivers.shp" http://localhost/geoserver/rest/workspaces/acme/datastores/rivers/external.shp
The external.shp part of the request URI indicates that the file is coming from outside the catalog.
If executed correctly, the response should contain the following:
< HTTP/1.1 201 Created
The shapefile will be added to the existing store and published as a layer.
To verify the contents of the store, execute a GET request. Since the XML response only provides details about the store itself without showing its contents, execute a GET request for HTML:
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/workspaces/acme/datastores/rivers.html
Adding a directory of existing shapefiles¶
This example shows how to load and create a store that contains a number of shapefiles, all with a single operation. This example is very similar to the example above of adding a single shapefile.
Consider a directory on the server /data/shapefiles that contains multiple shapefiles. The following adds a new store for the directory.
Note
In order to execute the exercise, create a folder shapefiles somewhere on the server and extract there the shapefiles.zip.
curl -v -u admin:geoserver -XPUT -H "Content-type: text/plain" -d "file:///home/geonode/data/shapefiles/" "http://localhost/geoserver/rest/workspaces/acme/datastores/shapefiles/external.shp?configure=all"
Note the configure=all query string parameter, which sets each shapefile in the directory to be loaded and published.
If executed correctly, the response should contain the following:
< HTTP/1.1 201 Created
To verify the contents of the store, execute a GET request. Since the XML response only provides details about the store itself without showing its contents, execute a GET request for HTML:
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/workspaces/acme/datastores/shapefiles.html
Creating a layer style¶
This example will create a new style on the server and populate it the contents of a local SLD file.
The following creates a new style named roads_style:
Note
Each code block below contains a single command that may be extended over multiple lines.
curl -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d "<style><name>roads_style</name><filename>roads.sld</filename></style>" http://localhost/geoserver/rest/styles
If executed correctly, the response should contain the following:
< HTTP/1.1 201 Created
This request uploads a file called roads.sld file and populates the roads_style with its contents:
curl -v -u admin:geoserver -XPUT -H "Content-type: application/vnd.ogc.sld+xml" -d @roads.sld http://localhost/geoserver/rest/styles/roads_style
If executed correctly, the response should contain the following:
< HTTP/1.1 200 OK
The SLD itself can be downloaded through a GET request:
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/styles/roads_style.sld
Changing a layer style¶
This example will alter a layer style. Prior to making any changes, it is helpful to view the existing configuration for a given layer.
Note
Each code block below contains a single command that may be extended over multiple lines.
The following retrieves the “acme:roads” layer information as XML:
curl -v -u admin:geoserver -XGET "http://localhost/geoserver/rest/layers/acme:tiger_roads.xml"
The response in this case would be:
<layer>
<name>tiger_roads</name>
<type>VECTOR</type>
<defaultStyle>
<name>line</name>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost/geoserver/rest/styles/line.xml" type="application/xml"/>
</defaultStyle>
<resource class="featureType">
<name>tiger_roads</name>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost/geoserver/rest/workspaces/acme/datastores/roads/featuretypes/tiger_roads.xml" type="application/xml"/>
</resource>
<attribution>
<logoWidth>0</logoWidth>
<logoHeight>0</logoHeight>
</attribution>
</layer>
When the layer is created, GeoServer assigns a default style to the layer that matches the geometry of the layer. In this case a style named line is assigned to the layer. This style can viewed with a WMS request:
http://localhost/geoserver/wms/reflect?layers=acme:tiger_roads
In this next example a new style will be created called roads_style and assigned to the “acme:roads” layer:
curl -v -u admin:geoserver -XPUT -H "Content-type: text/xml" -d "<layer><defaultStyle><name>roads_style</name></defaultStyle></layer>" http://localhost/geoserver/rest/layers/acme:tiger_roads
If executed correctly, the response should contain the following:
< HTTP/1.1 200 OK
The new style can be viewed with the same WMS request as above:
http://localhost/geoserver/wms/reflect?layers=acme:tiger_roads
Note that if you want to upload the style in a workspace (ie, not making it a global style), and then assign this style to a layer in that workspace, you need first to create the style in the given workspace:
curl -u admin:geoserver -XPOST -H 'Content-type: text/xml' -d '<style><name>roads_style</name><filename>roads.sld</filename></style>' http://localhost/geoserver/rest/workspaces/acme/styles
Upload the file within the workspace:
curl -u admin:geoserver -XPUT -H 'Content-type: application/vnd.ogc.sld+xml' -d @roads.sld http://localhost/geoserver/rest/workspaces/acme/styles/roads_style
And finally apply that style to the layer. Note the use of the <workspace> tag in the XML:
curl -u admin:geoserver -XPUT -H 'Content-type: text/xml' -d '<layer><defaultStyle><name>roads_style</name><workspace>acme</workspace></defaultStyle></layer>' http://localhost/geoserver/rest/layers/acme:tiger_roads
Adding a PostGIS database¶
In this example, a PostGIS database named nyc will be added as a new store.
Warning
This section assumes that a PostGIS database named nyc is present on the local system and is accessible by the user bob.
Note
In order to create and setup the database locally, follow the instructions at Create and Prepare the nyc Example DataBase
Create a new text file and add the following content to it. This will represent the new store. Save the file as nycDataStore.xml.
<dataStore>
<name>nyc</name>
<connectionParameters>
<host>localhost</host>
<port>5432</port>
<database>nyc</database>
<user>bob</user>
<passwd>postgres</passwd>
<dbtype>postgis</dbtype>
</connectionParameters>
</dataStore>
The following will add the new PostGIS store to the GeoServer catalog:
Note
Each code block below contains a single command that may be extended over multiple lines.
curl -v -u admin:geoserver -XPOST -T nycDataStore.xml -H "Content-type: text/xml" http://localhost/geoserver/rest/workspaces/acme/datastores
If executed correctly, the response should contain the following:
< HTTP/1.1 200 OK
The store information can be retrieved as XML with a GET request:
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/workspaces/acme/datastores/nyc.xml
The response should look like the following:
<dataStore>
<name>nyc</name>
<type>PostGIS</type>
<enabled>true</enabled>
<workspace>
<name>acme</name>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate"
href="http://localhost/geoserver/rest/workspaces/acme.xml" type="application/xml"/>
</workspace>
<connectionParameters>
<entry key="port">5432</entry>
<entry key="dbtype">postgis</entry>
<entry key="host">localhost</entry>
<entry key="user">bob</entry>
<entry key="database">nyc</entry>
<entry key="namespace">http://acme</entry>
</connectionParameters>
<__default>false</__default>
<featureTypes>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate"
href="http://localhost/geoserver/rest/workspaces/acme/datastores/nyc/featuretypes.xml"
type="application/xml"/>
</featureTypes>
</dataStore>
Adding a PostGIS table¶
In this example, a table from the PostGIS database created in the previous example will be added as a featuretype.
Warning
This example assumes the table has already been created and the tiger_roads Layer deleted in case you have executed the previous steps.
The following adds the table tiger_roads as a new feature type:
Note
Each code block below contains a single command that may be extended over multiple lines.
curl -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d "<featureType><name>tiger_roads</name></featureType>" http://localhost/geoserver/rest/workspaces/acme/datastores/nyc/featuretypes
The featuretype information can be retrieved as XML with a GET request:
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/workspaces/acme/datastores/nyc/featuretypes/tiger_roads.xml
This layer can viewed with a WMS GetMap request:
http://localhost/geoserver/wms/reflect?layers=acme:tiger_roads
Creating a PostGIS table¶
In the previous example, a new feature type was added based on a PostGIS table that already existed in the database. The following example will not only create a new feature type in GeoServer, but will also create the PostGIS table itself.
Create a new text file and add the following content to it. This will represent the definition of the new feature type and table. Save the file as annotations.xml.
<featureType>
<name>annotations</name>
<nativeName>annotations</nativeName>
<title>Annotations</title>
<srs>EPSG:4326</srs>
<attributes>
<attribute>
<name>the_geom</name>
<binding>com.vividsolutions.jts.geom.Point</binding>
</attribute>
<attribute>
<name>description</name>
<binding>java.lang.String</binding>
</attribute>
<attribute>
<name>timestamp</name>
<binding>java.util.Date</binding>
</attribute>
</attributes>
</featureType>
This request will perform the feature type creation and add the new table:
Note
Each code block below contains a single command that may be extended over multiple lines.
curl -v -u admin:geoserver -XPOST -T annotations.xml -H "Content-type: text/xml" http://localhost/geoserver/rest/workspaces/acme/datastores/nyc/featuretypes
The result is a new, empty table named “annotations” in the “nyc” database, fully configured as a feature type.
The featuretype information can be retrieved as XML with a GET request:
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/workspaces/acme/datastores/nyc/featuretypes/annotations.xml
Creating a layer group¶
Warning
This example assumes the tables has already been created and the tiger_roads, poly_landmarks, poi, giant_polygon Layers have been created.
$ curl -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d "<featureType><name>giant_polygon</name></featureType>" http://localhost/geoserver/rest/workspaces/acme/datastores/nyc/featuretypes
$ curl -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d "<featureType><name>poi</name></featureType>" http://localhost/geoserver/rest/workspaces/acme/datastores/nyc/featuretypes
$ curl -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d "<featureType><name>poly_landmarks</name></featureType>" http://localhost/geoserver/rest/workspaces/acme/datastores/nyc/featuretypes
In this example, a layer group will be created, based on layers that already exist on the server.
Create a new text file and add the following content to it. This file will represent the definition of the new layer group. Save the file as nycLayerGroup.xml.
<layerGroup>
<name>nyc</name>
<layers>
<layer>poi</layer>
<layer>poly_landmarks</layer>
<layer>tiger_roads</layer>
</layers>
<styles>
<style>point</style>
<style>polygon</style>
<style>roads_style</style>
</styles>
</layerGroup>
The following request creates the new layer group:
Note
Each code block below contains a single command that may be extended over multiple lines.
curl -v -u admin:geoserver -XPOST -d @nycLayerGroup.xml -H "Content-type: text/xml" http://localhost/geoserver/rest/layergroups
Note
The argument -d@filename.xml in this example is used to send a file as the body of an HTTP request with a POST method. The argument -T filename.xml used in the previous example was used to send a file as the body of an HTTP request with a PUT method.
This layer group can be viewed with a WMS GetMap request:
http://localhost/geoserver/wms/reflect?layers=nyc&format=openlayers
Retrieving component versions¶
This example shows how to retrieve the versions of the main components: GeoServer, GeoTools, and GeoWebCache:
Note
The code block below contains a single command that is extended over multiple lines.
curl -v -u admin:geoserver -XGET -H "Accept: text/xml" http://localhost/geoserver/rest/about/version.xml
The response will look something like this:
<about>
<resource name="GeoServer">
<Build-Timestamp>04-Aug-2015 11:00</Build-Timestamp>
<Git-Revision>bca94d09e2e18839814a4b663ba8b0fca2130e47</Git-Revision>
<Version>2.7-SNAPSHOT</Version>
</resource>
<resource name="GeoTools">
<Build-Timestamp>29-Jul-2015 10:13</Build-Timestamp>
<Git-Revision>f50be97a039cd06d43a87ec3cc101626f0ac9fd2</Git-Revision>
<Version>13-SNAPSHOT</Version>
</resource>
<resource name="GeoWebCache">
<Git-Revision>f6e0d39c29c2317d2839c52a84676935e5b046cf/f6e0d39c29c2317d2839c52a84676935e5b046cf</Git-Revision>
<Version>1.7-SNAPSHOT</Version>
</resource>
</about>
Retrieving manifests¶
This collection of examples shows how to retrieve the full manifest and subsets of the manifest as known to the ClassLoader.
Note
The code block below contains a single command that is extended over multiple lines.
curl -v -u admin:geoserver -XGET -H "Accept: text/xml" http://localhost/geoserver/rest/about/manifest.xml
The result will be a very long list of manifest information. While this can be useful, it is often desirable to filter this list.
Filtering over resource name¶
It is possible to filter over resource names using regular expressions. This example will retrieve only resources where the name attribute matches gwc-.*:
Note
The code block below contains a single command that is extended over multiple lines.
curl -v -u admin:geoserver -XGET -H "Accept: text/xml" http://localhost/geoserver/rest/about/manifest.xml?manifest=gwc-.*
The result will look something like this (edited for brevity):
<about>
<resource name="gwc-2.3.0">
...
</resource>
<resource name="gwc-core-1.4.0">
...
</resource>
<resource name="gwc-diskquota-core-1.4.0">
...
</resource>
<resource name="gwc-diskquota-jdbc-1.4.0">
...
</resource>
<resource name="gwc-georss-1.4.0">
...
</resource>
<resource name="gwc-gmaps-1.4.0">
...
</resource>
<resource name="gwc-kml-1.4.0">
...
</resource>
<resource name="gwc-rest-1.4.0">
...
</resource>
<resource name="gwc-tms-1.4.0">
...
</resource>
<resource name="gwc-ve-1.4.0">
...
</resource>
<resource name="gwc-wms-1.4.0">
...
</resource>
<resource name="gwc-wmts-1.4.0">
...
</resource>
</about>
Filtering over resource properties¶
Filtering is also available over resulting resource properties. This example will retrieve only resources with a property equal to GeoServerModule.
Note
The code blocks below contain a single command that is extended over multiple lines.
curl -u admin:geoserver -XGET -H "Accept: text/xml" http://localhost/geoserver/rest/about/manifest.xml?key=GeoServerModule
The result will look something like this (edited for brevity):
<about>
<resource name="control-flow-2.3.0">
<GeoServerModule>extension</GeoServerModule>
...
</resource>
...
<resource name="wms-2.3.0">
<GeoServerModule>core</GeoServerModule>
...
</resource>
</about>
It is also possible to filter against both property and value. To retrieve only resources where a property named GeoServerModule has a value equal to extension, append the above request with &value=extension:
curl -u admin:geoserver -XGET -H "Accept: text/xml" http://localhost/geoserver/rest/about/manifest.xml?key=GeoServerModule&value=extension
Uploading and modifying a image mosaic¶
The following command uploads a polyphemus.zip file containing the definition of a mosaic (along with at least one granule of the mosaic to initialize the resolutions, overviews and the like) and will configure all the coverages in it as new layers.
Note
The code blocks below contain a single command that is extended over multiple lines.
curl -u admin:geoserver -XPUT -H "Content-type:application/zip" --data-binary @polyphemus.zip http://localhost/geoserver/rest/workspaces/topp/coveragestores/polyphemus/file.imagemosaic
The following instead instructs the mosaic to harvest (or re-harvest) a single file into the mosaic, collecting its properties and updating the mosaic index:
curl -v -u admin:geoserver -XPOST -H "Content-type: text/plain" -d "file:///path/to/the/file/polyphemus_20130302.nc" "http://localhost/geoserver/rest/workspaces/topp/coveragestores/poly-incremental/external.imagemosaic"
Harvesting can also be directed towards a whole directory, as follows:
curl -v -u admin:geoserver -XPOST -H "Content-type: text/plain" -d "file:///path/to/the/mosaic/folder" "http://localhost/geoserver/rest/workspaces/topp/coveragestores/poly-incremental/external.imagemosaic"
The image mosaic index structure can be retrieved using something like:
curl -v -u admin:geoserver -XGET "http://localhost/geoserver/rest/workspaces/topp/coveragestores/polyphemus-v1/coverages/NO2/index.xml"
Which will result in the following:
<Schema>
<attributes>
<Attribute>
<name>the_geom</name>
<minOccurs>0</minOccurs>
<maxOccurs>1</maxOccurs>
<nillable>true</nillable>
<binding>com.vividsolutions.jts.geom.Polygon</binding>
</Attribute>
<Attribute>
<name>location</name>
<minOccurs>0</minOccurs>
<maxOccurs>1</maxOccurs>
<nillable>true</nillable>
<binding>java.lang.String</binding>
</Attribute>
<Attribute>
<name>imageindex</name>
<minOccurs>0</minOccurs>
<maxOccurs>1</maxOccurs>
<nillable>true</nillable>
<binding>java.lang.Integer</binding>
</Attribute>
<Attribute>
<name>time</name>
<minOccurs>0</minOccurs>
<maxOccurs>1</maxOccurs>
<nillable>true</nillable>
<binding>java.sql.Timestamp</binding>
</Attribute>
<Attribute>
<name>elevation</name>
<minOccurs>0</minOccurs>
<maxOccurs>1</maxOccurs>
<nillable>true</nillable>
<binding>java.lang.Double</binding>
</Attribute>
<Attribute>
<name>fileDate</name>
<minOccurs>0</minOccurs>
<maxOccurs>1</maxOccurs>
<nillable>true</nillable>
<binding>java.sql.Timestamp</binding>
</Attribute>
<Attribute>
<name>updated</name>
<minOccurs>0</minOccurs>
<maxOccurs>1</maxOccurs>
<nillable>true</nillable>
<binding>java.sql.Timestamp</binding>
</Attribute>
</attributes>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost/geoserver/rest/workspaces/topp/coveragestores/polyphemus-v1/coverages/NO2/index/granules.xml" type="application/xml"/>
</Schema>
Listing the existing granules can be performed as follows:
curl -v -u admin:geoserver -XGET "http://localhost/geoserver/rest/workspaces/topp/coveragestores/polyphemus-v1/coverages/NO2/index/granules.xml?limit=2"
This will result in a GML description of the granules, as follows:
<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:gf="http://www.geoserver.org/rest/granules" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml">
<gml:boundedBy>
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord>
<gml:X>5.0</gml:X>
<gml:Y>45.0</gml:Y>
</gml:coord>
<gml:coord>
<gml:X>14.875</gml:X>
<gml:Y>50.9375</gml:Y>
</gml:coord>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<gf:NO2 fid="NO2.1">
<gf:the_geom>
<gml:Polygon>
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates>5.0,45.0 5.0,50.9375 14.875,50.9375 14.875,45.0 5.0,45.0</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gf:the_geom>
<gf:location>polyphemus_20130301.nc</gf:location>
<gf:imageindex>336</gf:imageindex>
<gf:time>2013-03-01T00:00:00Z</gf:time>
<gf:elevation>10.0</gf:elevation>
<gf:fileDate>2013-03-01T00:00:00Z</gf:fileDate>
<gf:updated>2013-04-11T10:54:31Z</gf:updated>
</gf:NO2>
</gml:featureMember>
<gml:featureMember>
<gf:NO2 fid="NO2.2">
<gf:the_geom>
<gml:Polygon>
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates>5.0,45.0 5.0,50.9375 14.875,50.9375 14.875,45.0 5.0,45.0</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gf:the_geom>
<gf:location>polyphemus_20130301.nc</gf:location>
<gf:imageindex>337</gf:imageindex>
<gf:time>2013-03-01T00:00:00Z</gf:time>
<gf:elevation>35.0</gf:elevation>
<gf:fileDate>2013-03-01T00:00:00Z</gf:fileDate>
<gf:updated>2013-04-11T10:54:31Z</gf:updated>
</gf:NO2>
</gml:featureMember>
</wfs:FeatureCollection>
Removing all the granules originating from a particular file (a NetCDF file can contain many) can be done as follows:
curl -v -u admin:geoserver -XDELETE "http://localhost/geoserver/rest/workspaces/topp/coveragestores/polyphemus-v1/coverages/NO2/index/granules.xml?filter=location='polyphemus_20130301.nc'"
Creating an empty mosaic and harvest granules¶
The next command uploads an empty.zip file.
This archive contains the definition of an empty mosaic (no granules in this case) through the following files:
datastore.properties (the postgis datastore connection params)
indexer.xml (The mosaic Indexer, note the CanBeEmpty=true parameter)
polyphemus-test.xml (The auxiliary file used by the NetCDF reader to parse schemas and tables)
Note
Make sure to update the datastore.properties file with your connection params and refresh the zip when done, before uploading it.
Note
The code blocks below contain a single command that is extended over multiple lines.
Note
The configure=none parameter allows for future configuration after harvesting
curl -u admin:geoserver -XPUT -H "Content-type:application/zip" --data-binary @empty.zip http://localhost/geoserver/rest/workspaces/topp/coveragestores/empty/file.imagemosaic?configure=none
The following instead instructs the mosaic to harvest a single polyphemus_20120401.nc file into the mosaic, collecting its properties and updating the mosaic index:
curl -v -u admin:geoserver -XPOST -H "Content-type: text/plain" -d "file:///path/to/the/file/polyphemus_20120401.nc" "http://localhost/geoserver/rest/workspaces/topp/coveragestores/empty/external.imagemosaic"
Once done you can get the list of coverages/granules available on that store.
curl -v -u admin:geoserver -XGET "http://localhost/geoserver/rest/workspaces/topp/coveragestores/empty/coverages.xml?list=all"
Which will result in the following:
<list>
<coverageName>NO2</coverageName>
<coverageName>O3</coverageName>
</list>
Next step is configuring ONCE for coverage (as an instance NO2), an available coverage.
curl -v -u admin:geoserver -XPOST -H "Content-type: text/xm" -d @"/path/to/coverageconfig.xml" "http://localhost/geoserver/rest/workspaces/topp/coveragestores/empty/coverages"
Where coverageconfig.xml may look like this
<coverage>
<name>NO2</name>
</coverage>
Note
When specifying only the coverage name, the coverage will be automatically configured
Master Password Change¶
The master password can be fetched wit a GET request.
curl -v -u admin:geoserver -XGET http://localhost/geoserver/rest/security/masterpw.xml
A generated master password may be -“}3a^Kh. Next step is creating an XML file.
File changes.xml
<masterPassword>
<oldMasterPassword>-"}3a^Kh</oldMasterPassword>
<newMasterPassword>geoserver1</newMasterPassword>
</masterPassword>
Changing the master password using the file:
curl -v -u admin:geoserver -XPUT -H "Content-type: text/xml" -d @change.xml http://localhost/geoserver/rest/security/masterpw.xml