⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mappreviewaction.java

📁 电子地图服务器,搭建自己的地图服务
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org.  All rights reserved.
 * This code is licensed under the GPL 2.0 license, availible at the root
 * application directory.
 */
package org.vfny.geoserver.action;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.util.MessageResources;
import org.geoserver.ows.util.RequestUtils;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.NoSuchAuthorityCodeException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.TransformException;
import org.vfny.geoserver.global.CoverageInfo;
import org.vfny.geoserver.global.Data;
import org.vfny.geoserver.global.FeatureTypeInfo;
import org.vfny.geoserver.global.GeoServer;
import org.vfny.geoserver.global.WMS;
import org.vfny.geoserver.util.requests.CapabilitiesRequest;
import org.vfny.geoserver.wms.servlets.Capabilities;

import com.vividsolutions.jts.geom.Envelope;


/**
 * <b>MapPreviewAction</b><br> Sep 26, 2005<br>
 * <b>Purpose:</b><br>
 * Gathers up all the FeatureTypes in use and returns the informaion to the
 * .jsp .<br>
 * It will also generate requests to the WMS "openlayers" output format. <br>
 * This will communicate to a .jsp and return it three arrays of strings that contain:<br>
 * - The Featuretype's name<br>
 * - The DataStore name of the FeatureType<br>
 * - The bounding box of the FeatureType<br>
 * To change what data is output to the .jsp, you must change <b>struts-config.xml</b>.<br>
 * Look for the line:<br>
 * &lt;form-bean <br>
 * name="mapPreviewForm"<br>
 *
 * @author Brent Owens (The Open Planning Project)
 * @version
 */
public class MapPreviewAction extends GeoServerAction {
    // the layer is a coverage, or is made exclusively of coverages
    public static final Integer LAYER_IS_COVERAGE = new Integer(0);
    // the layer is a group with at least one coverage
    public static final Integer LAYER_HAS_COVERAGE = new Integer(1);
    // the layer or group is made of vectors only
    public static final Integer LAYER_IS_VECTOR = new Integer(2);
    
    
    /* (non-Javadoc)
     * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        ArrayList dsList = new ArrayList();
        ArrayList ftList = new ArrayList();
        ArrayList bboxList = new ArrayList();
        ArrayList srsList = new ArrayList();
        ArrayList ftnsList = new ArrayList();
        ArrayList widthList = new ArrayList();
        ArrayList heightList = new ArrayList();
        ArrayList coverageStatus = new ArrayList();

        // 1) get the capabilities info so we can find out our feature types
        WMS wms = getWMS(request);
        Capabilities caps = new Capabilities(wms);
        CapabilitiesRequest capRequest = new CapabilitiesRequest("WMS", caps);
        capRequest.setHttpServletRequest(request);

        Data catalog = wms.getData();
        List ftypes = new ArrayList(catalog.getFeatureTypeInfos().values());
        for (Iterator it = ftypes.iterator(); it.hasNext();) {
            FeatureTypeInfo ft = (FeatureTypeInfo) it.next();
            if(!ft.isEnabled())
                it.remove();
        }
        Collections.sort(ftypes, new FeatureTypeInfoNameComparator());

        List ctypes = new ArrayList(catalog.getCoverageInfos().values());
        for (Iterator it = ctypes.iterator(); it.hasNext();) {
            CoverageInfo ci = (CoverageInfo) it.next();
            if(!ci.isEnabled())
                it.remove();
        }
        Collections.sort(ctypes, new CoverageInfoNameComparator());

        List bmtypes = new ArrayList(wms.getBaseMapLayers().keySet());
        Collections.sort(bmtypes);

        // 2) delete any existing generated files in the generation directory
        ServletContext sc = request.getSession().getServletContext();

        //File rootDir =  GeoserverDataDirectory.getGeoserverDataDirectory(sc);
        //File previewDir = new File(sc.getRealPath("data/generated"));
        if (sc.getRealPath("preview") == null) {
            //There's a problem here, since we can't get a real path for the "preview" directory.
            //On tomcat this happens when "unpackWars=false" is set for this context.
            throw new RuntimeException(
                "Couldn't populate preview directory...is the war running in unpacked mode?");
        }

        File previewDir = new File(sc.getRealPath("preview"));

        //File previewDir = new File(rootDir, "data/generated");
        if (!previewDir.exists()) {
            previewDir.mkdirs();
        }

        // We need to create a 4326 CRS for comparison to layer's crs
        CoordinateReferenceSystem latLonCrs = null;

        try { // get the CRS object for lat/lon 4326
            latLonCrs = CRS.decode("EPSG:" + 4326);
        } catch (NoSuchAuthorityCodeException e) {
            String msg = "Error looking up SRS for EPSG: " + 4326 + ":" + e.getLocalizedMessage();
            LOGGER.warning(msg);
        } catch (FactoryException e) {
            String msg = "Error looking up SRS for EPSG: " + 4326 + ":" + e.getLocalizedMessage();
            LOGGER.warning(msg);
        }

        // 3) Go through each *FeatureType* and collect information && write out config files
        for (Iterator it = ftypes.iterator(); it.hasNext();) {
            FeatureTypeInfo layer = (FeatureTypeInfo) it.next();

            if (!layer.isEnabled() || layer.isGeometryless()) {
                continue; // if it isn't enabled, move to the next layer
            }

            CoordinateReferenceSystem layerCrs = layer.getDeclaredCRS();

            /* A quick and efficient way to grab the bounding box is to get it
             * from the featuretype info where the lat/lon bbox is loaded
             * from the DTO. We do this with layer.getLatLongBoundingBox().
             * We need to reproject the bounding box from lat/lon to the layer crs
             * for display
             */
            Envelope orig_bbox = layer.getLatLongBoundingBox();

            if ((orig_bbox.getWidth() == 0) || (orig_bbox.getHeight() == 0)) {
                orig_bbox.expandBy(0.1);
            }

            ReferencedEnvelope bbox = new ReferencedEnvelope(orig_bbox, latLonCrs);

            if (!CRS.equalsIgnoreMetadata(layerCrs, latLonCrs)) {
                try { // reproject the bbox to the layer crs
                    bbox = bbox.transform(layerCrs, true);
                } catch (TransformException e) {
                    e.printStackTrace();
                } catch (FactoryException e) {
                    e.printStackTrace();
                }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -