Package org.geomajas.gwt.client.spatial.geometry

Source Code of org.geomajas.gwt.client.spatial.geometry.MultiPoint

/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2011 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/

package org.geomajas.gwt.client.spatial.geometry;

import org.geomajas.geometry.Coordinate;
import org.geomajas.gwt.client.spatial.Bbox;
import org.geomajas.gwt.client.spatial.LineSegment;
import org.geomajas.layer.LayerType;

/**
* MultiPoint client-side GWT object.
*
* @author Pieter De Graef
*/
public class MultiPoint extends AbstractGeometry {

  private static final long serialVersionUID = 2262892444046706151L;

  private Point[] points;

  // -------------------------------------------------------------------------
  // Constructor
  // -------------------------------------------------------------------------

  MultiPoint(int srid, int precision) {
    super(srid, precision);
  }

  MultiPoint(int srid, int precision, Point[] points) {
    super(srid, precision);
    this.points = points;
  }

  // -------------------------------------------------------------------------
  // Geometry implementation:
  // -------------------------------------------------------------------------

  public boolean isEmpty() {
    return (points == null || points.length == 0);
  }

  Point[] getPoints() {
    return points;
  }

  void setPoints(Point[] points) {
    this.points = points;
  }

  /**
   * Return true.
   */
  public boolean isValid() {
    return true;
  }

  public Coordinate getCentroid() {
    if (isEmpty()) {
      return null;
    }
    double sumX = 0;
    double sumY = 0;
    double numPoints = getNumPoints();
    for (Point point : points) {
      sumX += point.getX();
      sumY += point.getY();
    }
    return new Coordinate(sumX / numPoints, sumY / numPoints);
  }

  /**
   * Return 0.
   */
  public double getLength() {
    return 0;
  }

  /**
   * Return the total number of points in this MultiPoint geometry.
   */
  public int getNumGeometries() {
    if (isEmpty()) {
      return 0;
    }
    return points.length;
  }

  /**
   * Return the total number of points in this MultiPoint geometry. Since every Point object has only one coordinate,
   * the result is the same as when requesting the getNumGeometries.
   */
  public int getNumPoints() {
    if (isEmpty()) {
      return 0;
    }
    return points.length;
  }

  /**
   * Create a copy of this geometry and return it.
   */
  public Object clone() {
    return getGeometryFactory().createMultiPoint(points);
  }

  /**
   * Return null if the MultiPoint is empty, returns one of the points if the requested index exists, throws an
   * exception otherwise.
   *
   * @param n
   *            The index in the point array to retrieve. Better make sure it is a valid index. (0 < n < getNumPoints)
   */
  public Geometry getGeometryN(int n) {
    if (isEmpty()) {
      return null;
    }
    if (n >= 0 && n < points.length) {
      return points[n];
    }
    throw new ArrayIndexOutOfBoundsException(n);
    // return this;
  }

  public double getDistance(Coordinate coordinate) {
    double distance = Double.MAX_VALUE;
    if (!isEmpty()) {
      for (Point point : points) {
        double temp = new LineSegment(point.getCoordinate(), coordinate).getLength();
        if (temp < distance) {
          distance = temp;
        }
      }
    }
    return distance;
  }

  /**
   * Return the bounding box spanning the full list of points.
   */
  public Bbox getBounds() {
    if (isEmpty()) {
      return null;
    }
    double minX = Double.MAX_VALUE;
    double minY = Double.MAX_VALUE;
    double maxX = -Double.MAX_VALUE;
    double maxY = -Double.MAX_VALUE;

    for (Point point : points) {
      if (point.getX() < minX) {
        minX = point.getX();
      }
      if (point.getY() < minY) {
        minY = point.getY();
      }
      if (point.getX() > maxX) {
        maxX = point.getX();
      }
      if (point.getY() > maxY) {
        maxY = point.getY();
      }
    }

    return new Bbox(minX, minY, maxX - minX, maxY - minY);
  }

  /**
   * Get the coordinate from the first point, or null if the MultiPoint is empty.
   */
  public Coordinate getCoordinate() {
    if (isEmpty()) {
      return null;
    }
    return points[0].getCoordinate();
  }

  /**
   * Get the full list of coordinates from all the points in this MultiPoint geometry. If this geometry is empty, null
   * will be returned.
   */
  public Coordinate[] getCoordinates() {
    if (isEmpty()) {
      return null;
    }
    Coordinate[] coordinates = new Coordinate[points.length];
    for (int i = 0; i < points.length; i++) {
      coordinates[i] = points[i].getCoordinate();
    }
    return coordinates;
  }

  public LayerType getLayerType() {
    return LayerType.MULTIPOINT;
  }
 
  /**
   * Return true if any of the points intersect the given geometry.
   */
  public boolean intersects(Geometry geometry) {
    if (isEmpty()) {
      return false;
    }
    for (Point point : points) {
      if (point.intersects(geometry)) {
        return true;
      }
    }
    return false;
  }

  public String toWkt() {
    if (isEmpty()) {
      return "MULTIPOINT(EMPTY)";
    }
    String wkt = "MULTIPOINT(";
    for (int i = 0; i < points.length; i++) {
      String lineWkt = points[i].toWkt();
      if (i > 0) {
        wkt += ",";
      }
      wkt += lineWkt.substring(lineWkt.indexOf("("));
    }
    return wkt + ")";
  }
}
TOP

Related Classes of org.geomajas.gwt.client.spatial.geometry.MultiPoint

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.