Пример #1
0
  /**
   * Returns the superoverlay mode (either specified in the request, or the default one)
   *
   * @return
   */
  public static String getSuperoverlayMode(GetMapRequest request, WMS wms) {
    String overlayMode = (String) request.getFormatOptions().get("superoverlay_mode");
    if (overlayMode != null) {
      return overlayMode;
    }

    overlayMode = (String) request.getFormatOptions().get("overlayMode");
    if (overlayMode != null) {
      return overlayMode;
    } else {
      return wms.getKmlSuperoverlayMode();
    }
  }
Пример #2
0
 /**
  * Returns the the kmscore value (either specified in the request, or the default one)
  *
  * @param mapContent
  * @return
  */
 public static int getKmScore(GetMapRequest request, WMS wms) {
   Object kmscore = request.getFormatOptions().get("kmscore");
   if (kmscore != null) {
     return Converters.convert(kmscore, Integer.class);
   } else {
     return wms.getKmScore();
   }
 }
Пример #3
0
 /**
  * Returns the the kmplacemark value (either specified in the request, or the default one)
  *
  * @param mapContent
  * @return
  */
 public static boolean getKmplacemark(GetMapRequest request, WMS wms) {
   Object kmplacemark = request.getFormatOptions().get("kmplacemark");
   if (kmplacemark != null) {
     return Converters.convert(kmplacemark, Boolean.class);
   } else {
     return wms.getKmlPlacemark();
   }
 }
Пример #4
0
 /**
  * Returns the the kmattr value (either specified in the request, or the default one)
  *
  * @param mapContent
  * @return
  */
 public static boolean getKMAttr(GetMapRequest request, WMS wms) {
   Object kmattr = request.getFormatOptions().get("kmattr");
   if (kmattr != null) {
     return Converters.convert(kmattr, Boolean.class);
   } else {
     return wms.getKmlKmAttr();
   }
 }
Пример #5
0
  /**
   * Returns true if the request is GWC compatible
   *
   * @param mapContent
   * @return
   */
  public static boolean isRequestGWCCompatible(GetMapRequest request, int layerIndex, WMS wms) {
    // check the kml params are the same as the defaults (GWC uses always the defaults)
    boolean requestKmAttr = KMLUtils.getKMAttr(request, wms);
    if (requestKmAttr != wms.getKmlKmAttr()) {
      return false;
    }

    boolean requestKmplacemark = KMLUtils.getKmplacemark(request, wms);
    if (requestKmplacemark != wms.getKmlPlacemark()) {
      return false;
    }

    int requestKmscore = KMLUtils.getKmScore(request, wms);
    if (requestKmscore != wms.getKmScore()) {
      return false;
    }

    // check the layer is local
    if (request.getLayers().get(layerIndex).getType() == MapLayerInfo.TYPE_REMOTE_VECTOR) {
      return false;
    }

    // check the layer is using the default style
    Style requestedStyle = request.getStyles().get(layerIndex);
    Style defaultStyle = request.getLayers().get(layerIndex).getDefaultStyle();
    if (!defaultStyle.equals(requestedStyle)) {
      return false;
    }

    // check there is no extra filtering applied to the layer
    List<Filter> filters = request.getFilter();
    if (filters != null && filters.size() > 0 && filters.get(layerIndex) != Filter.INCLUDE) {
      return false;
    }

    // no fiddling with antialiasing settings
    String antialias = (String) request.getFormatOptions().get("antialias");
    if (antialias != null && !"FULL".equalsIgnoreCase(antialias)) {
      return false;
    }

    // no custom palette
    if (request.getPalette() != null) {
      return false;
    }

    // no custom start index
    if (request.getStartIndex() != null && request.getStartIndex() != 0) {
      return false;
    }

    // no custom max features
    if (request.getMaxFeatures() != null) {
      return false;
    }

    // no sql view params
    if (request.getViewParams() != null && request.getViewParams().size() > 0) {
      return false;
    }

    // ok, it seems everything is the same as GWC cached it
    return true;
  }
