JTS Geometry Operations(一)


Geometry空間解析メソッドジオメトリ操作パッケージ
operationパッケージには、buffer、distance、linemerge、overlap、polygonize、predicate、relate、valideの8つのサブパッケージが含まれています.
それぞれ,グラフィックのバッファ,距離,セグメント融合,グラフィックオーバーライド,ポリゴン化,断言,関連付け,有効性などを計算する操作に対応する.すべての操作はgeomパッケージで定義されたGeometryオブジェクトを対象としています.
コンピュータでは、すべての図形が離散する点からなるので、すべての操作は図形を構成する点の集合上で行う.
1つの図形(Geometry)のバッファ(buffer)
距離操作(distance)は、オブジェクトGeometry A,Bを操作し、(A)と(B)の中で最も近い2つの点の距離を返す2元操作である.
線分の融合(linemerge)は、Geometry Aで相互に接続されている線分を接続することである.
グラフィックのオーバーライド(overlap)は、ここではあまり言いたくなくて、自分がぼんやりしています.
多角化操作(polygonize)はGeometry Aを計算し、多角形(Polygon)を返します.複数の点で表される図形を、少量の点で表し、図形の情報を減らし、すなわち図形を次元を下げる.
断言(predicate)は2次元の操作であり,Geometry間の関係を判断する操作である.
関連付け(relate)は、DE−9 IM(The Dimensionally Extended Nine−Intersection Model)に従って、2つのGeometry AとBの交差行列IM(Intersections Matrix)を返す.この行列はグラフィック関係の計算に用いられる.
distance,intersection,union,difference操作を列挙した
package com.mapbar.geo.jts.operation;

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

import org.geotools.geometry.jts.JTSFactoryFinder;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
/**  

 * Class Operation.java 

 * Description  

 * Company mapbar 

 * author Chenll E-mail: [email protected]

 * Version 1.0 

 * Date 2012-2-21  10:47:47

 */
public class Operation {
	
	private GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null );
	
	/**
	 * create a Point
	 * @param x
	 * @param y
	 * @return
	 */
	public Coordinate point(double x,double y){
		return new Coordinate(x,y);
	}
	

	/**
	 * create a line
	 * @return
	 */
	public LineString createLine(List<Coordinate> points){
		Coordinate[] coords  = (Coordinate[]) points.toArray(new Coordinate[points.size()]);
		LineString line = geometryFactory.createLineString(coords);
		return line;
	}
	
	/**
	 *  (A) (B) 
	 * @param a
	 * @param b
	 * @return
	 */
	public double distanceGeo(Geometry a,Geometry b){
		return a.distance(b);
	}
	
	/**
	 *  
	 * @param a
	 * @param b
	 * @return
	 */
	public Geometry intersectionGeo(Geometry a,Geometry b){
		return a.intersection(b);
	}
	
	/**
	 *  
	 * @param a
	 * @param b
	 * @return
	 */
	public Geometry unionGeo(Geometry a,Geometry b){
		return a.union(b);
	}
	
	/**
	 *  A , B 
	 * @param a
	 * @param b
	 * @return
	 */
	public Geometry differenceGeo(Geometry a,Geometry b){
		return a.difference(b);
	}
	
	
	public static void main(String[] args){
		Operation op = new Operation();
		// 
		List<Coordinate> points1 = new ArrayList<Coordinate>();
		points1.add(op.point(0,0));
		points1.add(op.point(1,3));
		points1.add(op.point(2,3));
		LineString line1 = op.createLine(points1);
		// 
		List<Coordinate> points2 = new ArrayList<Coordinate>();
		points2.add(op.point(3,0));
		points2.add(op.point(3,3));
		points2.add(op.point(5,6));
		LineString line2 = op.createLine(points2);
		System.out.println(op.distanceGeo(line1,line2));//out 1.0
		System.out.println(op.intersectionGeo(line1,line2));//out GEOMETRYCOLLECTION EMPTY
		System.out.println(op.unionGeo(line1,line2)); //out MULTILINESTRING ((0 0, 1 3, 2 3), (3 0, 3 3, 5 6))
		System.out.println(op.differenceGeo(line1,line2));//out LINESTRING (0 0, 1 3, 2 3)
	}
}