jts学习——com.vividsolutions.jts.geom包

介绍

jts是一个为GIS服务提供的api,内部可以用坐标点构建空间模型,判断模型之间的关系等

Coordinate

JTS内部封装的一个坐标类Coordinate(坐标)是用来存储坐标的轻便的类。它不同于点,点是Geometry的子类。不像模范Point的对象(包含额外的信息,例如一个信包,一个精确度模型和空间参考系统信息),Coordinate只包含纵座标值和存取方法。表示空间坐标,newCoordinate(116.273352,40.057497)

file

GeometryFactory

用来构建空间模型

JTS包结构

系(linearref包)、计算交点(noding包)、几何图形操作(operation包)、平面图(planargraph包)、多边形化(polygnize包)、精度(precision)、工具(util包)

空间数据模型

JTS提供了如下的空间数据类型

Point     
     MultiPoint
     LineString     
     LinearRing  封闭的线条
     MultiLineString    多条线
     Polygon 多边形
     MultiPolygon           多个多边形
     GeometryCollection  包括点,线,面
file

空间模型的关系

判断两个几何图形是否存在指定的空间关系。包括:

file file

实例代码:

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

你可能感兴趣的:(学习)