Package org.geoserver.web.istyle

Source Code of org.geoserver.web.istyle.OpenLayersMapPanel

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.istyle;

import java.io.StringWriter;
import java.util.Random;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.IHeaderContributor;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.panel.Panel;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.StyleInfo;
import org.geotools.geometry.jts.ReferencedEnvelope;

import freemarker.template.Configuration;
import freemarker.template.SimpleHash;
import freemarker.template.Template;

public class OpenLayersMapPanel extends Panel implements IHeaderContributor {

    /**
     * freemarker template configuration
     */
    final static Configuration config;
    static {
        config = new Configuration();
        config.setClassForTemplateLoading(OpenLayersMapPanel.class, "");
    }
   
    final Random rand = new Random();
   
    LayerInfo layer;
    StyleInfo style;
   
    public OpenLayersMapPanel(String id, LayerInfo layer) {
        super(id);
        setOutputMarkupId(true);
        this.layer = layer;
        this.style = layer.getDefaultStyle();
    }
   
    public LayerInfo getCurrentLayer() {
        return layer;
    }
   
    public StyleInfo getCurrentStyle() {
        return style;
    }
   
    public void renderHead(IHeaderResponse response) {
        try {
            //render css
            SimpleHash model = new SimpleHash();
            model.put("markupId", getMarkupId());
            response.renderString( renderTemplate("OL-css.ftl", model) );
           
            //TODO: point back to GeoServer
            response.renderJavascriptReference("http://openlayers.org/api/OpenLayers.js")
           
            model.put("layers", layer.getName());
            model.put("styles", style.getName());
           
            bbox(layer, model);
           
            //render
            model.put("ran", rand.nextInt());
            response.renderOnLoadJavascript(renderTemplate("OL-onload.ftl", model));
        }
        catch( Exception e ) {
            throw new RuntimeException(e);
        }
    }
   
    public void update(LayerInfo layer, StyleInfo style, AjaxRequestTarget target) {
        layer = layer != null ? layer : this.layer;
       
        if (style == null) {
            if (!layer.equals(this.layer))  {
                //no style specified, and the layer was changed
                style = layer.getDefaultStyle();
            }
            else {
                //no style specified and layer did not change, do not change style
            }
        }
       
        try {
            SimpleHash model = new SimpleHash();
            model.put("markupId", getMarkupId());
            model.put("layers", layer.getName());
            model.put("styles", style.getName());
            bbox(layer, model);
            model.put("ran", rand.nextInt());
            model.put("layerChanged", !layer.equals(this.layer));
           
            target.appendJavascript(renderTemplate("OL-update.ftl", model));
           
            this.layer = layer;
            this.style = style;
        }
        catch( Exception e ) {
            throw new RuntimeException(e);
        }
    }
   
    void bbox(LayerInfo layer, SimpleHash model) throws Exception {
        ReferencedEnvelope bbox = layer.getResource().boundingBox();
        String srs = layer.getResource().getSRS();
        if ( bbox == null ) {
            bbox = layer.getResource().getLatLonBoundingBox();
            srs = "EPSG:4326";
        }
        if ( bbox == null ) {
            bbox = new ReferencedEnvelope(-180,-90,180,90, null);
            srs = "EPSG:4326";
        }
       
        model.put("minX", bbox.getMinX());
        model.put("minY", bbox.getMinY());
        model.put("maxX", bbox.getMaxX());
        model.put("maxY", bbox.getMaxY());
        model.put("srs", srs);
        model.put("res", Math.max(bbox.getHeight(),bbox.getWidth())/256d);
    }
    String renderTemplate(String t, Object model) throws Exception {
        Template template = config.getTemplate(t);
        StringWriter writer = new StringWriter();
        template.process(model, writer);
        return writer.toString();
    }
   
}
TOP

Related Classes of org.geoserver.web.istyle.OpenLayersMapPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.