5 votos

Forzar una API de ArcGIS para JavaScript WMSLayer para utilizar EPSG: 900913 (en lugar de 102100)

Tengo un caso de uso en el que un servidor WMS externo puede servir mapas en la proyección Web Mercator utilizando el código EPSG 900913, pero no reconoce el código 102100 de ESRI.

Mi pregunta es: ¿Puedo obligar a que todas las solicitudes del SGA utilicen el código EPSG 900913?

Para ilustrarlo, tengo una simple página de mapas:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Test</title>

        <link rel="stylesheet" href="http://js.arcgis.com/3.8/js/esri/css/esri.css">

        <script src="http://js.arcgis.com/3.8/"></script>
        <script src="./test.js"></script>
    </head>
    <body>
        <div id="mapDiv"></div>
    </body>
</html>

Donde test.js crea un mapa simple y le añade un WMSLayer:

var wmsAddress = "http://some.server.com/wms";
var map, srs, extent;

require(["esri/map",
         "esri/layers/WMSLayer",
         "esri/layers/WMSLayerInfo",
         "esri/geometry/Extent",
         "esri/geometry/Point",
         "esri/SpatialReference",
         "dojo/domReady!"],
        function (Map, WMSLayer, WMSLayerInfo, Extent, Point, SpatialReference) {

    srs = new SpatialReference({wkid:900913});
    extent = new Extent(
            1362550.0288221193, 7616458.979152972,
            2281987.5791366613, 9525359.127428867,
            srs);
    map = new Map("mapDiv", {
        center: new Point(1800000, 7900000, srs),
        extent: extent
    });

    var wmsService = new WMSLayer(wmsAddress, {
        resourceInfo: {
            extent: extent,
            layerInfos: [new WMSLayerInfo({name:"layerName",title:"TestMap"})]
        },
        visibleLayers: ["layerName"]
    });
    map.addLayers([wmsService]);
});

Al cargar la aplicación, la petición que se envía al servidor WMS tiene el siguiente aspecto (visto en la consola de un navegador):

http//some.server.com/wms?SERVICE=WMS&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=TRUE&STYLES=&VERSION=1.3.0&LAYERS=layerName&WIDTH=1904&HEIGHT=400& CRS=EPSG:102100 &BBOX=-2743182.35289663,6945549.925862053,6343182.35289663,8854450.074137948

Lo que resulta en esta respuesta del servidor:

<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.3.0" xsi:schemaLocation="http://www.opengis.net/ogc http://some.server.com:80/geoserver/schemas/wms/1.3.0/exceptions_1_3_0.xsd">
    <ServiceException code="InvalidCRS">
        Error occurred decoding the espg code urn:x-ogc:def:crs:EPSG:102100 No code "EPSG:102100" from authority "European Petroleum Survey Group" found for object of type "IdentifiedObject".
    </ServiceException>
</ServiceExceptionReport>

0 votos

900913 no es un código en el registro EPSG. El código a utilizar es el 3857

0 votos

Si el servidor sólo anuncia EPSG:3857 (y no EPSG:900913 o ESRI:102100), el cliente no debe solicitarlos; hacerlo va en contra de la norma WMS

6voto

Ryan Ahearn Puntos 3829

No estoy seguro de que esta sea la forma correcta de hacerlo, pero hay una spatialreferences del atributo WMSLayer que contiene una lista de números que representan lo que hay que solicitar al servidor de respaldo.

Si inserta 900913 como primer elemento:

var wmsService = new WMSLayer(wmsAddress, {
    resourceInfo: {
        extent: extent,
        layerInfos: [new WMSLayerInfo({name:"layerName",title:"TestMap"})]
    },
    visibleLayers: ["layerName"]
});
wmsService.spatialReferences[0] = 900913;
map.addLayers([wmsService]);

Entonces la API de javascript utilizará 900913 cuando solicite el mapa. Para ver un ejemplo, consulte este jsfiddle .

El spatialReferences no aparece en la documentación pero tampoco está prefijado con un guión bajo, así que supongo que está bien manipularlo así.

0 votos

Los WMSLayers se devuelven como imágenes en la ref. espacial especificada, por lo que si se devuelve con una ref. espacial diferente a la que el mapa está utilizando, creo que el mapa se negará a dibujarlo.

1 votos

Es cierto, pero los WKID 900913, 102100 y 3857 son equivalentes. Algunos servicios de WMS se negarán a extraer si les das un WKID que no está entre los esperados.

0 votos

Ah, sabía que 102100 y 3857 eran considerados iguales por ArcGIS pero no sabía que 900913 también lo era. Esto bien podría funcionar entonces, estaría interesado en escuchar de nuevo.

2voto

Simon Puntos 346

Creo que sí. Lo hice en Silverlight. Era cuestión de crear una nueva clase que heredara de WMSLayer. Luego sobrescribí el método GetUrl() para sustituir la propiedad CRS por el valor que quería enviar. Creo que este principio debería ser adaptable a JavaScript pero no tengo un ejemplo de código.

Editar: Acabo de encontrar este ejemplo en la API de JavaScript. Muestra cómo heredar de una capa dinámica para lograr el propósito de sobrescribir el método getImageUrl(). Usted puede ver dónde establecer la ref. espacial.

https://developers.arcgis.com/javascript/jssamples/layers_custom_wms.html

0 votos

Es una bonita anécdota, pero no es una respuesta útil.

0 votos

Upvoted porque creo que esta respuesta también funcionaría como solución a mi problema, aunque requeriría mucho más trabajo. ¡Gracias por la sugerencia de todos modos!

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