gsconfig

gsconfig est une bibliothèque python pour manipuler une instance GeoServer via l’API RESTConfig de GeoServer.

Le projet est distribué sous une MIT License .

Installation

pip install gsconfig

Pour les développeurs.

git clone git@github.com:boundlessgeo/gsconfig.git
cd gsconfig
python setup.py develop

Obtention d’aide

Il y a un bref manuel à http://boundlessgeo.github.io/gsconfig/. Si vous avez des questions, veuillez les poser sur la liste de diffusion des utilisateurs de GeoServer : http://geoserver.org/comm/.

S’il vous plaît utiliser le projet Github à http://github.com/boundlessgeo/gsconfig pour tout rapport de bug (et pull requêtes sont les bienvenus, mais s’il vous plaît incluez des essais si possible).

Code de création de couche échantillon

from geoserver.catalog import Catalog
cat = Catalog("http://localhost:8080/geoserver/")
topp = cat.get_workspace("topp")
shapefile_plus_sidecars = shapefile_and_friends("states")
# shapefile_and_friends should look on the filesystem to find a shapefile
# and related files based on the base path passed in
#
# shapefile_plus_sidecars == {
#    'shp': 'states.shp',
#    'shx': 'states.shx',
#    'prj': 'states.prj',
#    'dbf': 'states.dbf'
# }

# 'data' is required (there may be a 'schema' alternative later, for creating empty featuretypes)
# 'workspace' is optional (GeoServer's default workspace is used by... default)
# 'name' is required
ft = cat.create_featurestore(name, workspace=topp, data=shapefile_plus_sidecars)

Exécution de Tests

Alors que le but de ce module est d’interagir avec GeoServer, la suite de test est principalement composée de tests d’intégration. Ces tests reposent nécessairement sur une copie de fonctionnement de GeoServer, et attendent que cette instance GeoServer utilise le répertoire de données par défaut qui est inclus avec GeoServer. Ces données sont également inclues dans le référentiel source GeoServer que /data/release/. En outre, il est prévu qu’il y aura une base de données postgres disponible à postgres:password@localhost:5432/db. Vous pouvez tester la connexion à cette base de données avec le client en ligne de commande psql en exécutant $ psql -d db -Upostgres -h localhost -p 5432 (vous serez invité interactivement pour le mot de passe.)

Pour substituer les paramètres de connexion de base de données supposé,des variables d’environnement suivants sont prises en charge :

  • DATABASE
  • DBUSER
  • DBPASS

S’il est présent, psycopg servira à vérifier la connexion de base de données avant d’exécuter les tests.

Si fourni, les variables d’environnement suivantes serviront à réinitialiser le répertoire de données :

GEOSERVER_HOME

Emplacement du dépôt git pour lire les données propres . Si cette option est fournie git clean servira à réinitialiser les données.

GEOSERVER_DATA_DIR

L’emplacement optionnel de la données dir geoserver s’exécutera. Si fourni, rsync servira à réinitialiser les données.

GS_VERSION

Variable d’environnement facultatif permettant les cas de test de catalogue pour automatiquement télécharger et démarrer une forme de guerre GeoServer vanille le web. N’oubliez pas qu’il n’y a aucun service en cours d’exécution sur le port HTTP 8080.

Voici les commandes que j’utilise pour remettre à zéro avant d’exécuter les tests de gsconfig :

$ cd ~/geoserver/src/web/app/
$ PGUSER=postgres dropdb db
$ PGUSER=postgres createdb db -T template_postgis
$ git clean -dxff -- ../../../data/release/
$ git checkout -f
$ MAVEN_OPTS="-XX:PermSize=128M -Xmx1024M" \
GEOSERVER_DATA_DIR=../../../data/release \
mvn jetty:run

À ce stade, GeoServer s’exécutera en avant, mais il faudra quelques secondes pour commencer réellement à l’écoute des requêtes http. Vous pouvez l’arrêter avec CTRL-C (mais ne le faites pas jusqu’à ce que vous avez exécuté les tests!) Vous pouvez exécuter les tests de gsconfig avec la commande suivante :

$ python setup.py test

Au lieu de redémarrer GeoServer après chaque course , réinitialiser les données, ce qui suit devrait permettre réexécuter les tests :

