【JTS】JTS空间拓扑关系的测试

在JTS中有九种拓扑关系函数,touches、covers、within、crosses、intersects、disjoint、equals、overlaps、contains、coveredBy。
对于线,环,多边形这三种各有不同的特点,线不闭合,环是闭合的,多边形是一种面状。三者分别对应JTS中的LineString、LinearRing、Polygon。

JTS的jar包和开发文档下载地址:
JTS 1.14

下面我们用JTS做个拓扑关系的测试。

代码如下:

package test;

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

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequence;

public class Test {
    /**
     * 实验说明,LinearRing是线,polygon是多边形,线内部和多边形内部不一样,线的子集是在线上,也是内部(within),多边形是面
     * @param args
     */
    public static void main(String[] args) {
        Coordinate[] coor_arr1=new Coordinate[5];
//      coor_arr1[0]=new Coordinate(114.254398, 30.665175);
//      coor_arr1[1]=new Coordinate(114.254398, 30.525956);
//      coor_arr1[2]=new Coordinate(114.392427, 30.525956);
//      coor_arr1[3]=new Coordinate(114.392427, 30.665175);
//      coor_arr1[4]=new Coordinate(114.254398, 30.665175);
        coor_arr1[0]=new Coordinate(114.254398, 30.665175);
        coor_arr1[1]=new Coordinate(114.392427, 30.665175);
        coor_arr1[2]=new Coordinate(114.392427, 30.525956);
        coor_arr1[3]=new Coordinate(114.254398, 30.525956);
        coor_arr1[4]=new Coordinate(114.254398, 30.665175);
        CoordinateArraySequence seq=new CoordinateArraySequence(coor_arr1);
        LinearRing ring = new LinearRing(seq, new GeometryFactory());
        String string="114.254398 30.665175, 114.392427 30.665175";
//      String string="114.287 30.5964, 114.2877 30.5971, 114.2885 30.5979, 114.2894 30.5988, 114.2912 30.6002, 114.292 30.6009, 114.2925 30.6013, 114.2942 30.6028, 114.2949 30.6032, 114.296 30.6046, 114.2971 30.6059, 114.2975 30.6065, 114.298 30.6072, 114.2985 30.608, 114.2991 30.6089";
        String[] arr=string.split(", ");
        List<Coordinate> coors=new ArrayList<>();
        for(String temp:arr){
            String[] xy=temp.split(" ");
            Coordinate coor=new Coordinate(Double.parseDouble(xy[0]), Double.parseDouble(xy[1]));
            coors.add(coor);
        }
        Coordinate[] coor_arr=coors.toArray(new Coordinate[0]);
        LineString l_s=new GeometryFactory().createLineString(coor_arr);
//      Polygon poly=new Polygon(ring, null, new GeometryFactory());
//      System.out.println(poly.contains(l_s));
//      System.out.println(poly.touches(l_s));
//      System.out.println(poly.covers(l_s));
//      System.out.println(poly.within(l_s));
//      System.out.println(poly.crosses(l_s));
//      System.out.println(poly.intersects(l_s));
//      System.out.println(poly.equals(l_s));
//      System.out.println(poly.overlaps(l_s));
//      System.out.println(poly.coveredBy(l_s));
        System.out.println("-----------------");
        System.out.println(l_s.touches(ring));
        System.out.println(l_s.covers(ring));
        System.out.println(l_s.within(ring));
        System.out.println(l_s.crosses(ring));
        System.out.println(l_s.intersects(ring));
        System.out.println(l_s.disjoint(ring));
        System.out.println(l_s.equals(ring));
        System.out.println(l_s.overlaps(ring));
        System.out.println(l_s.contains(ring));
        System.out.println(l_s.coveredBy(ring));
        System.out.println("---------");
        System.out.println(ring.touches(l_s));
        System.out.println(ring.covers(l_s));
        System.out.println(ring.within(l_s));
        System.out.println(ring.crosses(l_s));
        System.out.println(ring.intersects(l_s));
        System.out.println(ring.disjoint(l_s));
        System.out.println(ring.equals(l_s));
        System.out.println(ring.overlaps(l_s));
        System.out.println(ring.contains(l_s));
        System.out.println(ring.coveredBy(l_s));
        System.out.println(ring.relate(l_s));
//      LINEARRING (114.254398 30.665175, 114.254398 30.525956, 114.392427 30.525956, 114.392427 30.665175, 114.254398 30.665175)
//      LINESTRING (114.3013 30.5228, 114.3026 30.5233, 114.3042 30.5246, 114.305 30.5261, 114.3058 30.5265, 114.3069 30.5266, 114.3083 30.5268, 114.3091 30.5261, 114.3104 30.525, 114.311 30.5242, 114.312 30.5234, 114.313 30.523, 114.3144 30.5226, 114.3156 30.5224, 114.3163 30.5221, 114.3168 30.522, 114.3176 30.522, 114.3181 30.5217)
    }

}

从上面的测试可以得出一个结论,就是LinearRing和Polygon是不同的。一个是线,一个是面。

假如有以下数据:
LineString类型的数据A、LinearRing类型的数据B、Polygon类型的数据C 以及 落在B上的线D(完全落在,属于子集关系)。
其中,B和C除了一个是线,一个是面之外,边界完全重合,A是落在B和C内部的。

那么通过上面的代码测试,可以知道
A.within(B)结果为false,A.within(C)结果为true,D.within(B)结果为true。
也就是说,线是within面内部的,但不是within一个线组成的环内部的(即使该线空间坐标是落在里面的)。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值