Package chunmap.model.geom

Source Code of chunmap.model.geom.MultiGeometry

/**
* Copyright (c) 2009-2011, chunquedong(YangJiandong)
*
* This file is part of ChunMap project
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE(Version >=3)
*
* History:
*     2010-05-05  Jed Young  Creation
*/
package chunmap.model.geom;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import chunmap.model.coord.Transform;
import chunmap.model.elem.Envelope;
import chunmap.model.elem.EnvelopeBuf;

/**
* @author chunquedong
*
*/
public class MultiGeometry<E extends Geometry> extends AbstractGeometry
    implements GeometryCollection {

  protected List<E> geometrys;

  public MultiGeometry(List<? extends E> geometryList) {
    if (geometryList == null || geometryList.size() < 1) {
      throw new IllegalArgumentException();
    }

    geometrys = new ArrayList<E>();
    for (E g : geometryList) {
      geometrys.add(g);
    }
  }

  public E getGeometry(int index) {
    return geometrys.get(index);
  }

  public int size() {
    return geometrys.size();
  }

  @Override
  public Iterator<Geometry> iterator() {
    return new Iterator<Geometry>() {
      Iterator<E> it = geometrys.iterator();

      @Override
      public boolean hasNext() {
        return it.hasNext();
      }

      @Override
      public E next() {
        return it.next();
      }

      @Override
      public void remove() {
        throw new UnsupportedOperationException();
      }
    };
  }

  @Override
  protected Envelope calculateEnvelop() {
    EnvelopeBuf env = new EnvelopeBuf();
    for (E g : geometrys) {
      env.mergeEnvelop(g.getEnvelop());
    }
    return env.toEnvelop();
  }

  @Override
  public GeometryType getGeometryType() {
    return GeometryType.GeometryCollection;
  }

  /**
   * GEOMETRYCOLLECTION(POINT(10 20),LINESTRING(10 30,40 50))
   */
  @Override
  public String toString() {
    StringBuilder str = new StringBuilder();
    str.append("GEOMETRYCOLLECTION(");
    for (Geometry g : geometrys) {
      str.append(g.toString() + ",");
    }
    str.deleteCharAt(str.lastIndexOf(","));
    str.append(")");
    return str.toString();
  }

  @Override
  public Geometry getBoundary() {
    List<Geometry> bs = new ArrayList<Geometry>();
    for (Geometry g : geometrys) {
      Geometry gb = g.getBoundary();
      if (gb == null)
        continue;
      GeometryCollection gc = (GeometryCollection) gb;
      for (Geometry geo : gc) {
        bs.add(geo);
      }
    }
    return new MultiGeometry<Geometry>(bs);
  }

  /*
   * (non-Javadoc)
   *
   * @see chunmap.model.geom.Geometry#checkValid()
   */
  @Override
  protected boolean isSimple() {
    for (Geometry g : geometrys) {
      if (g.isValid() == false) {
        return false;
      }
    }
    return true;
  }

  @SuppressWarnings("unchecked")
  // 泛型强制转换警告
  @Override
  public Geometry transform(Transform transf) {
    List<E> geometryList = new ArrayList<E>();
    for (E g : geometrys) {
      geometryList.add((E) g.transform(transf));
    }
    return new MultiGeometry<E>(geometryList);
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
        + ((geometrys == null) ? 0 : geometrys.hashCode());
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (getClass() != obj.getClass())
      return false;
    @SuppressWarnings("rawtypes")
    MultiGeometry other = (MultiGeometry) obj;
   
    if (geometrys == null) {
      if (other.geometrys != null)
        return false;
    }
   
    for (E g : geometrys) {
      if(!g.equals(other)){
        return false;
      }
    }
   
    return true;
  }
}
TOP

Related Classes of chunmap.model.geom.MultiGeometry

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.