$ git clean -dxff -- ../../../data/release/
$ curl -XPOST --user admin:geoserver http://localhost:8080/geoserver/rest/reload

Exemples plus - mise à jour pour GeoServer 2.4 +

Il est assez facile de charger la GeoServer catalog à l’aide de gsconfig. L’exemple ci-dessous permet de vous connecter à GeoServer en spécifiant les informations d’identification personnalisées.

from geoserver.catalog import Catalog
cat = Catalog("http://localhost:8080/geoserver/rest/", "admin", "geoserver")

Le code ci-dessous permet de créer un FeatureType d’un Shapefile

geosolutions = cat.get_workspace("geosolutions")
import geoserver.util
shapefile_plus_sidecars = geoserver.util.shapefile_and_friends("C:/work/gsconfig/test/data/states")
# shapefile_and_friends should look on the filesystem to find a shapefile
# and related files based on the base path passed in
#
# shapefile_plus_sidecars == {
#    'shp': 'states.shp',
#    'shx': 'states.shx',
#    'prj': 'states.prj',
#    'dbf': 'states.dbf'
# }
# 'data' is required (there may be a 'schema' alternative later, for creating empty featuretypes)
# 'workspace' is optional (GeoServer's default workspace is used by... default)
# 'name' is required
ft = cat.create_featurestore("test", shapefile_plus_sidecars, geosolutions)

Il est possible de créer un calque virtuel JDBC trop. Le code ci-dessous permet de créer une nouvelle vue de SQL, appelée my_jdbc_vt_test, définie par une coutume sql.

from geoserver.catalog import Catalog
from geoserver.support import JDBCVirtualTable, JDBCVirtualTableGeometry, JDBCVirtualTableParam

cat = Catalog('http://localhost:8080/geoserver/rest/', 'admin', '****')
store = cat.get_store('postgis-geoserver')
geom = JDBCVirtualTableGeometry('newgeom','LineString','4326')
ft_name = 'my_jdbc_vt_test'
epsg_code = 'EPSG:4326'
sql = 'select ST_MakeLine(wkb_geometry ORDER BY waypoint) As newgeom, assetid, runtime from waypoints group by assetid,runtime'
keyColumn = None
parameters = None

jdbc_vt = JDBCVirtualTable(ft_name, sql, 'false', geom, keyColumn, parameters)
ft = cat.publish_featuretype(ft_name, store, epsg_code, jdbc_virtual_table=jdbc_vt)

Cet exemple montre comment mettre à jour une propriété de la couche. La même approche peut être utilisée avec toutes les ressources catalogue

ne_shaded = cat.get_layer("ne_shaded")
ne_shaded.enabled=True
cat.save(ne_shaded)
cat.reload()

Pour supprimer une store du catalogue, vous devez purger tous les associés couches tout d’abord. Ceci peut être fait en faisant quelque chose comme ceci :

st = cat.get_store("ne_shaded")
cat.delete(ne_shaded)
cat.reload()
cat.delete(st)
cat.reload()

Il y a certaines fonctionnalités permettant de gérer les couvertures de ImageMosaic. Il est possible de créer de nouvelles ImageMosaics,de leur ajouter des granules, lire les métadonnées de couvertures, modifier la mosaïque Dimensions et enfin interroger la mosaïque granulés et leurs propriétés de la liste.

The gsconfig methods map the REST APIs for ImageMosaic

Afin de créer une nouvelle couche de ImageMosaic, vous pouvez préparer un fichier zip contenant les fichiers de propriétés pour la configuration de la mosaïque. Consultez le guide de GeoTools ImageMosaic Plugin afin d’obtenir des détails sur la configuration de la mosaïque. Le package contient un fichier zip déjà configuré avec deux granules. Vous devez mettre à jour ou supprimer le fichier datastore.properties avant de créer la mosaïque sinon vous obtiendrez une exception.

from geoserver.catalog import Catalog
cat = Catalog("http://localhost:8180/geoserver/rest")
cat.create_imagemosaic("NOAAWW3_NCOMultiGrid_WIND_test", "NOAAWW3_NCOMultiGrid_WIND_test.zip")

Par defaut le cat.create_imagemosaic essaie de configurer la couche aussi. Si vous souhaitez créer le magasin seulement, vous pouvez spécifier le paramètre suivant

