Package org.geoserver.web.demo

Source Code of org.geoserver.web.demo.ReprojectPage$WKTPanel

/* (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.demo;

import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.basic.MultiLineLabel;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.web.GeoServerBasePage;
import org.geoserver.web.wicket.CRSPanel;
import org.geoserver.web.wicket.GeoServerAjaxFormLink;
import org.geoserver.web.wicket.GeometryTextArea;
import org.geoserver.web.wicket.SRSToCRSModel;
import org.geoserver.web.wicket.SimpleAjaxLink;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;

import com.vividsolutions.jts.geom.Geometry;

/**
* A simple reprojection console panel, shows details about a SRS1 -> SRS2 transformation
* and allows to reproject simple points or WKT geometries
* @author Andrea Aime - GeoSolutions
*/
@SuppressWarnings("serial")
public class ReprojectPage extends GeoServerBasePage {

    String sourceCRS;

    String targetCRS;

    GeometryTextArea sourceGeom;

    GeometryTextArea targetGeom;

    /** pop-up window for transformation details **/
    ModalWindow popupWindow;

    GeoServerAjaxFormLink wktLink;

    SimpleAjaxLink<Void> sourceDetails;

    SimpleAjaxLink<Void> targetDetails;

    public ReprojectPage(PageParameters params) {
        if(params != null) {
            // get the params, if any
            sourceCRS = params.getString("fromSRS");
            targetCRS = params.getString("toSRS");
        }
       
        // the popup for transformation details
        popupWindow = new ModalWindow("popup");
        add(popupWindow);

        // the main form
        Form form = new Form("form");
        add(form);

        // the source CRS
        CRSPanel sourcePanel = new CRSPanel("sourceCRS", new SRSToCRSModel(new PropertyModel(this,
                "sourceCRS"))) {
            protected void onSRSUpdated(String srs, AjaxRequestTarget target) {
                sourceCRS = srs;
                updateTransformation(target);
            };
        };
        sourcePanel.setRequired(true);
        form.add(sourcePanel);
       
        // the target CRS
        CRSPanel targetPanel = new CRSPanel("targetCRS", new SRSToCRSModel(new PropertyModel(this,
                "targetCRS"))) {
            protected void onSRSUpdated(String srs, AjaxRequestTarget target) {
                targetCRS = srs;
                updateTransformation(target);

            };
        };
        targetPanel.setRequired(true);
        form.add(targetPanel);
       
        // The link showing
        wktLink = new GeoServerAjaxFormLink("wkt", form) {
            @Override
            public void onClick(AjaxRequestTarget target, Form form) {
                popupWindow.setInitialHeight(525);
                popupWindow.setInitialWidth(525);
                popupWindow.setContent(new WKTPanel(popupWindow.getContentId()));
                popupWindow.setTitle(sourceCRS + " -> " + targetCRS);
                popupWindow.show(target);
            }
        };
        wktLink.setEnabled(false);
        form.add(wktLink);

        sourceGeom = new GeometryTextArea("sourceGeom");
        form.add(sourceGeom);
        sourceGeom.setOutputMarkupId(true);
        targetGeom = new GeometryTextArea("targetGeom");
        targetGeom.setOutputMarkupId(true);
        form.add(targetGeom);

        AjaxSubmitLink forward = new AjaxSubmitLink("forward", form) {

            @Override
            protected void onSubmit(AjaxRequestTarget at, Form<?> form) {
                Geometry source = sourceGeom.getModelObject();
                if (source == null) {
                    error(getLocalizer().getString("ReprojectPage.sourcePointNotSpecifiedError",
                            ReprojectPage.this, "Source Geometry is not specified"));
                } else {
                    MathTransform mt = getTransform();
                    if (mt != null) {
                        try {
                            Geometry target = JTS.transform(source, mt);
                            targetGeom.setModelObject(target);
                            at.addComponent(targetGeom);
                        } catch (Exception e) {
                            error(e.getMessage());
                        }
                    }
                }
                at.addComponent(feedbackPanel);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                target.addComponent(feedbackPanel);
            }
        };
        form.add(forward);

        AjaxSubmitLink backward = new AjaxSubmitLink("backward", form) {

            @Override
            protected void onSubmit(AjaxRequestTarget at, Form<?> form) {
                Geometry target = targetGeom.getModelObject();
                if (target == null) {
                    error(getLocalizer().getString("ReprojectPage.targetPointNotSpecifiedError",
                            ReprojectPage.this, "Target Geometry is not specified"));
                } else {
                    MathTransform mt = getTransform();
                    if (mt != null) {
                        try {
                            Geometry source = JTS.transform(target, mt.inverse());
                            sourceGeom.setModelObject(source);
                            at.addComponent(sourceGeom);
                        } catch (Exception e) {
                            error(e.getMessage());
                        }
                    }
                }
                at.addComponent(feedbackPanel);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                target.addComponent(feedbackPanel);
            }
        };
        form.add(backward);

    }

    protected void updateTransformation(AjaxRequestTarget ajaxTarget) {
        if (sourceCRS != null && targetCRS != null) {
            MathTransform mt = getTransform();
            if (mt != null) {
                wktLink.setEnabled(true);
                ajaxTarget.addComponent(wktLink);
            }
        }

    }

    protected MathTransform getTransform() {
        try {
            CoordinateReferenceSystem source = CRS.decode(sourceCRS);
            CoordinateReferenceSystem target = CRS.decode(targetCRS);
            return CRS.findMathTransform(source, target, true);
        } catch (Exception e) {
            error(e.getMessage());
            return null;
        }
    }

    /*
     * Panel for displaying the well known text for the transformation.
     */
    class WKTPanel extends Panel {

        public WKTPanel(String id) {
            super(id);

            MultiLineLabel wktLabel = new MultiLineLabel("wkt");

            add(wktLabel);

            MathTransform mt = getTransform();
            if (mt != null) {
                wktLabel.setDefaultModel(new Model<String>(mt.toString()));
            }
        }
    }
}
TOP

Related Classes of org.geoserver.web.demo.ReprojectPage$WKTPanel

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.