介绍
jts是一个为GIS服务提供的api,内部可以用坐标点构建空间模型,判断模型之间的关系等
Coordinate
JTS内部封装的一个坐标类Coordinate(坐标)是用来存储坐标的轻便的类。它不同于点,点是Geometry的子类。不像模范Point的对象(包含额外的信息,例如一个信包,一个精确度模型和空间参考系统信息),Coordinate只包含纵座标值和存取方法。表示空间坐标,newCoordinate(116.273352,40.057497)
GeometryFactory
用来构建空间模型
JTS包结构
系(linearref包)、计算交点(noding包)、几何图形操作(operation包)、平面图(planargraph包)、多边形化(polygnize包)、精度(precision)、工具(util包)
空间数据模型
JTS提供了如下的空间数据类型
Point
MultiPoint
LineString
LinearRing 封闭的线条
MultiLineString 多条线
Polygon 多边形
MultiPolygon 多个多边形
GeometryCollection 包括点,线,面
空间模型的关系
判断两个几何图形是否存在指定的空间关系。包括:
实例代码:
package jtsTest;
import java.util.ArrayList;
import java.util.List;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
/**
* Class Operation.java
* Description 几何对象操作
* Company mapbar
* author Chenll E-mail: [email protected]
* Version 1.0
* Date 2012-2-21 上午10:47:47
*/
public class OperationLines {
private GeometryFactory geometryFactory = new GeometryFactory();
/**
* 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 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) throws ParseException {
OperationLines op = new OperationLines();
// //创建一条线
// List points1 = new ArrayList();
// points1.add(op.point(116.271635,40.052176));
// points1.add(op.point(116.280991,40.052439));
// points1.add(op.point(116.291119,40.050665));
// LineString line1 = op.createLine(points1);
// //创建第二条线
// List points2 = new ArrayList();
// points2.add(op.point(116.271292,40.046591));
// points2.add(op.point(116.279446,40.046591));
// points2.add(op.point(116.288115,40.054475));
// 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)
/**
* 构建多边形,
* 1,利用geometryFactory的Create方法
* 2. 利用wkt标记语言
* WKTReader reader = new WKTReader( geometryFactory );
* MultiPoint mpoint = (MultiPoint) reader.read("MULTIPOINT(109.013388 32.715519,119.32488 31.435678)");
*/
GeometryFactory geometryFactory = new GeometryFactory();
List colist1 = new ArrayList<>();
colist1.add(new Coordinate(116.280648,40.058811));
colist1.add(new Coordinate(116.276356,40.050008));
colist1.add(new Coordinate(116.289231,40.051322));
colist1.add(new Coordinate(116.280648,40.058811));
Coordinate[] cn = (Coordinate[]) colist1.toArray(new Coordinate[colist1.size()]);
Polygon polygon1 = geometryFactory.createPolygon(cn);
List colist2 = new ArrayList<>();
colist2.add(new Coordinate(116.273352,40.057497));
colist2.add(new Coordinate(116.280733,40.052504));
colist2.add(new Coordinate(116.270262,40.050336));
colist2.add(new Coordinate(116.273352,40.057497));
Coordinate[] cn1 = (Coordinate[]) colist1.toArray(new Coordinate[colist2.size()]);
Polygon polygon2 = geometryFactory.createPolygon(cn1);
Geometry intersection = polygon1.intersection(polygon2); //两个多边形的相交面积
System.out.println(intersection);
System.out.println(polygon1.equals(polygon2)); //形状是否相等
WKTReader reader = new WKTReader( geometryFactory );
Polygon wktPolygon1 = (Polygon) reader.read("POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10");
Polygon wktPolygon2 = (Polygon) reader.read("POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10");
System.out.println("相交面积坐标点:"+wktPolygon1.intersection(wktPolygon2));
}
}
WKT简介:
WKT - 概念
WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。
WKT - 几何对象
WKT可以表示的几何对象包括:点,线,多边形,TIN(不规则三角网)及多面体。可以通过几何集合的方式来表示不同维度的几何对象。
几何物体的坐标可以是2D(x,y),3D(x,y,z),4D(x,y,z,m),加上一个属于线性参照系统的m值。
以下为几何WKT字串样例:
POINT(6 10)
LINESTRING(3 4,10 50,20 25)
POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))
MULTIPOINT(3.5 5.6, 4.8 10.5)
MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))
MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))
GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))
POINT ZM (1 1 5 60)
POINT M (1 1 80)
POINT EMPTY
MULTIPOLYGON EMPTY