JTS基本概念和使用

简介

  1. JTS是加拿大的 Vivid Solutions公司做的一套开放源码的 Java API。它提供了一套空间数据操作的核心算法。为在兼容OGC标准的空间对象模型中进行基础的几何操作提供2D空间谓词API。

操作

  1. 表示Geometry对象

    1. Geometry类型介绍见另一篇文章:WKT WKB和GeoJSON
    2. package com.alibaba.autonavi;
      
      import com.vividsolutions.jts.geom.Coordinate;
      import com.vividsolutions.jts.geom.Geometry;
      import com.vividsolutions.jts.geom.GeometryCollection;
      import com.vividsolutions.jts.geom.GeometryFactory;
      import com.vividsolutions.jts.geom.LineString;
      import com.vividsolutions.jts.geom.LinearRing;
      import com.vividsolutions.jts.geom.Point;
      import com.vividsolutions.jts.geom.Polygon;
      import com.vividsolutions.jts.geom.MultiPolygon;
      import com.vividsolutions.jts.geom.MultiLineString;
      import com.vividsolutions.jts.geom.MultiPoint;
      import com.vividsolutions.jts.io.ParseException;
      import com.vividsolutions.jts.io.WKTReader;
      
      public class GeometryDemo {
      
          private GeometryFactory geometryFactory = new GeometryFactory();
      
          /**
           * create a point
           * @return
           */
          public Point createPoint(){
              Coordinate coord = new Coordinate(109.013388, 32.715519);
              Point point = geometryFactory.createPoint( coord );
              return point;
          }
      
          /**
           * create a point by WKT
           * @return
           * @throws ParseException
           */
          public Point createPointByWKT() throws ParseException{
              WKTReader reader = new WKTReader( geometryFactory );
              Point point = (Point) reader.read("POINT (109.013388 32.715519)");
              return point;
          }
      
          /**
           * create multiPoint by wkt
           * @return
           */
          public MultiPoint createMulPointByWKT()throws ParseException{
              WKTReader reader = new WKTReader( geometryFactory );
              MultiPoint mpoint = (MultiPoint) reader.read("MULTIPOINT(109.013388 32.715519,119.32488 31.435678)");
              return mpoint;
          }
          /**
           *
           * create a line
           * @return
           */
          public LineString createLine(){
              Coordinate[] coords  = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};
              LineString line = geometryFactory.createLineString(coords);
              return line;
          }
      
          /**
           * create a line by WKT
           * @return
           * @throws ParseException
           */
          public LineString createLineByWKT() throws ParseException{
              WKTReader reader = new WKTReader( geometryFactory );
              LineString line = (LineString) reader.read("LINESTRING(0 0, 2 0)");
              return line;
          }
      
          /**
           * create multiLine
           * @return
           */
          public MultiLineString createMLine(){
              Coordinate[] coords1  = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};
              LineString line1 = geometryFactory.createLineString(coords1);
              Coordinate[] coords2  = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};
              LineString line2 = geometryFactory.createLineString(coords2);
              LineString[] lineStrings = new LineString[2];
              lineStrings[0]= line1;
              lineStrings[1] = line2;
              MultiLineString ms = geometryFactory.createMultiLineString(lineStrings);
              return ms;
          }
      
          /**
           * create multiLine by WKT
           * @return
           * @throws ParseException
           */
          public MultiLineString createMLineByWKT()throws ParseException{
              WKTReader reader = new WKTReader( geometryFactory );
              MultiLineString line = (MultiLineString) reader.read("MULTILINESTRING((0 0, 2 0),(1 1,2 2))");
              return line;
          }
      
          /**
           * create a polygon(多边形) by WKT
           * @return
           * @throws ParseException
           */
          public Polygon createPolygonByWKT() throws ParseException{
              WKTReader reader = new WKTReader( geometryFactory );
              Polygon polygon = (Polygon) reader.read("POLYGON((20 10, 30 0, 40 10, 30 20, 20 10))");
              return polygon;
          }
      
          /**
           * create multi polygon by wkt
           * @return
           * @throws ParseException
           */
          public MultiPolygon createMulPolygonByWKT() throws ParseException{
              WKTReader reader = new WKTReader( geometryFactory );
              MultiPolygon mpolygon = (MultiPolygon) reader.read("MULTIPOLYGON(((40 10, 30 0, 40 10, 30 20, 40 10),(30 10, 30 0, 40 10, 30 20, 30 10)))");
              return mpolygon;
          }
      
          /**
           * create GeometryCollection  contain point or multiPoint or line or multiLine or polygon or multiPolygon
           * @return
           * @throws ParseException
           */
          public GeometryCollection createGeoCollect() throws ParseException{
              LineString line = createLine();
              Polygon poly =  createPolygonByWKT();
              Geometry g1 = geometryFactory.createGeometry(line);
              Geometry g2 = geometryFactory.createGeometry(poly);
              Geometry[] garray = new Geometry[]{g1,g2};
              GeometryCollection gc = geometryFactory.createGeometryCollection(garray);
              return gc;
          }
      
          /**
           * create a Circle  创建一个圆,圆心(x,y) 半径RADIUS
           * @param x
           * @param y
           * @param RADIUS
           * @return
           */
          public Polygon createCircle(double x, double y, final double RADIUS){
              final int SIDES = 32;//圆上面的点个数
              Coordinate coords[] = new Coordinate[SIDES+1];
              for( int i = 0; i < SIDES; i++){
                  double angle = ((double) i / (double) SIDES) * Math.PI * 2.0;
                  double dx = Math.cos( angle ) * RADIUS;
                  double dy = Math.sin( angle ) * RADIUS;
                  coords[i] = new Coordinate( (double) x + dx, (double) y + dy );
              }
              coords[SIDES] = coords[0];
              LinearRing ring = geometryFactory.createLinearRing( coords );
              Polygon polygon = geometryFactory.createPolygon( ring, null );
              return polygon;
          }
      
          /**
           * @param args
           * @throws ParseException
           */
          public static void main(String[] args) throws ParseException {
              GeometryDemo gt = new GeometryDemo();
              Polygon p = gt.createCircle(0, 1, 2);
              //圆上所有的坐标(32个)
              Coordinate coords[] = p.getCoordinates();
              for(Coordinate coord:coords){
                  System.out.println(coord.x+","+coord.y);
              }
          }
      }
  2. Geometry之间的关系
    1. 支持的空间操作包括

