private static boolean intersects(
      Envelope requestEnv, String requestCrs, Envelope regionEnv, String regionCrs)
      throws CRSException, GeometryException, CRSTransformationException, UnknownCRSException {
    Surface request = GeometryFactory.createSurface(requestEnv, CRSFactory.create(requestCrs));
    Surface region = GeometryFactory.createSurface(regionEnv, CRSFactory.create(regionCrs));

    if (!requestCrs.equalsIgnoreCase(regionCrs)) {
      GeoTransformer gt = new GeoTransformer(requestCrs);
      region = (Surface) gt.transform(region);
    }

    return request.intersects(region);
  }
  /**
   * zooms the current map by a factor and recenters it to the point the user has clicked to.
   *
   * @throws PortalException
   * @throws ContextException
   */
  void zoom() throws PortalException, ContextException {

    ViewContext vc = getCurrentViewContext(portlet.getID());
    MapModelAccess mma = new DefaultMapModelAccess(vc);

    String tmp = parameter.get(PARAM_FACTOR);
    if (tmp == null) {
      throw new PortalException("FACTOR must be set for zoom operation!");
    }
    double factor = Double.parseDouble(tmp);

    tmp = parameter.get(PARAM_CLICKPOINT);
    if (tmp != null) {
      // zoom by pixel coordinates
      double coords[] = StringTools.toArrayDouble(tmp, ",");
      java.awt.Point point = new java.awt.Point((int) coords[0], (int) coords[1]);
      vc = mma.zoom(point, factor);
    } else {
      // zoom by map coordinates
      tmp = parameter.get(PARAM_MAPPOINT);
      if (tmp == null) {
        throw new PortalException(
            "at least a CLICKPOINT or a MAPPOINT must be defined for zoom operation!");
      }
      double coords[] = StringTools.toArrayDouble(tmp, ",");
      Point point = GeometryFactory.createPoint(coords[0], coords[1], null);
      vc = mma.zoom(point, factor);
    }
    setCurrentMapContext(vc, portlet.getID());
  }
 /**
  * Parse Layer Bounding Boxes
  *
  * @param nl
  * @return LayerBoundingBox[]
  * @throws XMLParsingException
  */
 protected LayerBoundingBox[] parseLayerBoundingBoxes(List nl) throws XMLParsingException {
   LOG.entering();
   LayerBoundingBox[] llBoxes = new LayerBoundingBox[nl.size()];
   for (int i = 0; i < llBoxes.length; i++) {
     double minx = XMLTools.getRequiredNodeAsDouble((Node) nl.get(i), "./@minx", nsContext);
     double maxx = XMLTools.getRequiredNodeAsDouble((Node) nl.get(i), "./@maxx", nsContext);
     double miny = XMLTools.getRequiredNodeAsDouble((Node) nl.get(i), "./@miny", nsContext);
     double maxy = XMLTools.getRequiredNodeAsDouble((Node) nl.get(i), "./@maxy", nsContext);
     double resx = XMLTools.getNodeAsDouble((Node) nl.get(i), "./@resx", nsContext, -1);
     double resy = XMLTools.getNodeAsDouble((Node) nl.get(i), "./@resx", nsContext, -1);
     String srs = XMLTools.getRequiredNodeAsString((Node) nl.get(i), "./@SRS", nsContext);
     Position min = GeometryFactory.createPosition(minx, miny);
     Position max = GeometryFactory.createPosition(maxx, maxy);
     llBoxes[i] = new LayerBoundingBox(min, max, srs, resx, resy);
   }
   LOG.exiting();
   return llBoxes;
 }
  /**
   * This creates a MultiPoint object.
   *
   * @see org.deegree.io.shpapi.shape_new.Shape#getGeometry()
   */
  public Geometry getGeometry() throws ShapeGeometryException {
    if (points == null) {
      return null;
    }
    Point[] ps = new Point[points.length];

    for (int i = 0; i < ps.length; ++i) {
      ps[i] = (Point) points[i].getGeometry();
    }

    return GeometryFactory.createMultiPoint(ps, crs);
  }
  /** updates geometry with current ({@link #spArcRadius}) radius */
  private void applyRadius() {
    List<Point> points = drawingPane.getDrawObjectsAsGeoPoints();
    if (points.size() > 2) {
      // calculate new end point for first vector
      double[] lineParam =
          LineUtils.getLineFromPoints(
              points.get(0).getX(), points.get(0).getY(),
              points.get(1).getX(), points.get(1).getY());
      Pair<Position, Position> pair1 =
          LineUtils.getSymmetricPoints(
              points.get(0).getX(), points.get(0).getY(), lineParam[0], getRadius());

      // calculate new end point for second vector
      lineParam =
          LineUtils.getLineFromPoints(
              points.get(0).getX(), points.get(0).getY(),
              points.get(2).getX(), points.get(2).getY());
      Pair<Position, Position> pair2 =
          LineUtils.getSymmetricPoints(
              points.get(0).getX(), points.get(0).getY(), lineParam[0], getRadius());
      // must check to ensure correct direction
      if (points.get(1).getX() >= points.get(0).getX()) {
        points.set(
            1, GeometryFactory.createPoint(pair1.first, points.get(0).getCoordinateSystem()));
      } else {
        points.set(
            1, GeometryFactory.createPoint(pair1.second, points.get(0).getCoordinateSystem()));
      }
      if (points.get(2).getX() >= points.get(0).getX()) {
        points.set(
            2, GeometryFactory.createPoint(pair2.first, points.get(0).getCoordinateSystem()));
      } else {
        points.set(
            2, GeometryFactory.createPoint(pair2.second, points.get(0).getCoordinateSystem()));
      }
      digitizerModule.getMapModule().update();
    }
  }
  /**
   * Parse Lat Lon Bounding Box
   *
   * @param llBox
   * @return Envelope
   * @throws XMLParsingException
   * @throws UnknownCRSException
   */
  protected Envelope parseLatLonBoundingBox(Element llBox)
      throws XMLParsingException, UnknownCRSException {
    LOG.entering();

    double minx = XMLTools.getRequiredNodeAsDouble(llBox, "./@minx", nsContext);
    double maxx = XMLTools.getRequiredNodeAsDouble(llBox, "./@maxx", nsContext);
    double miny = XMLTools.getRequiredNodeAsDouble(llBox, "./@miny", nsContext);
    double maxy = XMLTools.getRequiredNodeAsDouble(llBox, "./@maxy", nsContext);
    /** default crs = EPSG:4326 */
    CoordinateSystem crs = CRSFactory.create("EPSG:4326");
    Envelope env = GeometryFactory.createEnvelope(minx, miny, maxx, maxy, crs);

    LOG.exiting();
    return env;
  }
  private static boolean intersects(
      Envelope envelope, Code reqCRS, Envelope[] envs, LonLatEnvelope llEnv)
      throws UnknownCRSException {

    boolean res = false;
    String reqCRSCode = reqCRS.getCode();

    try {
      if (envs == null || envs.length == 0) {
        Envelope latlonEnv =
            GeometryFactory.createEnvelope(
                llEnv.getMin().getX(),
                llEnv.getMin().getY(),
                llEnv.getMax().getX(),
                llEnv.getMax().getY(),
                CRSFactory.create("EPSG:4326"));

        if (!"EPSG:4326".equals(reqCRSCode)) {
          res = intersects(envelope, reqCRSCode, latlonEnv, "EPSG:4326");
        } else {
          res = envelope.intersects(latlonEnv);
        }
      } else {
        for (int i = 0; i < envs.length && !res; i++) {
          if (intersects(
              envelope, reqCRSCode, envs[i], envs[i].getCoordinateSystem().getPrefixedName())) {
            res = true;
            break;
          }
        }
      }
    } catch (GeometryException ex) {
      LOG.logWarning("intersection test; translation into surface failed", ex);
    } catch (CRSException ex) {
      LOG.logWarning(
          "intersection test; transformation of reqeust envelope/valid area impossible", ex);
    } catch (CRSTransformationException ex) {
      LOG.logWarning("intersection test; transformation of reqeust envelope/valid area failed", ex);
    }
    return res;
  }
  /** return the LonLatEnvelope of the entire image in "EPSG:4326" */
  private Envelope getLLEAsEnvelope() {
    String code = getNativeSRSCode();
    LonLatEnvelope lle = description.getLonLatEnvelope();
    Envelope tmp =
        GeometryFactory.createEnvelope(
            lle.getMin().getX(),
            lle.getMin().getY(),
            lle.getMax().getX(),
            lle.getMax().getY(),
            null);
    try {
      if (!code.equals("EPSG:4326")) {
        GeoTransformer trans = new GeoTransformer(code);
        tmp = trans.transform(tmp, "EPSG:4326");
      }
    } catch (Exception e) {
      LOGGER.logError(StringTools.stackTraceToString(e));
    }

    return tmp;
  }
