コード例 #1
0
  /**
   * Parses AGGREGATE results for Oskari front
   *
   * @param response WPS vec:aggregate execute results
   * @param analysisLayer analysis layer params (field/columns info)
   * @return JSON.toSting() eg. aggregate WPS results
   *     **********************************************************************
   */
  public String parseAggregateResults(String response, AnalysisLayer analysisLayer) {

    try {

      // convert xml/text String to JSON

      final JSONObject json = XML.toJSONObject(response); // all
      // Add field name
      final AggregateMethodParams aggreParams =
          (AggregateMethodParams) analysisLayer.getAnalysisMethodParams();
      String fieldName = aggreParams.getAggreField1();
      if (analysisLayer.getInputAnalysisId() != null) {
        fieldName =
            analysisDataService.SwitchField2OriginalField(
                fieldName, analysisLayer.getInputAnalysisId());
      }
      json.put("fieldName", fieldName);
      return json.toString();

    } catch (JSONException e) {
      log.error(e, "XML to JSON failed", response);
    }

    return "{}";
  }
コード例 #2
0
  /**
   * Reform the featureset after WPS response for WFS-T (fix prefixes, propertynames, etc)
   *
   * @param featureSet
   * @param analysisLayer
   * @return
   */
  public String harmonizeElementNames(String featureSet, final AnalysisLayer analysisLayer) {

    try {

      final AnalysisMethodParams params = analysisLayer.getAnalysisMethodParams();
      String[] enames = params.getTypeName().split(":");
      String ename = enames[0];
      if (enames.length > 1) ename = enames[1];
      String extraFrom = "gml:" + ename + "_";

      // Mixed perfixes to feature: prefix etc
      featureSet = featureSet.replace(extraFrom, ANALYSIS_WFST_PREFIX);

      extraFrom = ANALYSIS_GML_PREFIX + ename;
      String extraTo = ANALYSIS_WFST_PREFIX + ename;
      featureSet = featureSet.replace(extraFrom, extraTo);
      String[] geoms = params.getGeom().split(":");
      String geom = geoms[0];
      if (geoms.length > 1) geom = geoms[1];
      extraFrom = ANALYSIS_GML_PREFIX + geom + ">";
      featureSet = featureSet.replace(extraFrom, ANALYSIS_WFST_GEOMETRY);
      featureSet = featureSet.replace(ANALYSIS_WPS_UNION_GEOM, ANALYSIS_WFST_GEOMETRY);
      featureSet =
          featureSet.replace(
              ANALYSIS_GML_PREFIX + ANALYSIS_WPS_ELEMENT_LOCALNAME,
              ANALYSIS_WFST_PREFIX + ANALYSIS_WPS_ELEMENT_LOCALNAME);
      featureSet = featureSet.replace(" NaN", "");
      featureSet = featureSet.replace("srsDimension=\"3\"", "srsDimension=\"2\"");

    } catch (Exception e) {
      log.debug("Harmonizing element names failed: ", e);
    }
    return featureSet;
  }
コード例 #3
0
  /**
   * Get GeoServer WPS execute responses
   *
   * @param analysisLayer analysis method parameters
   * @return one or more Wps execute responses
   * @throws ServiceException
   */
  private String requestFeatureSets(AnalysisLayer analysisLayer) throws ServiceException {

    String featureSet = null;
    Boolean doRequest = true;
    if (analysisLayer.getMethod().equals(AnalysisParser.AGGREGATE)) {
      StringBuilder sb = new StringBuilder();
      // Loop aggregate attribute fields
      // Temp save  aggregate function setup
      List<String> aggre_funcs =
          ((AggregateMethodParams) analysisLayer.getAnalysisMethodParams()).getAggreFunctions();
      List<String> aggre_text_funcs = new ArrayList<String>();
      aggre_text_funcs.add("Count");
      for (String field : analysisLayer.getFields()) {
        ((AggregateMethodParams) analysisLayer.getAnalysisMethodParams()).setAggreField1(field);
        if (analysisLayer.getFieldtypeMap().containsKey(field)) {
          if (analysisLayer.getFieldtypeMap().get(field).equals("numeric")) {
            ((AggregateMethodParams) analysisLayer.getAnalysisMethodParams())
                .setAggreFunctions(aggre_funcs);
            if (aggre_funcs.size() == 0) doRequest = false;
          } else {
            ((AggregateMethodParams) analysisLayer.getAnalysisMethodParams())
                .setAggreFunctions(aggre_text_funcs);
            doRequest = true;
          }
        }
        sb.append("<fieldResult>");
        sb.append("<field>" + field + "</field>");
        if (doRequest) sb.append(wpsService.requestFeatureSet(analysisLayer));
        if (analysisLayer.isNodataCount()) {
          // Special aggregate process for NoDataCount - use count method with specific filter
          ((AggregateMethodParams) analysisLayer.getAnalysisMethodParams())
              .setAggreFunctions(aggre_text_funcs);
          ((AggregateMethodParams) analysisLayer.getAnalysisMethodParams()).setDoNoDataCount(true);
          sb.append("<fieldNoDataCount>");
          String nodataresponse = wpsService.requestFeatureSet(analysisLayer);
          // Wps wps input features fails, if no nodata feature fields (exception) --> skip
          // Could be another wps exception as well
          if (nodataresponse.indexOf("ows:Exception") == -1) sb.append(nodataresponse);
          sb.append("</fieldNoDataCount>");
          ((AggregateMethodParams) analysisLayer.getAnalysisMethodParams()).setDoNoDataCount(false);
        }
        sb.append("</fieldResult>");
      }

      featureSet = sb.toString();
    } else if (analysisLayer.getMethod().equals(AnalysisParser.DIFFERENCE)) {
      // Get feature set via WFS 2.0 GetFeature
      // WFS join select is not available in wfs 1.1.0
      featureSet = wpsService.requestWFS2FeatureSet(analysisLayer);

    } else {
      featureSet = wpsService.requestFeatureSet(analysisLayer);
    }
    return featureSet;
  }