Пример #6
0
  GridSubset findBestGridSubset(WMSMapContent map) {
    GetMapRequest req = map.getRequest();
    Map formatOpts = req.getFormatOptions();

    GridSetBroker gridSetBroker = gwc.getGridSetBroker();
    GridSet gridSet = null;

    // first check format options to see if explicitly specified
    if (formatOpts.containsKey("gridset")) {
      gridSet = gridSetBroker.get(formatOpts.get("gridset").toString());
    }

    // next check srs
    if (gridSet == null) {
      gridSet = gridSetBroker.get(req.getSRS().toUpperCase());
    }

    if (gridSet != null) {
      return GridSubsetFactory.createGridSubSet(gridSet);
    }

    CoordinateReferenceSystem crs = map.getCoordinateReferenceSystem();

    // look up epsg code
    Integer epsgCode = null;
    try {
      epsgCode = CRS.lookupEpsgCode(crs, false);
    } catch (Exception e) {
      throw new ServiceException("Unable to determine epsg code for " + crs, e);
    }
    if (epsgCode == null) {
      throw new ServiceException("Unable to determine epsg code for " + crs);
    }

    SRS srs = SRS.getSRS(epsgCode);

    // figure out the appropriate grid sub set
    Set<GridSubset> gridSubsets = new LinkedHashSet<GridSubset>();
    for (MapLayerInfo l : req.getLayers()) {
      TileLayer tl = gwc.getTileLayerByName(l.getName());
      if (tl == null) {
        throw new ServiceException("No tile layer for " + l.getName());
      }

      List<GridSubset> theseGridSubsets = tl.getGridSubsetsForSRS(srs);
      if (gridSubsets.isEmpty()) {
        gridSubsets.addAll(theseGridSubsets);
      } else {
        gridSubsets.retainAll(theseGridSubsets);
      }

      if (gridSubsets.isEmpty()) {
        throw new ServiceException(
            "No suitable " + epsgCode + " grid subset for " + req.getLayers());
      }
    }

    if (gridSubsets.size() > 1) {
      if (LOGGER.isLoggable(Level.WARNING)) {
        StringBuilder msg = new StringBuilder("Found multiple grid subsets: ");
        for (GridSubset gs : gridSubsets) {
          msg.append(gs.getName()).append(", ");
        }
        msg.setLength(msg.length() - 2);
        msg.append(". Choosing first.");
        LOGGER.warning(msg.toString());
      }
    }

    return gridSubsets.iterator().next();
  }
Пример #7
0
  @Override
  public WebMap produceMap(WMSMapContent map) throws ServiceException, IOException {
    GeoPackage geopkg = new GeoPackage();
    geopkg.init();

    GetMapRequest req = map.getRequest();

    List<Layer> layers = map.layers();
    List<MapLayerInfo> mapLayers = req.getLayers();

    Preconditions.checkState(
        layers.size() == mapLayers.size(),
        "Number of map layers not same as number of rendered layers");

    // list of layers to render directly and include as tiles
    List<MapLayerInfo> tileLayers = new ArrayList();

    // check mode, one of:
    // vector - render vector layers as feature entries and all else as tiles (default)
    // hybrid - render vector layers as feature entries, raster layers as raster entries, all
    //          others as tile entries
    // tiled - all layers as a single tile set
    Map formatOpts = req.getFormatOptions();
    Mode mode =
        formatOpts.containsKey("mode")
            ? Mode.valueOf(((String) formatOpts.get("mode")).toUpperCase())
            : Mode.VECTOR;

    if (mode == Mode.TILED) {
      // tiled mode means render all as map tile layer
      tileLayers.addAll(mapLayers);
    } else {

      // hybrid mode, dump as raw vector or raster unless the request specifically asks for a
      // layer to be rendered as tiles
      for (int i = 0; i < layers.size(); i++) {
        Layer layer = layers.get(i);
        MapLayerInfo mapLayer = mapLayers.get(i);

        if (layer instanceof FeatureLayer) {
          addFeatureLayer(geopkg, (FeatureLayer) layer, mapLayer, map);
        } else if (layer instanceof GridCoverageLayer) {
          if (mode == Mode.HYBRID) {
            addCoverageLayer(geopkg, (GridCoverageLayer) layer, mapLayer, map);
          } else {
            tileLayers.add(mapLayer);
          }
        } else {
          tileLayers.add(mapLayer);
        }
      }
    }

    addTileLayers(geopkg, tileLayers, map);

    geopkg.close();

    final File dbFile = geopkg.getFile();
    final BufferedInputStream bin = new BufferedInputStream(new FileInputStream(dbFile));

    RawMap result =
        new RawMap(map, bin, MIME_TYPE) {
          @Override
          public void writeTo(OutputStream out) throws IOException {
            String dbFilename = getAttachmentFileName();
            if (dbFilename != null) {
              dbFilename = dbFilename.substring(0, dbFilename.length() - 4) + ".gpkg";
            } else {
              // this shouldn't really ever happen, but fallback anyways
              dbFilename = "geoserver.gpkg";
            }

            IOUtils.copy(bin, out);
            out.flush();

            //               JD: disabling zip compression for now
            //                ZipOutputStream zout = new ZipOutputStream(out);
            //                zout.putNextEntry(new ZipEntry(dbFilename));
            //
            //                super.writeTo(zout);
            //                zout.closeEntry();
            //                zout.close();

            bin.close();
            try {
              dbFile.delete();
            } catch (Exception e) {
              LOGGER.log(Level.WARNING, "Error deleting file: " + dbFile.getAbsolutePath(), e);
            }
          }
        };

    result.setContentDispositionHeader(map, ".gpkg", true);
    return result;
  }