3 votos

¿Cómo puedo exportar automáticamente una versión del registro EPSG?

Estoy tratando de utilizar el Registro EPSG API para exportar una versión del registro para su uso fuera de línea, pero estoy recibiendo un error de registro.

Después de seguir el Guía del desarrollador Estoy enviando por HTTP POST la siguiente solicitud XML a la URL de la API:

<?xml version="1.0" encoding="UTF-8"?>
<GetRecords 
    xmlns="http://www.opengis.net/cat/csw" 
    xmlns:ogc="http://www.opengis.net/ogc" 
    startPosition="1" maxRecords="100" 
    outputFormat="application/xml; charset=UTF-8" 
    resultType="results">
  <!--  
    Retrieve the ReleaseObject releated to the current Version History record.
    Then use the ReleaseObject identifier to obtain the actual compressed 
    GML Dictionary file containing the EPSG Dataset via a getRepositoryItem 
    request.
  --> 
  <Query typeNames="Association=a RegistryObject=release">
    <ElementSetName typeNames="release">full</ElementSetName>
    <Constraint version="1.1.0">
      <ogc:Filter>
        <ogc:And>
          <!-- find the correct association --> 
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$a/targetObject</ogc:PropertyName>
            <ogc:Literal>urn:ogc:def:version-history:EPSG::6.15</ogc:Literal>
          </ogc:PropertyIsEqualTo>
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$a/associationType</ogc:PropertyName>
            <ogc:Literal>
              urn:x-ogp:def:AssociationType:EPSG:ReleaseFor</ogc:Literal>
          </ogc:PropertyIsEqualTo>
          <!-- now relate it to the ReleaseObject --> 
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$a/sourceObject</ogc:PropertyName>
            <ogc:PropertyName>$release/id</ogc:PropertyName>
          </ogc:PropertyIsEqualTo>
       </ogc:And>
      </ogc:Filter>
    </Constraint>
  </Query>
</GetRecords>

El XML se copia de sección 5.3 'Cómo... Exportar una liberación' de la guía, y la URL para enviar GetRecords se sugiere por sección 4.1.1 "GetRecordById . La respuesta de error XML que obtengo es la siguiente:

<?xml version="1.0"?>
<ows:ExceptionReport xmlns:ows="http://www.opengis.net/ows" version="2.0">
  <ows:Exception exceptionCode="InvalidRequest">
    <ows:ExceptionText>XML Schema validation error</ows:ExceptionText>
    <ows:ExceptionText>
Error:Error
 Line:    2
 Column:  193
 Message: cvc-elt.1: Cannot find the declaration of element 'GetRecords'.
    </ows:ExceptionText>                                               
  </ows:Exception>
</ows:ExceptionReport>

Estoy utilizando el curl programa de línea de comandos para ejecutar la consulta de la siguiente manera:

curl -H 'Content-Type: appliation/xml' --data @request.xml 'http://www.epsg-registry.org/indicio/query'

¿Puedes ver dónde me equivoco? Si no es así, ¿hay alguna otra forma de descargar automáticamente el registro? Soy consciente de que puedo entrar en la interfaz HTML del Registro y descargar el registro desde allí, pero me gustaría pero me gustaría automatizar el proceso.

4voto

Symmetric Puntos 158

Me parece que el servidor está tratando de validar su solicitud XML, y no encontrar el XSD que contiene la definición de GetRecords .

Creo que el ejemplo de EPSG está obsoleto para ese servidor, porque al cambiar el espacio de nombres CSW a http://www.opengis.net/cat/csw/2.0.2 me da más errores sobre el Query elemento. El anexo C de la especificación de la API de EPSG nos dice que sólo es compatible con CSW 2.0.1, pero tampoco he tenido suerte con esa versión.

Así que yo leería sobre las peticiones XML POST de CSW 2.0.2 y reformularía tu petición para que sea válida 2.0.2 y vería lo que resulta.

Mi experiencia con este tipo de documentación es que se escribió un ejemplo para una versión y funcionó, luego actualizaron otras partes de la documentación sin hacer pruebas de regresión de los ejemplos. Por ejemplo, he probado el GetRepositoryItem y en los documentos lo pone todo en minúsculas, mientras que el servidor sólo acepta CamelCase.

0voto

k-fu Puntos 11

Gracias a @MerseyViking por indicarme la dirección correcta: actualizar el XML basado en el documento OGC ' Servicio de registro CSW-ebRIM - Parte 1: perfil ebRIM de CSW ' resultó ser la respuesta.

La exportación de los últimos datos del registro EPSG se realiza en 3 pasos:

1) Ejecuta una consulta para obtener el identificador de la última versión:

<?xml version="1.0" encoding="UTF-8"?>
<GetRecords
    xmlns="http://www.opengis.net/cat/csw/2.0.2"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0"
    xmlns:wrs="http://www.opengis.net/cat/wrs/1.0"
    startPosition="1"
    maxRecords="1"
    outputFormat="application/xml; charset=UTF-8"
    resultType="results"
    service="CSW-ebRIM"
    version="2.0.2">
  <!--
      Retrieve valid Version History records.
      Sort by the Version History Slot named 'VersionDate'; use Ascending order
      so that the last Version History record in the result list will represent
      the current version of the dataset.
  -->
  <Query typeNames="wrs:ExtrinsicObject_eo rim:Slot_versionDate">
    <ElementSetName typeNames="eo">brief</ElementSetName>
    <Constraint version="1.1.0">
      <ogc:Filter>
        <ogc:And>
          <ogc:PropertyIsLike wildCard="*" escapeChar="/" singleChar="?">
            <ogc:PropertyName>$eo/@id</ogc:PropertyName>
            <ogc:Literal>*:EPSG::*</ogc:Literal>
          </ogc:PropertyIsLike>
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$eo/@objectType</ogc:PropertyName>
            <ogc:Literal>urn:x-ogp:def:ObjectType:EPSG:version-history</ogc:Literal>
          </ogc:PropertyIsEqualTo>
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$eo/@status</ogc:PropertyName>
            <ogc:Literal>urn:oasis:names:tc:ebxml-regrep:StatusType:Approved</ogc:Literal>
          </ogc:PropertyIsEqualTo>
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$eo/$versionDate/@name</ogc:PropertyName>
            <ogc:Literal>VersionDate</ogc:Literal>
          </ogc:PropertyIsEqualTo>
        </ogc:And>
      </ogc:Filter>
    </Constraint>
    <ogc:SortBy>
      <ogc:SortProperty>
        <ogc:PropertyName>$eo/$versionDate/ValueList/Value</ogc:PropertyName>
        <ogc:SortOrder>DESC</ogc:SortOrder>
      </ogc:SortProperty>
    </ogc:SortBy>
  </Query>
</GetRecords>

por ejemplo, utilizando curl después de guardar el XML anterior como version.xml :

curl -H 'Content-Type: appliation/xml' --data @version.xml 'http://www.epsg-registry.org/indicio/query'

2) Ejecute una consulta para obtener la URL para descargar el ID de la versión obtenida:

<?xml version="1.0" encoding="UTF-8"?>
<GetRecords
    xmlns="http://www.opengis.net/cat/csw/2.0.2"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0"
    xmlns:wrs="http://www.opengis.net/cat/wrs/1.0"
    startPosition="1"
    maxRecords="100"
    outputFormat="application/xml; charset=UTF-8"
    resultType="results"
    service="CSW-ebRIM"
    version="2.0.2">
  <!--
      Retrieve the ReleaseObject releated to the current Version History record.
      Then use the ReleaseObject identifier to obtain the actual compressed
      GML Dictionary file containing the EPSG Dataset via a getRepositoryItem
      request.
  -->
  <Query typeNames="rim:Association_a rim:RegistryObject_release">
    <ElementSetName typeNames="release">full</ElementSetName>
    <Constraint version="1.1.0">
      <ogc:Filter>
        <ogc:And>
          <!-- find the correct association -->
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$a/targetObject</ogc:PropertyName>
            <ogc:Literal>urn:ogc:def:version-history:EPSG::7.9.6</ogc:Literal>
          </ogc:PropertyIsEqualTo>
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$a/associationType</ogc:PropertyName>
            <ogc:Literal>urn:x-ogp:def:AssociationType:EPSG:ReleaseFor</ogc:Literal>
          </ogc:PropertyIsEqualTo>
          <!-- now relate it to the ReleaseObject -->
          <ogc:PropertyIsEqualTo>
            <ogc:PropertyName>$a/sourceObject</ogc:PropertyName>
            <ogc:PropertyName>$release/id</ogc:PropertyName>
          </ogc:PropertyIsEqualTo>
        </ogc:And>
      </ogc:Filter>
    </Constraint>
  </Query>
</GetRecords>

por ejemplo, utilizando curl después de guardar el XML anterior como release.xml e insertando el identificador de liberación obtenido en el paso 1:

curl -H 'Content-Type: appliation/xml' --data @release.xml 'http://www.epsg-registry.org/indicio/query'

3) Los datos del comunicado pueden descargarse siguiendo la url asociada al formato requerido.

Este proceso se ha integrado en el python-epsg código.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X