コード例 #4
0
  /**
   * Fix the geometry property name for WFST transform Geometry property name in WPS method result
   * is not the same as in input featurecollections
   *
   * @param analysisLayer
   */
  private void fixGeometryPropertyName(AnalysisLayer analysisLayer) {

    try {

      AnalysisMethodParams params = analysisLayer.getAnalysisMethodParams();
      if (params.getMethod().equals(AnalysisParser.SPATIAL_JOIN_STATISTICS)) {
        params.setGeom("z_" + ((SpatialJoinStatisticsMethodParams) params).getGeom2());
      }

    } catch (Exception e) {
      log.warn("WPS geometry property name fix failed ", e);
    }
  }
コード例 #5
0
  /**
   * Parses method parameters to WPS execute xml syntax definition
   *
   * @param layerJSON method parameters and layer info from the front
   * @param baseUrl Url for Geoserver WPS reference input (input FeatureCollection)
   * @return AnalysisLayer parameters for WPS execution
   *     **********************************************************************
   */
  public AnalysisLayer parseAnalysisLayer(String layerJSON, String filter, String baseUrl)
      throws ServiceException {
    AnalysisLayer analysisLayer = new AnalysisLayer();

    JSONObject json = JSONHelper.createJSONObject(layerJSON);
    WFSLayerConfiguration lc = null;

    // analysis input data type - default is WFS layer
    analysisLayer.setInputType(ANALYSIS_INPUT_TYPE_WFS);
    // analysis rendering url
    analysisLayer.setWpsUrl(analysisRenderingUrl);
    // analysis element name
    analysisLayer.setWpsName(analysisRenderingElement);

    analysisLayer.setInputAnalysisId(null);
    int id = 0;
    try {
      // Analysis input property types
      this.prepareFieldtypeMap(analysisLayer, json);

      String sid = json.getString(JSON_KEY_LAYERID);

      // Input is wfs layer or analaysis layer or my places
      if (sid.indexOf(LAYER_PREFIX) == 0) {
        // Analysislayer is input
        if (!this.prepareAnalysis4Analysis(analysisLayer, json))
          throw new ServiceException("AnalysisInAnalysis parameters are invalid");
        id = analysisLayer.getId();
      } else if (sid.indexOf(MYPLACES_LAYER_PREFIX) == 0) {
        // myplaces is input
        if (!this.prepareAnalysis4Myplaces(analysisLayer, json))
          throw new ServiceException("AnalysisInMyPlaces parameters are invalid");
        id = analysisLayer.getId();
      } else {
        // Wfs layer id
        id = ConversionHelper.getInt(sid, -1);
      }
    } catch (JSONException e) {
      throw new ServiceException("AnalysisInAnalysis parameters are invalid");
    }
    // --- WFS layer is analysis input
    analysisLayer.setId(id);

    // Get wfs layer configuration
    lc = layerConfigurationService.findConfiguration(id);

    final OskariLayer wfsLayer = mapLayerService.find(id);
    log.debug("got wfs layer", wfsLayer);
    analysisLayer.setMinScale(wfsLayer.getMinScale());
    analysisLayer.setMaxScale(wfsLayer.getMaxScale());

    // Set WFS input type, other than analysis_ and myplaces_- default is REFERENCE
    this.setWpsInputLayerType(lc.getWps_params(), analysisLayer);

    // Extract parameters for analysis methods from layer

    String name = json.optString("name");
    if (name.isEmpty()) {
      throw new ServiceException("Analysis name missing.");
    } else {
      analysisLayer.setName(name);
    }

    JSONArray fields_in = json.optJSONArray("fields");
    List<String> fields = new ArrayList<String>();

    if (fields_in == null) {
      throw new ServiceException("Fields missing.");
    } else {
      // Add fields of WFS service, if empty and all fields mode on
      if (fields_in.length() == 0) fields_in = this.getWfsFields(analysisLayer);
      // Remove internal fields
      try {
        for (int i = 0; i < fields_in.length(); i++) {
          if (!HIDDEN_FIELDS.contains(fields_in.getString(i))) fields.add(fields_in.getString(i));
        }
      } catch (JSONException e) {
        throw new ServiceException("Method fields parameters missing.");
      }
      analysisLayer.setFields(fields);
    }

    String style = json.optString("style");
    if (style.isEmpty()) {
      throw new ServiceException("Style missing.");
    } else {
      analysisLayer.setStyle(style);
    }

    Integer opacity = json.optInt("opacity");
    if (opacity == 0) opacity = DEFAULT_OPACITY;
    analysisLayer.setOpacity(opacity);

    String analysisMethod = json.optString("method"); // "union_geom"; test
    analysisLayer.setMethod(analysisMethod);

    analysisLayer.setAggreFunctions(null);
    analysisLayer.setMergeAnalysisLayers(null);

    // ------------------LAYER_UNION -----------------------
    if (LAYER_UNION.equals(analysisMethod)) {
      JSONObject params;
      try {
        params = json.getJSONObject(JSON_KEY_METHODPARAMS);
      } catch (JSONException e) {
        throw new ServiceException("Method parameters missing.");
      }
      JSONArray sids = params.optJSONArray(JSON_KEY_LAYERS);
      // Loop merge layers - get analysis ids
      List<Long> ids = new ArrayList<Long>();
      List<String> mergelays = new ArrayList<String>();
      if (sids == null) {
        throw new ServiceException("merge layers missing");
      } else {
        try {
          for (int i = 0; i < sids.length(); i++) {
            Long aid = this.getAnalysisId(sids.getString(i));
            if (aid > 0) {
              ids.add(aid);
              mergelays.add(sids.getString(i));
            }
          }
        } catch (JSONException e) {
          throw new ServiceException("Merge layers missing.");
        }
        // Merge analysis Ids
        analysisLayer.setMergeAnalysisIds(ids);
        // Merge analysis Layers
        analysisLayer.setMergeAnalysisLayers(mergelays);
      }
    }
    // ------------------ BUFFER -----------------------
    else if (BUFFER.equals(analysisMethod)) {
      // when analysisMethod == vec:BufferFeatureCollection

      // Set params for WPS execute

      BufferMethodParams method = this.parseBufferParams(lc, json, baseUrl);

      method.setWps_reference_type(analysisLayer.getInputType());
      analysisLayer.setAnalysisMethodParams(method);

      // WFS filter
      analysisLayer
          .getAnalysisMethodParams()
          .setFilter(
              this.parseFilter(
                  lc,
                  filter,
                  analysisLayer.getInputAnalysisId(),
                  analysisLayer.getInputCategoryId()));
      // WFS Query properties
      analysisLayer
          .getAnalysisMethodParams()
          .setProperties(
              this.parseProperties(
                  analysisLayer.getFields(),
                  lc.getFeatureNamespace(),
                  lc.getGMLGeometryProperty()));
      // ------------------ INTERSECT -----------------------
    } else if (INTERSECT.equals(analysisMethod)) {
      JSONObject params;
      try {
        params = json.getJSONObject(JSON_KEY_METHODPARAMS);
      } catch (JSONException e) {
        throw new ServiceException("Method parameters missing.");
      }
      WFSLayerConfiguration lc2 = null;
      int id2 = 0;
      String sid = "";
      try {
        sid = params.getString(JSON_KEY_LAYERID);
        // Input is wfs layer or analaysis layer
        if (sid.indexOf(LAYER_PREFIX) == 0) {
          // Analysislayer is input
          // eg. analyse_216_340
          id2 = ConversionHelper.getInt(analysisBaseLayerId, 0);

        } else if (sid.indexOf(MYPLACES_LAYER_PREFIX) == 0) {
          // Myplaces is input
          id2 = ConversionHelper.getInt(myplacesBaseLayerId, 0);

        } else {
          // Wfs layer id
          id2 = ConversionHelper.getInt(sid, -1);
        }
      } catch (JSONException e) {
        throw new ServiceException("AnalysisInAnalysis parameters are invalid");
      }

      // Get wfs layer configuration for union input 2
      lc2 = layerConfigurationService.findConfiguration(id2);

      // Set params for WPS execute

      IntersectMethodParams method = this.parseIntersectParams(lc, lc2, json, baseUrl);

      method.setWps_reference_type(analysisLayer.getInputType());
      if (sid.indexOf(LAYER_PREFIX) == 0 || sid.indexOf(MYPLACES_LAYER_PREFIX) == 0) {
        method.setWps_reference_type2(ANALYSIS_INPUT_TYPE_GS_VECTOR);
      } else {
        method.setWps_reference_type2(ANALYSIS_INPUT_TYPE_WFS);
      }
      // Set WFS input type, other than analysis_ and myplaces_- default is REFERENCE
      this.setWpsInputLayerType(lc.getWps_params(), analysisLayer);

      // WFS filter

      method.setFilter(
          this.parseFilter(
              lc, filter, analysisLayer.getInputAnalysisId(), analysisLayer.getInputCategoryId()));

      if (sid.indexOf(MYPLACES_LAYER_PREFIX) == 0) {
        method.setFilter2(this.parseFilter(lc2, null, null, this.getAnalysisInputId(params)));
      } else {
        method.setFilter2(this.parseFilter(lc2, null, this.getAnalysisInputId(params), null));
      }
      // WFS Query properties
      method.setProperties(
          this.parseProperties(
              analysisLayer.getFields(), lc.getFeatureNamespace(), lc.getGMLGeometryProperty()));

      analysisLayer.setAnalysisMethodParams(method);
      // ------------------ AGGREGATE -----------------------
    } else if (AGGREGATE.equals(analysisMethod)) {

      // 1 to n aggregate wps tasks
      String aggre_field = null;
      try {

        aggre_field = json.getJSONObject(JSON_KEY_METHODPARAMS).optString(JSON_KEY_AGGRE_ATTRIBUTE);
        if (analysisLayer.getInputType().equals(ANALYSIS_INPUT_TYPE_GS_VECTOR)) {
          if (analysisLayer.getInputAnalysisId() != null) {
            aggre_field =
                analysisDataService.SwitchField2AnalysisField(
                    aggre_field, analysisLayer.getInputAnalysisId());
          }
        }
        JSONArray aggre_func_in =
            json.getJSONObject(JSON_KEY_METHODPARAMS).optJSONArray(JSON_KEY_FUNCTIONS);
        List<String> aggre_funcs = new ArrayList<String>();
        if (aggre_func_in == null) {
          throw new ServiceException("Aggregate functions missing.");
        } else {
          try {
            for (int i = 0; i < aggre_func_in.length(); i++) {
              aggre_funcs.add(aggre_func_in.getString(i));
            }
          } catch (JSONException e) {
            throw new ServiceException("Aggregate functions missing.");
          }
          analysisLayer.setAggreFunctions(aggre_funcs);
        }

      } catch (JSONException e) {
        throw new ServiceException("Method parameters missing.");
      }

      // Set params for WPS execute
      if (aggre_field == null) throw new ServiceException("Aggregate field parameter missing.");
      AggregateMethodParams method =
          this.parseAggregateParams(
              lc, json, baseUrl, aggre_field, analysisLayer.getAggreFunctions());

      method.setWps_reference_type(analysisLayer.getInputType());
      analysisLayer.setAnalysisMethodParams(method);
      // WFS filter

      analysisLayer
          .getAnalysisMethodParams()
          .setFilter(
              this.parseFilter(
                  lc,
                  filter,
                  analysisLayer.getInputAnalysisId(),
                  analysisLayer.getInputCategoryId()));
      // ------------------ UNION -----------------------
    } else if (UNION.equals(analysisMethod)) {
      JSONObject params;
      try {
        params = json.getJSONObject(JSON_KEY_METHODPARAMS);
      } catch (JSONException e) {
        throw new ServiceException("Method parameters missing.");
      }

      // Set params for WPS execute

      UnionMethodParams method = this.parseUnionParams(lc, json, baseUrl);
      method.setWps_reference_type(analysisLayer.getInputType());

      // WFS filter

      method.setFilter(
          this.parseFilter(
              lc, filter, analysisLayer.getInputAnalysisId(), analysisLayer.getInputCategoryId()));

      analysisLayer.setAnalysisMethodParams(method);

    } else {
      throw new ServiceException("Method parameters missing.");
    }

    return analysisLayer;
  }