Example #9
0
    public void run() {
      Container container = getContentPane();
      container.removeAll();
      container.setLayout(new GridLayout(3, 1));

      int features = shapeFile.getRecordNum();
      container.add(new JLabel("Indexing..."));
      JProgressBar progressBar = new JProgressBar(1, features);
      progressBar.setStringPainted(true);
      container.add(progressBar);
      cancel = new JButton("Cancel");
      cancel.addActionListener(frame);
      container.add(cancel);
      pack();

      boolean geometry = false;
      DBaseIndex[] index = new DBaseIndex[properties.length];
      RTree rtree = null;

      try {
        String[] dataTypes = shapeFile.getDataTypes();
        int[] lengths = shapeFile.getDataLengths();

        if (geometryCheckBox.isSelected() && !hasGeometry) {
          geometry = true;
          rtree = new RTree(2, 11, fileName + ".rti");
        }

        boolean indexes = false;
        for (int i = 0; i < index.length; i++) {
          if (checkboxes[i].isSelected() && !hasIndex[i]) {
            index[i] =
                DBaseIndex.createIndex(
                    fileName + "$" + properties[i],
                    properties[i],
                    lengths[i],
                    uniqueBoxes[i].isSelected(),
                    (dataTypes[i].equalsIgnoreCase("N")
                        || dataTypes[i].equalsIgnoreCase("I")
                        || dataTypes[i].equalsIgnoreCase("F")));
            indexes = true;
          } else index[i] = null;
        }

        if (geometry || indexes) {
          for (int i = 1; i < features + 1; i++) {
            Feature feature = shapeFile.getFeatureByRecNo(i);

            if (geometry) {
              Geometry[] geometries = feature.getGeometryPropertyValues();
              if (geometries.length == 0) {
                LOG.logInfo("no geometries at recno" + i);
                continue;
              }
              Envelope envelope = null;
              // TODO: deal with more than one geometry; handle geometry=null (allowed
              // in shapefile)
              envelope = (feature.getDefaultGeometryPropertyValue()).getEnvelope();
              if (envelope == null) { // assume a Point-geometry
                Point pnt = (Point) geometries[0];
                envelope =
                    GeometryFactory.createEnvelope(
                        pnt.getX(), pnt.getY(), pnt.getX(), pnt.getY(), null);
              }
              HyperBoundingBox box =
                  new HyperBoundingBox(
                      new HyperPoint(envelope.getMin().getAsArray()),
                      new HyperPoint(envelope.getMax().getAsArray()));
              rtree.insert(new Integer(i), box);
            }

            for (int j = 0; j < index.length; j++) {
              if (index[j] != null) {
                QualifiedName qn = new QualifiedName(properties[j]);
                index[j].addKey((Comparable) feature.getDefaultProperty(qn), i);
              }
            }

            progressBar.setValue(i);

            synchronized (this) {
              if (stop) {
                shapeFile.close();
                if (geometry) {
                  rtree.close();
                  new File(fileName + ".rti").delete();
                }
                for (int j = 0; j < index.length; j++) {
                  if (index[j] != null) {
                    index[j].close();
                    new File(fileName + "$" + properties[j] + ".ndx").delete();
                  }
                }
                System.exit(3);
              }
            }
          }
        }

        try {
          if (geometry) {
            rtree.close();
          }
          shapeFile.close();

          for (int i = 0; i < index.length; i++) if (index[i] != null) index[i].close();
        } catch (Exception e) {
          e.printStackTrace();
          JOptionPane.showMessageDialog(frame, e);
          System.exit(1);
        }

        if (!geometryCheckBox.isSelected() && hasGeometry) {
          new File(fileName + ".rti").delete();
        }

        for (int i = 0; i < index.length; i++) {
          if (!checkboxes[i].isSelected() && hasIndex[i]) {
            new File(fileName + "$" + properties[i] + ".ndx").delete();
          }
        }

        System.exit(0);
      } catch (Exception ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(frame, ex);
        System.exit(1);
      }
    }
  /**
   * returns the layers offered by the WMPS
   *
   * @param layerElem
   * @param parent
   * @return Layer
   * @throws XMLParsingException
   * @throws UnknownCRSException
   */
  protected Layer parseLayers(Element layerElem, Layer parent)
      throws XMLParsingException, UnknownCRSException {
    LOG.entering();

    boolean queryable = XMLTools.getNodeAsBoolean(layerElem, "./@queryable", nsContext, false);

    int cascaded = XMLTools.getNodeAsInt(layerElem, "./@cascaded", nsContext, 0);
    boolean opaque = XMLTools.getNodeAsBoolean(layerElem, "./@opaque", nsContext, false);
    boolean noSubsets = XMLTools.getNodeAsBoolean(layerElem, "./@noSubsets", nsContext, false);
    int fixedWidth = XMLTools.getNodeAsInt(layerElem, "./@fixedWidth", nsContext, 0);
    int fixedHeight = XMLTools.getNodeAsInt(layerElem, "./@fixedHeight", nsContext, 0);
    String name = XMLTools.getNodeAsString(layerElem, "./Name", nsContext, null);
    String title = XMLTools.getRequiredNodeAsString(layerElem, "./Title", nsContext);
    String layerAbstract = XMLTools.getNodeAsString(layerElem, "./Abstract", nsContext, null);
    String[] keywords = XMLTools.getNodesAsStrings(layerElem, "./KeywordList/Keyword", nsContext);
    String[] srs = XMLTools.getNodesAsStrings(layerElem, "./SRS", nsContext);

    List nl = XMLTools.getNodes(layerElem, "./BoundingBox", nsContext);
    // TODO substitue with Envelope
    LayerBoundingBox[] bboxes = null;
    if (nl.size() == 0 && parent != null) {
      // inherit BoundingBoxes from parent layer
      bboxes = parent.getBoundingBoxes();
    } else {
      bboxes = parseLayerBoundingBoxes(nl);
    }

    Element llBox = (Element) XMLTools.getNode(layerElem, "./LatLonBoundingBox", nsContext);
    Envelope llBoundingBox = null;

    if (llBox == null && parent != null) {
      // inherit LatLonBoundingBox parent layer
      llBoundingBox = parent.getLatLonBoundingBox();
    } else if (llBox != null) {
      llBoundingBox = parseLatLonBoundingBox(llBox);
    } else {
      /** Default crs = EPSG:4326 */
      CoordinateSystem crs = CRSFactory.create("EPSG:4326");
      llBoundingBox = GeometryFactory.createEnvelope(-180, -90, 180, 90, crs);
    }

    Dimension[] dimensions = parseDimensions(layerElem);

    Extent[] extents = parseExtents(layerElem);

    Attribution attribution = parseAttribution(layerElem);

    AuthorityURL[] authorityURLs = parseAuthorityURLs(layerElem);

    MetadataURL[] metadataURLs = parseMetadataURLs(layerElem);

    DataURL[] dataURLs = parseDataURL(layerElem);

    Identifier[] identifiers = parseIdentifiers(layerElem);

    FeatureListURL[] featureListURLs = parseFeatureListURL(layerElem);

    Style[] styles = parseStyles(layerElem);

    ScaleHint scaleHint = parseScaleHint(layerElem);

    Layer layer =
        new Layer(
            queryable,
            cascaded,
            opaque,
            noSubsets,
            fixedWidth,
            fixedHeight,
            name,
            title,
            layerAbstract,
            llBoundingBox,
            attribution,
            scaleHint,
            keywords,
            srs,
            bboxes,
            dimensions,
            extents,
            authorityURLs,
            identifiers,
            metadataURLs,
            dataURLs,
            featureListURLs,
            styles,
            null,
            null,
            parent);

    // get Child layers
    nl = XMLTools.getNodes(layerElem, "./Layer", nsContext);
    Layer[] layers = new Layer[nl.size()];
    for (int i = 0; i < layers.length; i++) {
      layers[i] = parseLayers((Element) nl.get(i), layer);
    }

    // set child layers
    layer.setLayer(layers);

    LOG.exiting();
    return layer;
  }