cat.create_imagemosaic("NOAAWW3_NCOMultiGrid_WIND_test", "NOAAWW3_NCOMultiGrid_WIND_test.zip", "none")

Afin de récupérer le catalogue du magasin de couverture ImageMosaic vous pouvez le faire

store = cat.get_store("NOAAWW3_NCOMultiGrid_WIND_test")

Il est possible d’ajouter plus de granules à la mosaïque à l’exécution. Avec la méthode suivante, vous pouvez ajouter granules déjà présents sur le chemin d’accès local de la machine.

cat.harvest_externalgranule("file://D:/Work/apache-tomcat-6.0.16/instances/data/data/MetOc/NOAAWW3/20131001/WIND/NOAAWW3_NCOMultiGrid__WIND_000_20131001T000000.tif", store)

La méthode ci-dessous permet d’envoyer des granules à distance via POST à l’ImageMosaic. Les granules seront téléchargées et stockées sur le dossier d’index ImageMosaic.

cat.harvest_uploadgranule("NOAAWW3_NCOMultiGrid__WIND_000_20131002T000000.zip", store)

Pour supprimer un magasin ImageMosaic, vous pouvez suivre l’approche standard, en supprimant les couches tout d’abord. ATTENTION: en ce moment vous devez nettoyer manuellement le répertoire de données des granules mosaïque et, dans le cas où vous avez utilisé un magasin de données de DB, vous devez également supprimer les tableaux de mosaïque.

layer = cat.get_layer("NOAAWW3_NCOMultiGrid_WIND_test")
cat.delete(layer)
cat.reload()
cat.delete(store)
cat.reload()

La méthode ci-dessous permet la charge et mise à jour des métadonnées de la couverture de l’ ImageMosaic. Vous devez procéder ainsi pour chaque couverture de l’ ImageMosaic bien sûr.

coverage = cat.get_resource_by_url("http://localhost:8180/geoserver/rest/workspaces/natocmre/coveragestores/NOAAWW3_NCOMultiGrid_WIND_test/coverages/NOAAWW3_NCOMultiGrid_WIND_test.xml")
coverage.supported_formats = ['GEOTIFF']
cat.save(coverage)

Par défaut, la couche de ImageMosaic n’a pas les dimensions de couverture configurées. Il est possible en utilisant les métadonnées de couverture pour mettre à jour et gérer les dimensions de la couverture. ATTENTION: Notez que les paramètres de présentation n’accepte qu’une des valeurs suivantes {‘LIST’, ‘DISCRETE_INTERVAL’, ‘CONTINUOUS_INTERVAL’}

from geoserver.support import DimensionInfo
timeInfo = DimensionInfo("time", "true", "LIST", None, "ISO8601", None)
coverage.metadata = ({'dirName':'NOAAWW3_NCOMultiGrid_WIND_test_NOAAWW3_NCOMultiGrid_WIND_test', 'time': timeInfo})
cat.save(coverage)

L’ ImageMosaic a été configurée, il est possible de lire des couvertures ainsi que leur schéma de granule et les infos de la granule.

from geoserver.catalog import Catalog
cat = Catalog("http://localhost:8180/geoserver/rest")
store = cat.get_store("NOAAWW3_NCOMultiGrid_WIND_test")
coverages = cat.mosaic_coverages(store)
schema = cat.mosaic_coverage_schema(coverages['coverages']['coverage'][0]['name'], store)
granules = cat.mosaic_granules(coverages['coverages']['coverage'][0]['name'], store)

Les détails de granules peuvent être lues facilement en faisant quelque chose comme ceci :

granules['crs']['properties']['name']
granules['features']
granules['features'][0]['properties']['time']
granules['features'][0]['properties']['location']
granules['features'][0]['properties']['run']

Lorsque la mosaïque grandit et commence à avoir un vaste ensemble de granules, vous devrez filtrer la requête de granules à travers un filtre CQL sur les attributs de schéma de couverture.

granules = cat.mosaic_granules(coverages['coverages']['coverage'][0]['name'], store, "time >= '2013-10-01T03:00:00.000Z'")
granules = cat.mosaic_granules(coverages['coverages']['coverage'][0]['name'], store, "time >= '2013-10-01T03:00:00.000Z' AND run = 0")
granules = cat.mosaic_granules(coverages['coverages']['coverage'][0]['name'], store, "location LIKE '%20131002T000000.tif'")