6. CRS Management¶
6.1. Introduction¶
SECORE
(Semantic Coordinate Reference System Resolver) is a server which
resolves CRS URLs into full CRS definitions represented in GML 3.2.1.
The implementation constitutes the official resolver of OGC, accessible
under http://www.opengis.net/def/crs/
SECORE accepts axis, CRS, and CRS template identifiers as input URLs in GET-KVP and RESTful syntax. Further, it accepts general XQuery requests on its CRS database. It is accessible at the following service endpoint:
http://www.opengis.net/def/axis
for Axis Identifier URLshttp://www.opengis.net/def/crs
for CRS Identifier URLs and CRS Template URLshttp://www.opengis.net/def/crs-compound
for Compound CRS URLshttp://www.opengis.net/def/equal
for semantic CRS URL comparisonhttp://www.opengis.net/def/crs-query
for general XQuery requests
If deployed locally, then substitute the official opengis.net part with localhost, or your own domain.
6.2. Service¶
SECORE stores and queries XML data in a BaseX XML
database. On the disk this database is stored in
$CATALINA_HOME/webapps/secoredb
, this is the directory where the Tomcat
process will typically have write access. The database is created and maintained
automatically, so no action by the user is required regarding this.
There are two types of definition collections:
gml
collection which is fixed and cannot be modified; this is based on the EPSG dictionary.
Note
SECORE (def.war
) is bundled with several EPSG dataset version, however
they may get outdated. For this reason it is possible to manually download
the latest EPSG dataset and add it to SECORE as follows:
1. Create a new directory in the secoredb
directory (usually in the same
directory as def.war
, e.g. /var/lib/tomcat/webapps/secoredb
)
named gml_number.number(.number)?)
.
2. Extract the EPSG GML dictionary in this folder.
3. Restart Tomcat to allow SECORE to load the new EPSG version.
For example, for EPSG version 9.5.2 it’s necessary to create directory
secoredb/gml_9.5.2
and put the extracted GmlDictionary.xml
file into it.
user
collection where users can add/update/delete definitions.
Each definition has an identifier which is checked when updating/deleting a particular definition. When inserting a definition, its identifier must not exist in SECORE already.
<gml:identifier codeSpace="EPSG">
http://www.opengis.net/def/crs/EPSG/0/4326
</gml:identifier>
Note
Until v9.7, version 0 in CRS identifiers referred to EPSG dataset version 8.5.
From v9.7, version 0 in CRS identifiers refers to the latest EPSG dataset version.
This means that the CRS definition corresponding to a URL such as
http://localhost:8080/def/crs/EPSG/0/4326
is dynamic and may change with
new releases of the EPSG dataset. For this reason it is now recommended to
specify an exact version, e.g. 9.4.2 instead of 0.
6.2.1. User interface¶
The SECORE database tree can be viewed and (upon login) modified via graphical
web interface at http://your.server/def/index.jsp
.
More generally, any folder and definition can turn to EDIT mode by appending a
/browse.jsp
to its URI; e.g.
http://your.server/def/uom/EPSG/0/9001/browse.jsp
will let you view/edit EPSG:9001 unit of measure, whereas"http://your.server/def/uom/EPSG/0/browse.jsp"
will let you either remove EPSG UoM definitions or add a new one, not necessarily under the EPSG branch: the"gml:identifier"
of the new definition will determine its position in the tree.
In this document
you can find hints on how to to define new GML definitions of CRSs. Mind that
compounding is achieved at resolve-time by querying SECORE with a
"crs-compound"
path, so that only single CRS definitions should be added.
With regard to parametrized CRSs, you should mind that relative XPaths are not allowed (either start
with /
or //
when selecting nodes); non-numeric parameters must be
embraced by single or double quotes both when setting optional default values
in the definition or when setting custom values in the URI.
6.2.2. Configuration¶
The SECORE configuration can be found in $RMANHOME/etc/secore.properties
;
editing this file requires restarting Tomcat.
6.2.2.1. Security¶
You should set the secore_admin_user
, secore_admin_pass
options to
prevent unauthorized users from editing CRS definitions in the userdb
CRS
collection. If these are not set or commented out, then the admin pages have
public access.
6.2.2.2. Standalone deployment¶
Instead of running SECORE in an external Tomcat (the default way), you can run
it through its embedded Tomcat which is included inside the SECORE java web
application (def.war
). To do this, you need to change the java_server
option to embedded
, and change the server.port
to a port which is not
used in your system (e.g. server.port=8082
).
Then restart rasdaman and you can access SECORE at http://localhost:8082/def
(if server.port=8082
has been set).
6.2.2.3. Logging¶
At the end of secore.properties
you will find the logging configuration. It
is recommended to adjust this, and make sure that Tomcat has permissions to
write the secore.log file.
6.3. Concepts¶
6.3.1. CRS templates¶
CRS templates are concrete definitions targeted by parameterized CRSs where one or more named parameters allow the customization of one or more elements in the template itself. As such, they describe (possibly infinite) sets of concrete CRSs.
Note
The term “parametrized” is generally avoided because it may lead to confusion with the term “parametric” in OGC Abstract Topic 2 / ISO 19111-2:2009 which has a significantly different meaning.
Parameters can be resolved through values provided in the CRS URI, or through defaults defined in the CRS Template definition. Additionally, expressions (“formulae”) can be associated with a CRS Template which evaluate to values when instantiated with parameter values. All values, whether instantiated in a URL request or coming from a default or a formula, can be substituted in one or several places in the concrete CRS definition associated with the CRS Template.
Example
The following URI defines the Auto Orthographic CRS 42003 specified in sub clauses 6.7.3.4 and B.9 of WMS 1.3.0 for “meter” as unit of measure and centred at 100? West longitude and 45? North latitude:
http://www.opengis.net/def/crs?
authority=OGC&
version=1.3&
code=AUTO42003&
UoM=m&
CenterLongitude=-100&
CenterLatitude=45&
Note
Additional examples of not-completely-specified objects can be found in sub clauses B.7, B.8, B.10, and B.11 of the`WMS 1.3.0 spec <http://portal.opengeospatial.org/files/?artifact_id=14416>`__, and in sub clauses 10.1 through 10.3 of OGC 05-096r1 (GML 3.1.1 grid CRSs profile).
6.3.1.1. Structure¶
Formally, a CRS Template is a GML document with root
crsnts:AbstractCRSTemplate
. It contains an element crsnts:CrsDefinition
of some instantiatable subtype of gml:AbstractCRS
together with a list of
formal parameters.
Parameters are crsnts:Parameter
elements listed in the crsnts:Parameters
section. A formal parameter consists of a locally unique name, an XPath target
expression indicating one or a set of substitution points relative to the CRS
subnode, optionally a default value, and optionally a formula. Further, each
parameter has a type associated.
The crsnts:value
element contains a well-formed formula adhering to the JSR
scripting syntax as specified in JSR-233 [5]. The type associated in the
formula’s crsnts:Parameters
element denotes the result type of the
expression. Names are enclosed in ${
and }
; when used in a formula they
shall contain only references to parameter names defined in the same CRS
Template, and no (direct or indirect) recursive references across formulae.
Note
In particular, a formula cannot have its own parameter name as a free parameter. The target expression in crsnts:target indicates the places where, during request evaluation, the resulting parameter (obtained from URL input, or formula evaluation, or by using the default) gets applied to the CRS definition, assuming crsnts:CrsDefinition as the relative document root for XPath evaluation.
Example
The following XML snippet defines a geodetic Parametrized CRS with formal parameter x substituting parameter values in all (fictitious) axisName elements appearing the GeodeticCRS root of the CRS definition:
<crsnts:ParameterizedCRS>
<gml:identifier>...</gml:identifier>
<gml:scope>...</gml:scope>
<crsnts:parameters>
<crsnts:parameter name="lon" >
<crsnts:value>90</crsnts:value>
<crsnts:target>//longitude | //Longitude</crsnts:target>
</crsnts:parameter>
<crsnts:parameter name="zone">
<crsnts:target>//greenwichLongitude</crsnts:target>
<crsnts:value>
min(floor((${lon} + 180.0) / 6.0) + 1,60)
</crsnts:value>
</crsnts:parameter>
</crsnts:parameters>
<crsnts:targetReferenceSystem
xlink:href="http://www.opengis.net/def/crs/EPSG/0/4326"/>
</crsnts:ParameterizedCRS>
6.3.1.2. Resolution¶
The result of a URI request against a Parametrized CRS depends on the degree of
parameter matching; it is GML document with its root being an instantiatable
subtype of either gml:AbstractCRS
or crsnts:AbstractCRSTemplate
. The
response is:
In case all formal parameters in the Parametrized CRS addressed are matched: a CRS definition where all parameters matched are resolved.
Example. Assuming that the name of the above Parametrized CRS example is my-own-crs, a possible instantiation of this CRS to a concrete CRS Identifier is
http://www.opengis.net/def/crs/my-own-crs?lon=47.6
The response to this instantiation is
<gml:GeodeticCRS> ... <gml:GeodeticCRS>
In case not all parameters are matched: a Parametrized CRS where all parameters matched are resolved, their corresponding crsnts:Parameter is removed, and only the non-matched parameters remain in the template.
Example. Assuming the same example as above, the CRS itself can be obtained through
http://www.opengis.net/def/crs/my-own-crs
The response to this request is
<crsnts:ParameterizedCRS> <gml:identifier>...</gml:identifier> <gml:scope>...</gml:scope> <crsnts:parameters> ... </crsnts:parameters> <crsnts:targetReferenceSystem xlink:href="..."/> </crsnts:ParameterizedCRS>
6.3.2. CRS equality¶
It is possible that one and the same CRS, axis, etc. is identified by a number of syntactically different URLs, and it is not straightforward for applications to decide about equivalence of two given URIs. To remedy this, a comparison predicate is available in SECORE. A request sent to URL
http://www.opengis.net/def/crs-equal?1=A&2=B
containing two URLs A and B listed as GET/KVP parameters with names 1 and 2, respectively, will result in a response of true if and only if both URLs identify the same concept, and false otherwise; the response is embedded in an XML document.
Example
Comparing EPSG codes 4327 and 4326 can be done with this URL:
http://www.opengis.net/def/equal?
1=http://www.opengis.net/def/crs/EPSG/0/4327
&2=http://www.opengis.net/def/crs/EPSG/0/4326
The response will look like this:
<crsnts:comparisonResult xmlns='http://www.opengis.net/crs-nts/1.0'>
<crsnts:equal>false</crsnts:equal>
<crsnts:reason>
<![CDATA[ ...description text... ]]>
</crsnts:reason>
</crsnts:comparisonResult>
6.3.3. Directly Querying SECORE¶
An XQuery GET or POST request sent to URL http://www.opengis.net/def/crs-query will result in a document obtained from evaluating the XQuery request according to the XQuery standard.