6 votos

¿Ampliar la extensión de la capa WMS en GeoServer por OpenLayers 3?

Me gustaría usar OpenLayers 3 (vi una pregunta similar para OpenLayers 2) para mostrar una capa de GeoServer usando WMS, y hacer zoom a la extensión de la capa automáticamente obteniendo la información de extensión de esta capa. Al igual que cuando la vista previa de la capa en GeoServer, muestra la capa dentro de la extensión de la capa y no importa lo que el CRS de la capa es.

He instalado Opengeo suite 4.5 y he creado un visor con la plantilla suite-sdk viewer. Depuro con suite-sdk debug -g http/to/geoserver path/to/app

El visor utiliza la biblioteca OpenLayers 3. He añadido la capa de OSM y mi capa de GeoServer con la fuente ol.source.TileWMS y mostrarlos con éxito.

Obtengo las capacidades de mi servicio local GeoServer WMS ( ejemplo de ol3 ). Con los resultados, marcando el nombre de cada capa, me gustaría hacer zoom a mi capa de destino.

//
// the codes add layers to ol.map and intial the ol.view
//

// TODO: zoom to layer
var featurePrefix = '***';
var featureType = '***';
var url = 'http://localhost:port/geoserver/wms?request=GetCapabilities&service=WMS&version=1.1.1';
var parser = new ol.format.WMSCapabilities();
$.ajax(url).then(function(response) {
   var result = parser.read(response);
   var Layers = result.Capability.Layer.Layer; 
   var extent;
   for (var i=0, len = Layers.length; i<len; i++) {
     var layerobj = Layers[i];
     if (layerobj.Name == featurePrefix + ':' + featureType) {
         extent = layerobj.BoundingBox[0].extent;
         break;
     }
     console.log(layerobj.Name);
   }

   // THIS DOES NOT WORK
   map.getView().fitExtent(extent, map.getSize());
});

Con el código anterior, puedo obtener el BBOX de la capa en su propio sistema de coordenadas que no sea ESPG::3857 . Pero el mapa no se acercó a esa capa. Creo que es un problema del sistema de coordinación.

¿Cómo puedo resolverlo, u otro enfoque para obtener la medida?

(He comprobado que el código actual no es agradable)

3voto

jakobengblom2 Puntos 2873

Sólo tiene que utilizar ol.proj.transformExtent en el medio para transformar su extensión. También puede utilizar layer.latlonBBOX de la GetCapabilities para que siempre sepa que el cuadro delimitador de origen está en EPSG:4326.

0 votos

Gracias. Supongo que al utilizar el transformExtent, es necesario proporcionar la información de la proyección si no es ESPG 4326. Así que prefiero usar layer.latlonBBOX. Sin embargo, el objeto de resultado analizado no parece contener esta información, pero sí lo he visto en el archivo XML. ¿Hay algo que se me escapa?

0 votos

¿Te importa? ¿Si puedes dar algún ejemplo de cómo lo implementaste? Esto es lo que necesito ahora.

0voto

stevenhz Puntos 35

Siguiendo las sugerencias del usuario23054, resolví el problema así:

En la página "Editar datos de capa y publicación" de la interfaz web de geoservidor, sección "Sistemas de referencia de coordenadas", establezca el SRS declarado como ESPG: 4326, el conjunto "Reproyectar nativo a declarado".

Así que el código siempre obtendrá la extensión como en ESPG 4326. A continuación, aplique ol.extent.applyTransform(extent, ol.proj.getTransform("EPSG:4326", "EPSG:3857"));

el ol.proj.transformExtent(extent, "EPSG:4326", "EPSG:3857") no me funciona. No sé lo que está mal aquí.

0 votos

Sigo prefiriendo usar layer.latlonBBOX sin los ajustes en el Geoservidor. El objeto de resultado analizado no parece contener esta información, pero sí lo he visto en el archivo XML. ¿Hay algo que se me escapa?

-1voto

KirkS Puntos 21

Usa esto:

map.getView().fit(extent, map.getSize());

en lugar de fitExtent . Utilice únicamente la función fit A mí me ha funcionado. Ya tengo todas mis capas en el 3857.

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