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

相关文章

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储