geoshape.java
来自「geotools的源码」· Java 代码 · 共 190 行
JAVA
190 行
/**
* GeoShape is the abstract base for all GeoTools shapes
*
* @(#)GeoShape.java 11 October 1999 James Macgill
* @since 0.6.3
* @author James Macgill
**/
package uk.ac.leeds.ccg.geotools;
import java.util.*;
/**
* The abstract base class for all GeoTools shape objects
*
* @author James Macgill
* @since 0.6.3
* Modified 12/May/2000 JM to implement the IDReferenced interface
*/
public abstract class GeoShape implements IDReferenced
{
/**
* An ID to reference this shape
*/
protected int id;
/**
* Minimum bounding box for shape
*/
private GeoRectangle bBox;
protected Vector subParts;
/**
* Gets a full list of all the points that make up this shape.
* For Polygons and rectangles this would be the vertecis, for circles
* it would be the center point.
*
* @return A Vector of GeoPoints for each point of this shape
* @since 0.6.3
*/
public abstract Vector getPoints();
/**
* Tests to see if the specified point is contained by this shape.
* Points that lie on the edge of the shape are officialy
* undefined. However the intention is to define this as INSIDE.
*
* @param p The GeoPoint to test for containership
* @return A boolean, true for inside, otherwise false. On edge is undefined
* @since 0.6.3
*/
public abstract boolean contains(GeoPoint p);
/**
* Test to see if this shape is inside another shape.
* This should only be true if the entire of the shape appears
* to be inside the shape.
*
* In this implementation, every point must be inside of
* container.
*
* @param s The GeoShape to be inside of.
* @return A boolean, true if this shape is inside container.
* @since 0.6.3
*/
public boolean isContainedBy(GeoShape container){
Enumeration e = getPoints().elements();
boolean inside = true;
//test each point individualy, abort if any point is outside
while(e.hasMoreElements() && inside){
GeoPoint p = (GeoPoint)e.nextElement();
inside = container.contains(p);
}
return inside;
}
/**
* Tests to see if the two shapes intersect at all.
*
* in this implementation it returns true if either shape
* contains any point from the other shape<p>
* this is error prone.
*
* @param s The shape to test for intersection.
* @return A boolean, true if both shapes cross in some way.
* @since 0.6.3
*/
public boolean intersects(GeoShape s){
Enumeration e = s.getPoints().elements();
boolean inside = false;
//quick test of bounding boxes.
if(!s.getBounds().intersects(getBounds())) return false;
//test each point individualy, return if any point is inside
while(e.hasMoreElements() && !inside){
GeoPoint p = (GeoPoint)e.nextElement();
inside = contains(p);
}
//now test the other way around
if (inside) return true;
e=getPoints().elements();
while(e.hasMoreElements() && !inside){
GeoPoint p = (GeoPoint)e.nextElement();
inside = s.contains(p);
}
return inside;
}
/**
* Gets an ID for this shape.
* There is no implication of uniquness with this ID.
*
* @return An id holding the ID for this shape.
* @since 0.6.3
*/
public int getID(){
return id;
}
protected void extendBounds(double x,double y){
bBox.add(x,y);
}
protected void extendBounds(GeoPoint p){
bBox.add(p);
}
protected void setBounds(GeoRectangle b){
bBox = b;
}
/**
* Gets the minimum boudning rectangle for this shape
*
* @return A GeoRectangle that will contain this shape.
* @since 0.6.3
*/
public GeoRectangle getBounds(){
return bBox;
}
public GeoRectangle getMultiPartBounds(){
if(this.subParts==null){
return getBounds();
}
GeoRectangle multiBounds = new GeoRectangle();
multiBounds.add(getBounds());
for(int i=0;i<subParts.size();i++){
multiBounds.add(((GeoShape)subParts.elementAt(i)).getBounds());
}
return multiBounds;
}
public int getNumParts(){
if(subParts==null)return 1;
return subParts.size()+1;
}
public boolean isMultiPart(){
return getNumParts()>1;
}
public GeoShape getPart(int i){
if(i==0) return this;
if(subParts==null)return null;
return (GeoShape)subParts.elementAt(i-1);
}
public void addSubPart(GeoShape sub){
if(this.subParts==null){
subParts = new Vector();
}
bBox.add(sub.getBounds());
subParts.addElement(sub);
}
public abstract double getArea();
//to be implemented
//getBufferd(double d)
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?