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

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.