geotools中泰森多边形的生成

概述
本文讲述如何在中生成泰森多边形 , 并shp输出 。
泰森多边形
1、定义
泰森多边形又叫冯洛诺伊图( ) , 得名于  , 是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成 。
2、建立步骤
建立泰森多边形算法的关键是对离散数据点合理地连成三角网 , 即构建三角网 。建立泰森多边形的步骤为:
1)离散点自动构建三角网 , 即构建三角网 。对离散点和形成的三角形编号 , 记录每个三角形是由哪三个离散点构成的 。
2)找出与每个离散点相邻的所有三角形的编号 , 并记录下来 。这只要在已构建的三角网中找出具有一个相同顶点的所有三角形即可 。
3)对与每个离散点相邻的三角形按顺时针或逆时针方向排序 , 以便下一步连接生成泰森多边形 。设离散点为o 。找出以o为顶点的一个三角形 , 设为A;取三角形A除o以外的另一顶点 , 设为a , 则另一个顶点也可找出 , 即为f;则下一个三角形必然是以of为边的 , 即为三角形F;三角形F的另一顶点为e , 则下一三角形是以oe为边的;如此重复进行 , 直到回到oa边 。
【geotools中泰森多边形的生成】4)计算每个三角形的外接圆圆心 , 并记录之 。
5)根据每个离散点的相邻三角形 , 连接这些相邻三角形的外接圆圆心 , 即得到泰森多边形 。对于三角网边缘的泰森多边形 , 可作垂直平分线与图廓相交 , 与图廓一起构成泰森多边形 。
3、特征
1)每个泰森多边形内仅含有一个离散点数据;
2)泰森多边形内的点到相应离散点的距离最近;
3)位于泰森多边形边上的点到其两边的离散点的距离相等 。
中的生成
1、创建测试点

geotools中泰森多边形的生成

文章插图
int xmin = 0, xmax=180;int ymin = 0, ymax=90;Random random = new Random();List geomsPoints = new ArrayList();for(int i=0;i<100;i++){int x = random.nextInt(xmax)%(xmax-xmin+1) + xmin,y = random.nextInt(ymax)%(ymax-ymin+1) + ymin;Coordinate coord = new Coordinate(x,y,i);coords.add(coord);clipEnvelpoe.expandToInclude(coord);geomsPoints.add(new GeometryFactory().createPoint(coord));}
2、生成泰森多边形
geotools中泰森多边形的生成

文章插图
voronoiDiagramBuilder.setSites(coords);voronoiDiagramBuilder.setClipEnvelope(clipEnvelpoe);Geometry geom = voronoiDiagramBuilder.getDiagram(JTSFactoryFinder.getGeometryFactory());List geoms = new ArrayList();for(int i=0;i
完整代码如下:
package com.lzugis.geotools;import java.io.File;import java.io.Serializable;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;import org.geotools.data.FeatureWriter;import org.geotools.data.Transaction;import org.geotools.data.shapefile.ShapefileDataStore;import org.geotools.data.shapefile.ShapefileDataStoreFactory;import org.geotools.feature.simple.SimpleFeatureTypeBuilder;import org.geotools.geometry.jts.JTSFactoryFinder;import org.geotools.referencing.crs.DefaultGeographicCRS;import org.opengis.feature.simple.SimpleFeature;import org.opengis.feature.simple.SimpleFeatureType;import com.vividsolutions.jts.geom.Coordinate;import com.vividsolutions.jts.geom.Envelope;import com.vividsolutions.jts.geom.Geometry;import com.vividsolutions.jts.geom.GeometryFactory;import com.vividsolutions.jts.geom.Point;import com.vividsolutions.jts.geom.Polygon;import com.vividsolutions.jts.triangulate.VoronoiDiagramBuilder;public class TsdbxTest {static TsdbxTest tsdbx = new TsdbxTest();public void voronoiTest(){VoronoiDiagramBuilder voronoiDiagramBuilder = new VoronoiDiagramBuilder();List