相等(Equals):


几何形状拓扑上相等。


脱节(Disjoint):


几何形状没有共有的点。


相交(Intersects):


几何形状至少有一个共有点(区别于脱节)


接触(Touches):


几何形状有至少一个公共的边界点,但是没有内部点。


交叉(Crosses):


几何形状共享一些但不是所有的内部点。


内含(Within):


几何形状A的线都在几何形状B内部。


包含(Contains):


几何形状B的线都在几何形状A内部(区别于内含)


重叠(Overlaps):


几何形状共享一部分但不是所有的公共点,而且相交处有他们自己相同的区域。

package com.alibaba.autonavi;

import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;

/**
 * gemotry之间的关系
 * @author xingxing.dxx
 *
 */
public class GeometryRelated {

    private GeometryFactory geometryFactory = new GeometryFactory();

    /**
     *  两个几何对象是否是重叠的
     * @return
     * @throws ParseException
     */
    public boolean equalsGeo() throws ParseException{
        WKTReader reader = new WKTReader( geometryFactory );
        LineString geometry1 = (LineString) reader.read("LINESTRING(0 0, 2 0, 5 0)");
        LineString geometry2 = (LineString) reader.read("LINESTRING(5 0, 0 0)");
        return geometry1.equals(geometry2);//true
    }

    /**
     * 几何对象没有交点(相邻)
     * @return
     * @throws ParseException
     */
    public boolean disjointGeo() throws ParseException{
        WKTReader reader = new WKTReader( geometryFactory );
        LineString geometry1 = (LineString) reader.read("LINESTRING(0 0, 2 0, 5 0)");
        LineString geometry2 = (LineString) reader.read("LINESTRING(0 1, 0 2)");
        return geometry1.disjoint(geometry2);
    }

    /**
     * 至少一个公共点(相交)
     * @return
     * @throws ParseException
     */
    public boolean intersectsGeo() throws ParseException{
        WKTReader reader = new WKTReader( geometryFactory );
        LineString geometry1 = (LineString) reader.read("LINESTRING(0 0, 2 0, 5 0)");
        LineString geometry2 = (LineString) reader.read("LINESTRING(0 0, 0 2)");
        Geometry interPoint = geometry1.intersection(geometry2);//相交点
        System.out.println(interPoint.toText());//输出 POINT (0 0)
        return geometry1.intersects(geometry2);
    }

