GeoTools应用-(JTS Geometry Operations)(二)

2024-03-02 19:32

本文主要是介绍GeoTools应用-(JTS Geometry Operations)(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一些高级操作, Buffer,LineMerger,Polygonization,UnionLine,凹壳分析,Overlays

(1)、Buffer,返回的结果是一个Polygon或者 MultiPolygon

buffering is an operation which in GIS is used to compute the area containing all
points within a given distance of a Geometry.
You can use JTS to compute the buffer of a Geometry using the Geometry buffer method
or the BufferOp class. The input Geometry to the buffer operation may be of any type
(including arbitrary GeometryCollections).  The result of a buffer operation is always an area
type (Polygon or MultiPolygon)
.  The result may be empty (for example, a negative buffer
of a LineString).

GeometryFactory.java

[java] view plain copy print ?
  1. package com.mapbar.jst; 
  2.  
  3.  
  4. import com.vividsolutions.jts.geom.Geometry; 
  5. import com.vividsolutions.jts.io.ParseException; 
  6. import com.vividsolutions.jts.io.WKTReader; 
  7.  
  8. public class GeometryFactory { 
  9.      
  10.     private WKTReader reader; 
  11.      
  12.     private  GeometryFactory instance = null
  13.      
  14.     public static synchronized GeometryFactory getInstance(){ 
  15.         if(instance==null){ 
  16.             instance = new GeometryFactory(); 
  17.         } 
  18.         return instance; 
  19.     } 
  20.      
  21.     public void getReader(){ 
  22.         reader = new WKTReader(); 
  23.     } 
  24.      
  25.     public Geometry buildGeo(String str){ 
  26.         try
  27.             if(reader==null){ 
  28.                 reader = new WKTReader(); 
  29.             } 
  30.             return reader.read(str); 
  31.         } catch (ParseException e) { 
  32.             throw new RuntimeException("buildGeometry Error",e); 
  33.         } 
  34.     } 
  35.  
package com.mapbar.jst;import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;public class GeometryFactory {private WKTReader reader;private  GeometryFactory instance = null;public static synchronized GeometryFactory getInstance(){if(instance==null){instance = new GeometryFactory();}return instance;}public void getReader(){reader = new WKTReader();}public Geometry buildGeo(String str){try {if(reader==null){reader = new WKTReader();}return reader.read(str);} catch (ParseException e) {throw new RuntimeException("buildGeometry Error",e);}}}

Buffers.java

[java] view plain copy print ?
  1. package com.mapbar.jst; 
  2.  
  3. import com.vividsolutions.jts.geom.Geometry; 
  4. import com.vividsolutions.jts.operation.buffer.BufferOp; 
  5.  
  6. public class Buffers { 
  7.  
  8.     private GeometryFactory factory = GeometryFactory.getInstance(); 
  9.  
  10.     public Geometry buildGeo(String str) { 
  11.         return factory.buildGeo(str); 
  12.     } 
  13.  
  14.     public static void main(String[] args) { 
  15.         Buffers bs = new Buffers(); 
  16.         String line1 = "LINESTRING (0 0, 1 1, 2 2,3 3)"
  17.         Geometry g1 = bs.buildGeo(line1); 
  18.         //方式(一) 
  19.         Geometry g = g1.buffer(2); 
  20.  
  21.         方式(二) BufferOP 
  22.         BufferOp bufOp = new BufferOp(g1); 
  23.         bufOp.setEndCapStyle(BufferOp.CAP_BUTT); 
  24.         Geometry bg = bufOp.getResultGeometry(2); 
  25.     } 
package com.mapbar.jst;import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.operation.buffer.BufferOp;public class Buffers {private GeometryFactory factory = GeometryFactory.getInstance();public Geometry buildGeo(String str) {return factory.buildGeo(str);}public static void main(String[] args) {Buffers bs = new Buffers();String line1 = "LINESTRING (0 0, 1 1, 2 2,3 3)";Geometry g1 = bs.buildGeo(line1);//方式(一)Geometry g = g1.buffer(2);方式(二) BufferOPBufferOp bufOp = new BufferOp(g1);bufOp.setEndCapStyle(BufferOp.CAP_BUTT);Geometry bg = bufOp.getResultGeometry(2);}
}

注意:bufOp.setEndCapStyle 缓冲样式的设置,总共有三种CAP_ROUND,CAP_BUTT,CAP_SQUARE 对应如下三种情况

(2)、Polygonization 面处理类

Polygonization is the process of forming polygons from linework which
encloses areas. Linework to be formed into polygons must be fully noded –
that is, linestrings must not cross and must touch only at endpoints.
  JTS provides the Polygonizer class to perform Polygonization. The Polygonizer
takes a set of fully noded LineStrings and forms all the polygons which are
enclosed by the lines. Polygonization errors such as dangling lines or cut
lines can be identified and reported.

Polygonization.java

[java] view plain copy print ?
  1. package com.mapbar.jst; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.List; 
  5. import java.util.Collection; 
  6.  
  7. import com.vividsolutions.jts.geom.Geometry; 
  8. import com.vividsolutions.jts.operation.polygonize.Polygonizer; 
  9.  
  10. public class Polygonization { 
  11.  
  12.     private static GeometryFactory factory = GeometryFactory.getInstance(); 
  13.  
  14.     public static void main(String[] args) { 
  15.         List<Geometry> list = new ArrayList<Geometry>(); 
  16.         list.add(factory.buildGeo("LINESTRING (0 0,1 1)"));  
  17.         list.add(factory.buildGeo("LINESTRING (6 3,6 10)")); 
  18.         list.add(factory.buildGeo("LINESTRING (2 2,4 4,6 3)")); 
  19.         list.add(factory.buildGeo("LINESTRING (2 2,5 1,6 3)")); 
  20.         list.add(factory.buildGeo("LINESTRING (6 3,6 4)")); 
  21.         list.add(factory.buildGeo("LINESTRING (9 5,7 1,6 4)")); 
  22.         list.add(factory.buildGeo("LINESTRING (9 5,8 8,6 4)")); 
  23.         Polygonizer p = new Polygonizer(); 
  24.         p.add(list); 
  25.         Collection<Geometry> polys = p.getPolygons(); //面 
  26.         Collection<Geometry> dangles = p.getDangles();//悬挂线 
  27.         Collection<Geometry> cuts = p.getCutEdges(); //面和面的连接线 
  28.         System.out.println(polys.size()+":"+polys.toString()); 
  29.         System.out.println(dangles.size()+":"+dangles.toString()); 
  30.         System.out.println(cuts.size()+":"+cuts.toString()); 
  31.     } 
package com.mapbar.jst;import java.util.ArrayList;
import java.util.List;
import java.util.Collection;import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.operation.polygonize.Polygonizer;public class Polygonization {private static GeometryFactory factory = GeometryFactory.getInstance();public static void main(String[] args) {List<Geometry> list = new ArrayList<Geometry>();list.add(factory.buildGeo("LINESTRING (0 0,1 1)")); list.add(factory.buildGeo("LINESTRING (6 3,6 10)"));list.add(factory.buildGeo("LINESTRING (2 2,4 4,6 3)"));list.add(factory.buildGeo("LINESTRING (2 2,5 1,6 3)"));list.add(factory.buildGeo("LINESTRING (6 3,6 4)"));list.add(factory.buildGeo("LINESTRING (9 5,7 1,6 4)"));list.add(factory.buildGeo("LINESTRING (9 5,8 8,6 4)"));Polygonizer p = new Polygonizer();p.add(list);Collection<Geometry> polys = p.getPolygons(); //面Collection<Geometry> dangles = p.getDangles();//悬挂线Collection<Geometry> cuts = p.getCutEdges(); //面和面的连接线System.out.println(polys.size()+":"+polys.toString());System.out.println(dangles.size()+":"+dangles.toString());System.out.println(cuts.size()+":"+cuts.toString());}
}

输出结果:

2:[POLYGON ((2 2, 4 4, 6 3, 5 1, 2 2)), POLYGON ((6 4, 8 8, 9 5, 7 1, 6 4))]
2:[LINESTRING (6 3, 6 10), LINESTRING (0 0, 1 1)]
1:[LINESTRING (6 3, 6 4)]

(3)、LineMerger 线路合并,线路之间不能有交点,并且只在线路末尾有公共交点

Sometimes a spatial operation such as #union will produce
chains of small LineStrings. The JTS LineMerger is a simple utility
to sew these small LineStrings together. NOTE:they do not cross; only
their endpoints can touch. If LineStrings to be merged do not have
the same direction, the direction of the resulting LineString will be
that of the majority.

MergerLine.java

[java] view plain copy print ?
  1. package com.mapbar.jst; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.Collection; 
  5. import java.util.List; 
  6.  
  7. import com.vividsolutions.jts.geom.Geometry; 
  8. import com.vividsolutions.jts.operation.linemerge.LineMerger; 
  9.  
  10. public class MergerLine { 
  11.  
  12.     private static GeometryFactory factory = GeometryFactory.getInstance(); 
  13.  
  14.     public static void main(String[] args) { 
  15.         LineMerger lineMerger = new LineMerger(); 
  16.         List<Geometry> list = new ArrayList<Geometry>(); 
  17.         list.add(factory.buildGeo("LINESTRING (3 3,2 2,0 0)")); 
  18.         list.add(factory.buildGeo("LINESTRING (3 3,6 6,0 10)")); 
  19.         list.add(factory.buildGeo("LINESTRING (0 10,3 1,10 1)")); 
  20.         lineMerger.add(list); 
  21.         Collection<Geometry> mergerLineStrings = lineMerger.getMergedLineStrings(); 
  22.         for (Geometry g : mergerLineStrings) { 
  23.             System.out.println(g.toText()); 
  24.         } 
  25.     } 
package com.mapbar.jst;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.operation.linemerge.LineMerger;public class MergerLine {private static GeometryFactory factory = GeometryFactory.getInstance();public static void main(String[] args) {LineMerger lineMerger = new LineMerger();List<Geometry> list = new ArrayList<Geometry>();list.add(factory.buildGeo("LINESTRING (3 3,2 2,0 0)"));list.add(factory.buildGeo("LINESTRING (3 3,6 6,0 10)"));list.add(factory.buildGeo("LINESTRING (0 10,3 1,10 1)"));lineMerger.add(list);Collection<Geometry> mergerLineStrings = lineMerger.getMergedLineStrings();for (Geometry g : mergerLineStrings) {System.out.println(g.toText());}}
}

输出结果:LINESTRING (0 0, 2 2, 3 3, 6 6, 0 10, 3 1, 10 1)

lineMerger 和union区别,union可以在两条相交的线中生成交点(noded)

(4)、union 线路合并,并且生成交叉点。

The noding process splits LineStrings that cross into smaller LineStrings  that meet at a point, or node

[java] view plain copy print ?
  1. package com.mapbar.jst; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.List; 
  5.  
  6. import com.vividsolutions.jts.geom.Geometry; 
  7.  
  8. public class UnionLine { 
  9.  
  10.     private static GeometryFactory factory = GeometryFactory.getInstance(); 
  11.  
  12.     public static void main(String[] args) { 
  13.         List<Geometry> list = new ArrayList<Geometry>(); 
  14.         list.add(factory.buildGeo("LINESTRING (10 10,2 2,0 0)")); 
  15.         list.add(factory.buildGeo("LINESTRING (10 0,6 6,0 10)")); 
  16.         list.add(factory.buildGeo("LINESTRING (1 1,3 1,10 1)")); 
  17.         Geometry nodedLine = list.get(0); 
  18.         for (int i = 1; i < list.size(); i++) { 
  19.             nodedLine = nodedLine.union(list.get(i)); 
  20.         } 
  21.         int num = nodedLine.getNumGeometries(); 
  22.         for (int j = 0; j < num; j++) { 
  23.             Geometry eachG = nodedLine.getGeometryN(j); 
  24.             System.out.println(eachG.toText()); 
  25.         } 
  26.     } 
package com.mapbar.jst;import java.util.ArrayList;
import java.util.List;import com.vividsolutions.jts.geom.Geometry;public class UnionLine {private static GeometryFactory factory = GeometryFactory.getInstance();public static void main(String[] args) {List<Geometry> list = new ArrayList<Geometry>();list.add(factory.buildGeo("LINESTRING (10 10,2 2,0 0)"));list.add(factory.buildGeo("LINESTRING (10 0,6 6,0 10)"));list.add(factory.buildGeo("LINESTRING (1 1,3 1,10 1)"));Geometry nodedLine = list.get(0);for (int i = 1; i < list.size(); i++) {nodedLine = nodedLine.union(list.get(i));}int num = nodedLine.getNumGeometries();for (int j = 0; j < num; j++) {Geometry eachG = nodedLine.getGeometryN(j);System.out.println(eachG.toText());}}
}


(5)、凹壳分析  包含几何形体的所有点的最小凸壳多边形(外包多边形)



(6)、叠加操作  叠加可以用来确定任何几何图形的布尔组合。
The overlay can be used to determine any boolean combination of the geometries.
通过对两个数据进行的一系列集合运算,产生新数据的过程。叠加分析的目的就是通过对空间数据的加工或分析,提取用户需要的新的空间几何信息。
叠加分析类型包括:
交叉分析(Intersection) 交叉操作就是多边形AB中所有共同点的集合。
联合分析(Union) AB的联合操作就是AB所有点的集合。
差异分析(Difference) AB形状的差异分析就是A里有B里没有的所有点的集合。
对称差异分析(SymDifference) AB形状的对称差异分析就是位于A中或者B中但不同时在AB中的所有点的集合

[java] view plain copy print ?
  1. public void overlaps() throws ParseException, FileNotFoundException{ 
  2.     WKTReader reader = new WKTReader(geometryFactory); 
  3.     Polygon geometry1 = (Polygon) reader.read("POLYGON((0 0, 2 0 ,2 2, 0 2,0 0))"); 
  4.     Polygon geometry2 = (Polygon) reader.read("POLYGON((0 0, 4 0 , 4 1, 0 1, 0 0))"); 
  5.     OverlayOp op = new OverlayOp(geometry1,geometry2); 
  6.     Geometry g =op.getResultGeometry(OverlayOp.INTERSECTION);//POLYGON ((2 0, 0 0, 0 1, 2 1, 2 0)) 
  7.     Geometry g2 = op.getResultGeometry(OverlayOp.UNION); 
  8.     Geometry g3 = op.getResultGeometry(OverlayOp.DIFFERENCE); 
  9.     Geometry g4 = op.getResultGeometry(OverlayOp.SYMDIFFERENCE); 
  10.     PlanarGraph p = op.getGraph(); //图<v,e> 
	public void overlaps() throws ParseException, FileNotFoundException{WKTReader reader = new WKTReader(geometryFactory);Polygon geometry1 = (Polygon) reader.read("POLYGON((0 0, 2 0 ,2 2, 0 2,0 0))");Polygon geometry2 = (Polygon) reader.read("POLYGON((0 0, 4 0 , 4 1, 0 1, 0 0))");OverlayOp op = new OverlayOp(geometry1,geometry2);Geometry g =op.getResultGeometry(OverlayOp.INTERSECTION);//POLYGON ((2 0, 0 0, 0 1, 2 1, 2 0))Geometry g2 = op.getResultGeometry(OverlayOp.UNION);Geometry g3 = op.getResultGeometry(OverlayOp.DIFFERENCE);Geometry g4 = op.getResultGeometry(OverlayOp.SYMDIFFERENCE);PlanarGraph p = op.getGraph(); //图<v,e>}

这篇关于GeoTools应用-(JTS Geometry Operations)(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767197

相关文章

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2