org.geoserver.web.demo.ReprojectPage.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.web.demo.ReprojectPage.java

Source

/* (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()));
            }
        }
    }
}