    /**
     * 判断以x,y为坐标的点point(x,y)是否在geometry表示的Polygon中
     * @param x
     * @param y
     * @param geometry wkt格式
     * @return
     */
    public boolean withinGeo(double x,double y,String geometry) throws ParseException {

        Coordinate coord = new Coordinate(x,y);
        Point point = geometryFactory.createPoint( coord );

        WKTReader reader = new WKTReader( geometryFactory );
        Polygon polygon = (Polygon) reader.read(geometry);
        return point.within(polygon);
    }
    /**
     * @param args
     * @throws ParseException
     */
    public static void main(String[] args) throws ParseException {
        GeometryRelated gr = new GeometryRelated();
        System.out.println(gr.equalsGeo());
        System.out.println(gr.disjointGeo());
        System.out.println(gr.intersectsGeo());
        System.out.println(gr.withinGeo(5,5,"POLYGON((0 0, 10 0, 10 10, 0 10,0 0))"));
    }

}
时间: 2024-10-29 10:46:22

JTS基本概念和使用的相关文章

java各种概念 Core Java总结

Base: OOA是什么?OOD是什么?OOP是什么?{ oo(object-oriented):基于对象概念,以对象为中心,以类和继承为构造机制,来认识,理解,刻画客观世界和设计,构建相应的软件系统的一门方法;本意----模拟人类的思维方式,使开发,维护,修改更加容易 - ooa(object-oriented analysis):强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是 对管理业务现状和方法的分析-------其实就是进一步对oo进行细化,初步得出

JTS(Geometry)(转)

原文链接:http://blog.csdn.net/cdl2008sky/article/details/7268577 空间数据模型(1).JTS Geometry model (2).ISO Geometry model (Geometry Plugin and JTS Wrapper Plugin)GeoTools has two implementations of these interfaces:Geometry Plugin a port of JTS 1.7 to the ISO

WPF 依赖属性概念

理解依赖属性 在 WPF 中变成相比较于 传统 Windows Forms 变成发生了较大的改变. 属性现在以一组服务的形式提供给开发人员. 这组服务就叫做属性系统. 由 WPF 属性系统所支持的属性成为依赖属性. 依赖属性的概念 WPF 在依赖属性中提供了标准属性无法提供的功能, 特性如下: 决定属性值: 依赖属性的属性值可以在运行时有其他元素或者是其他信息所决定, 决定的过程具有一个优先次序. 自动验证或变更通知: 依赖属性哟一个自定的回调方法, 当属性值变更时被执行, 这个回调能验证新的值

Docker的概念及剖析原理和特点

一.docker的简介: 应用容器是个啥样子呢,一个做好的应用容器长的就像一个装好了一组特定应用的虚拟机一样,比如我现在想用mysql数据库,我直接找个装好了的MySQL的容器就可以了,想用的时候一运行容器,MySQL服务就起来了,就可以使用MySQL了 为什么不能直接安装一个MySQL?或者是SqlServer呢也可以啊? 答:因为有的时候根据每个人的电脑的不同,在物理机安装的时候会出现各种各样的错误,突然你的机器中病毒了或者是挂了,你所有的服务都需要重新安装. 注意:    但是有了dock

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

Tensorflow一些常用基本概念与函数(四)

摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的模型训练Training与测试Testing等相关函数进行讲解.为'Tensorflow一些常用基本概念与函数'系列之四. 1.序言 本文所讲的内容主要为以下列表中相关函数.函数training()通过梯度下降法为最小化损失函数增加了相关的优化操作,在训练过程中,先实例化一个优化函数,比如 tf.train.GradientDescentOptimizer,并基于一定的学习率进行梯度优化训练: optimize

Tensorflow一些常用基本概念与函数(三)

摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的数据IO.图的运行等相关函数进行讲解.为'Tensorflow一些常用基本概念与函数'系列之三. 1.序言 本文所讲的内容主要为以下相关函数: 操作组 操作 Data IO (Python functions) TFRecordWrite,rtf_record_iterator Running Graphs Session management,Error classes 2.tf函数 2.1 数据IO {Da

数据结构基础概念

1.数据的特点:可以输入到计算机,可以被计算机程序处理 2.数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型.如:int float char等等 3.数据元素-组成数据的基本单位,数据项:一个数据元素由若干数据项组成 4.数据对象 -性质相同的数据元素的集合 5.数据元素之间不是独立的,存在特定的关系,这些关系即结构 6.数据结构指数据对象中数据元素之间的关系,编写一个"好"的程序之前,必须分析待处理问题中各个对象的特性,以及对象之间的关系 7.逻辑结构 集合结构--数据

Data guard概念篇一(转载)

本文转载至以下链接,感谢作者分享! http://tech.it168.com/db/2008-02-14/200802141545840_1.shtml 一.Data Guard配置(Data Guard Configurations) Data Guard是一个集合,由一个primary数据库(生产数据库)及一个或多个standby数据库(最多9个)组成.组成Data Guard的数据库通过Oracle Net连接,并且有可能分布于不同地域.只要各库之间可以相互通信,它们的物理位置并没有什么