You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

331 lines
14 KiB

/******************************************************************************
* $Id$
*
* Project: MapServer
* Purpose: OpenGIS Web Coverage Server (WCS) Declarations.
* Author: Steve Lime, Frank Warmerdam and the MapServer Team
*
******************************************************************************
* Copyright (c) 1996-2005 Regents of the University of Minnesota.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies of this Software or works derived from this Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#ifndef MAPWCS_H
#define MAPWCS_H
#include "mapserver.h"
#include "mapowscommon.h"
#include <limits.h>
#include <time.h>
#include <float.h>
#ifndef _WIN32
#include <sys/time.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*
* Definitions
*/
#define MS_WCS_GML_COVERAGETYPE_RECTIFIED_GRID_COVERAGE "RectifiedGridCoverage"
enum { MS_WCS_GET_CAPABILITIES, MS_WCS_DESCRIBE_COVERAGE, MS_WCS_GET_COVERAGE };
/*
** Structure to hold metadata taken from the image or image tile index
*/
typedef struct {
char *srs_epsg;
char srs_urn[500];
rectObj extent, llextent;
double geotransform[6];
int xsize, ysize;
double xresolution, yresolution;
int bandcount;
int imagemode;
const char *bandinterpretation[10];
} coverageMetadataObj;
typedef struct {
char *version; /* 1.0.0 for now */
char *updatesequence; /* string, int or timestampe */
char *request; /* GetCapabilities|DescribeCoverage|GetCoverage */
char *service; /* MUST be WCS */
char *
section; /* of capabilities document:
/WCS_Capabilities/Service|/WCS_Capabilities/Capability|/WCS_Capabilities/ContentMetadata
*/
char **coverages; /* NULL terminated list of coverages (in the case of a
GetCoverage there will only be 1) */
char *crs; /* request coordinate reference system */
char *response_crs; /* response coordinate reference system */
rectObj bbox; /* subset bounding box (3D), although we'll only use 2D */
char *time;
long width, height, depth; /* image dimensions */
double originx, originy; /* WCS 1.1 GridOrigin */
double resx, resy, resz; /* resolution */
char *interpolation; /* interpolationMethod */
char *format;
char *exceptions; /* exception MIME type, (default application=vnd.ogc.se_xml)
*/
} wcsParamsObj;
/* -------------------------------------------------------------------- */
/* Prototypes from mapwcs.c used in mapwcs11.c. */
/* */
/* Note, all prototypes are deliberately not exported from DLL */
/* since they are for internal use within the core. */
/* -------------------------------------------------------------------- */
void msWCSFreeParams(wcsParamsObj *params);
int msWCSException(mapObj *map, const char *code, const char *locator,
const char *version);
int msWCSIsLayerSupported(layerObj *layer);
int msWCSGetCoverageMetadata(layerObj *layer, coverageMetadataObj *cm);
void msWCSFreeCoverageMetadata(coverageMetadataObj *cm);
void msWCSSetDefaultBandsRangeSetInfo(wcsParamsObj *params,
coverageMetadataObj *cm, layerObj *lp);
const char *msWCSGetRequestParameter(cgiRequestObj *request, const char *name);
void msWCSApplyLayerCreationOptions(layerObj *lp, outputFormatObj *format,
const char *bandlist);
void msWCSApplyDatasetMetadataAsCreationOptions(layerObj *lp,
outputFormatObj *format,
const char *bandlist,
void *hDSIn);
void msWCSApplyLayerMetadataItemOptions(layerObj *lp, outputFormatObj *format,
const char *bandlist);
void msWCSApplySourceDatasetMetadata(layerObj *lp, outputFormatObj *format,
const char *bandlist, void *hDSIn);
/* -------------------------------------------------------------------- */
/* Some WCS 1.1 specific functions from mapwcs11.c */
/* -------------------------------------------------------------------- */
int msWCSGetCapabilities11(mapObj *map, wcsParamsObj *params,
cgiRequestObj *req, owsRequestObj *ows_request);
int msWCSDescribeCoverage11(mapObj *map, wcsParamsObj *params,
owsRequestObj *ows_request);
int msWCSReturnCoverage11(wcsParamsObj *params, mapObj *map, imageObj *image);
int msWCSGetCoverageBands11(mapObj *map, cgiRequestObj *request,
wcsParamsObj *params, layerObj *lp,
char **p_bandlist);
int msWCSException11(mapObj *map, const char *locator,
const char *exceptionCode, const char *version);
/* -------------------------------------------------------------------- */
/* Some WCS 2.0 specific functions and structs from mapwcs20.c */
/* -------------------------------------------------------------------- */
enum { MS_WCS20_TRIM = 0, MS_WCS20_SLICE = 1 };
enum {
MS_WCS20_ERROR_VALUE = -1,
MS_WCS20_SCALAR_VALUE = 0,
MS_WCS20_TIME_VALUE = 1,
MS_WCS20_UNDEFINED_VALUE = 2
};
#define MS_WCS20_UNBOUNDED DBL_MAX
#define MS_WCS20_UNBOUNDED_TIME 0xFFFFFFFF
typedef struct {
union {
double scalar;
time_t time;
};
int unbounded; /* 0 if bounded, 1 if unbounded */
} timeScalarUnion;
typedef struct {
char *axis; /* the name of the subsetted axis */
int operation; /* Either TRIM or SLICE */
char *crs; /* optional CRS to use */
int timeOrScalar; /* 0 if scalar value, 1 if time value */
timeScalarUnion min; /* Minimum and Maximum of the subsetted axis;*/
timeScalarUnion max;
} wcs20SubsetObj;
typedef wcs20SubsetObj *wcs20SubsetObjPtr;
typedef struct {
char *name; /* name of the axis */
int size; /* pixelsize of the axis */
double resolution; /* resolution of the axis */
double scale; /* scale of the axis */
char *resolutionUOM; /* resolution units of measure */
wcs20SubsetObjPtr subset;
} wcs20AxisObj;
typedef wcs20AxisObj *wcs20AxisObjPtr;
typedef struct {
char *version; /* 2.0.0 v 2.0.1 */
char *request; /* GetCapabilities|DescribeCoverage|GetCoverage */
char *service; /* MUST be WCS */
char **accept_versions; /* NULL terminated list of Accepted versions */
char **accept_languages; /* NULL terminated list of Accepted versions */
char **sections; /* NULL terminated list of GetCapabilities sections */
char *updatesequence; /* GetCapabilities updatesequence */
char **ids; /* NULL terminated list of coverages (in the case of a GetCoverage
there will only be 1) */
long width, height; /* image dimensions */
double resolutionX; /* image resolution in X axis */
double resolutionY; /* image resolution in Y axis */
double scale; /* Overall scale */
double scaleX; /* X-Axis specific scale */
double scaleY; /* Y-Axis specific scale */
char *resolutionUnits; /* Units of Measure for resolution */
char *format; /* requested output format */
int multipart; /* flag for multipart GML+image */
char *interpolation; /* requested interpolation method */
char *outputcrs; /* requested CRS for output */
char *subsetcrs; /* determined CRS of the subsets */
rectObj bbox; /* determined Bounding Box */
int numaxes; /* number of axes */
wcs20AxisObjPtr *axes; /* list of axes, NULL if none*/
char **range_subset; /* list of bands selected */
char **format_options; /* list of format specific options, NULL terminated */
} wcs20ParamsObj;
typedef wcs20ParamsObj *wcs20ParamsObjPtr;
typedef struct {
union {
struct {
char *name;
char *interpretation;
char *uom;
char *definition;
char *description;
};
char *values[5];
};
double interval_min;
double interval_max;
int significant_figures;
} wcs20rasterbandMetadataObj;
typedef wcs20rasterbandMetadataObj *wcs20rasterbandMetadataObjPtr;
typedef struct {
char *native_format; /* mime type of the native format */
char *srs_epsg;
char srs_uri[200];
rectObj extent;
double geotransform[6];
double xresolution;
double yresolution;
int xsize;
int ysize;
int imagemode;
size_t numnilvalues;
char **nilvalues;
char **nilvalues_reasons;
size_t numbands;
wcs20rasterbandMetadataObjPtr bands;
} wcs20coverageMetadataObj;
typedef wcs20coverageMetadataObj *wcs20coverageMetadataObjPtr;
#define MS_WCS_20_PROFILE_CORE "http://www.opengis.net/spec/WCS/2.0/conf/core"
#define MS_WCS_20_PROFILE_KVP \
"http://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0/conf/get-kvp"
#define MS_WCS_20_PROFILE_POST \
"http://www.opengis.net/spec/WCS_protocol-binding_post-xml/1.0/conf/" \
"post-xml"
#define MS_WCS_20_PROFILE_GML \
"http://www.opengis.net/spec/GMLCOV/1.0/conf/gml-coverage"
#define MS_WCS_20_PROFILE_GML_MULTIPART \
"http://www.opengis.net/spec/GMLCOV/1.0/conf/multipart"
#define MS_WCS_20_PROFILE_GML_SPECIAL \
"http://www.opengis.net/spec/GMLCOV/1.0/conf/special-format"
#define MS_WCS_20_PROFILE_GML_GEOTIFF \
"http://www.opengis.net/spec/GMLCOV_geotiff-coverages/1.0/conf/" \
"geotiff-coverage"
#define MS_WCS_20_PROFILE_CRS \
"http://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crs"
#define MS_WCS_20_PROFILE_SCALING \
"http://www.opengis.net/spec/WCS_service-extension_scaling/1.0/conf/scaling"
#define MS_WCS_20_PROFILE_RANGESUBSET \
"http://www.opengis.net/spec/WCS_service-extension_range-subsetting/1.0/" \
"conf/record-subsetting"
#define MS_WCS_20_PROFILE_INTERPOLATION \
"http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/" \
"interpolation"
/* -------------------------------------------------------------------- */
/* WCS 2.0 function prototypes. */
/* -------------------------------------------------------------------- */
wcs20ParamsObjPtr msWCSCreateParamsObj20();
void msWCSFreeParamsObj20(wcs20ParamsObjPtr params);
int msWCSParseRequest20(mapObj *map, cgiRequestObj *request,
owsRequestObj *ows_request, wcs20ParamsObjPtr params);
int msWCSException20(mapObj *map, const char *locator,
const char *exceptionCode, const char *version);
int msWCSGetCapabilities20(mapObj *map, cgiRequestObj *req,
wcs20ParamsObjPtr params,
owsRequestObj *ows_request);
int msWCSDescribeCoverage20(mapObj *map, wcs20ParamsObjPtr params,
owsRequestObj *ows_request);
int msWCSGetCoverage20(mapObj *map, cgiRequestObj *request,
wcs20ParamsObjPtr params, owsRequestObj *ows_request);
/* -------------------------------------------------------------------- */
/* XML parsing helper macros. */
/* -------------------------------------------------------------------- */
#define XML_FOREACH_CHILD(parent_node, child_node) \
for (child_node = parent_node->children; child_node != NULL; \
child_node = child_node->next)
/* Macro to continue the iteration over an xml structure */
/* when the current node has the type 'text' or 'comment' */
#define XML_LOOP_IGNORE_COMMENT_OR_TEXT(node) \
if (xmlNodeIsText(node) || node->type == XML_COMMENT_NODE) { \
continue; \
}
/* Macro to set an XML error that an unknown node type */
/* occurred. */
#define XML_UNKNOWN_NODE_ERROR(node) \
msSetError(MS_WCSERR, "Unknown XML element '%s'.", __FUNCTION__, \
(char *)node->name); \
return MS_FAILURE;
#define XML_ASSERT_NODE_NAME(node, nodename) \
if (EQUAL((char *)node->name, nodename) == MS_FALSE) { \
XML_UNKNOWN_NODE_ERROR(node); \
}
#define MS_WCS_20_CAPABILITIES_INCLUDE_SECTION(params, section) \
(params->sections == NULL || CSLFindString(params->sections, "All") != -1 || \
CSLFindString(params->sections, section) != -1)
#if defined(USE_LIBXML2)
#include "maplibxml2.h"
void msWCS_11_20_PrintMetadataLinks(layerObj *layer, xmlDocPtr doc,
xmlNodePtr psCSummary);
#endif
#ifdef __cplusplus
} /* extern C */
#endif
#endif /* nef MAPWCS_H */